많은 개발자가 코드를 테스트할 때 어려움에 직면합니다. 적절한 테스트가 없으면 버그가 빠져나가 사용자가 불만을 느끼고 수정 비용이 많이 들 수 있습니다.
이 기사에서는 Node.js 및 MongoDB를 사용하여 구축된 매우 간단한 예제에서 Jest, Supertest 및 Puppeteer를 사용하여 단위, 통합 및 엔드투엔드 테스트를 효과적으로 적용하는 방법을 보여줍니다.
이 기사를 마치면서 이러한 유형의 테스트를 자신의 프로젝트에 적용하는 방법을 명확하게 이해하게 되기를 바랍니다.
?? 이 저장소에서 전체 예를 찾아보세요.
종속성을 설치하기 전에 먼저 예제를 소개하겠습니다. 이는 사용자가 등록 페이지를 열고, 등록 세부 정보를 설정하고, 등록 버튼을 클릭하고, 해당 정보를 데이터베이스에 저장할 수 있는 매우 간단한 예입니다.
이 예에서는 다음 패키지를 사용합니다.
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
이러한 종속성은 대부분 간단하지만 몇 가지에 대한 설명은 다음과 같습니다.
좋습니다. 이것을 코드로 번역해 보겠습니다.
예측할 수 없는 동작 없이 단위 테스트를 실행하려면 모든 테스트 전에 모의 기능을 재설정해야 합니다. beforeEach 후크를 사용하여 이를 달성할 수 있습니다.
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
이 경우에는 verifyInput 함수를 테스트하고 싶습니다.
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
제공된 입력에 유효한 이메일이 포함되어 있는지 확인하는 매우 간단한 기능입니다. 단위 테스트는 다음과 같습니다.
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
await Expect(async () => {}).rejects: Jest 문서에 따르면 이는 Promise 거부의 이유를 예상하는 방법입니다.
데이터베이스에 중복된 이메일이 있는지 확인하는 또 다른 기능을 테스트해 보겠습니다. 사실 이것은 데이터베이스를 다루어야 하고 동시에 단위 테스트가 외부 시스템을 다루어서는 안 되기 때문에 흥미롭습니다. 그렇다면 우리는 어떻게 해야 할까요? 글쎄, 우리는 Mocks를 사용해야 합니다.
먼저 테스트해야 하는 emailShouldNotBeDuplicated 함수를 살펴보세요.
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
보시다시피 이 함수는 동일한 이메일을 가진 다른 사용자가 있는지 확인하기 위해 데이터베이스에 요청을 보냅니다. 데이터베이스 호출을 모의하는 방법은 다음과 같습니다.
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
모의 함수를 생성하고 해당 호출을 추적하는 jest.spyOn(object, methodName)을 사용하여 데이터베이스 findOne 메서드를 모의(스파이)했습니다. 결과적으로 toHaveBeenNthCalledWith를 사용하여 염탐된 findOne 메소드의 호출 수와 전달된 매개변수를 추적할 수 있습니다.
통합 테스트를 작성하기 전에 환경을 구성해야 합니다.
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
이제 통합 테스트를 실행할 준비가 되었습니다.
등록 요청 전송부터 데이터베이스에 사용자 세부정보 저장, 성공 페이지로 리디렉션까지 전체 서버측 등록 프로세스를 테스트해 보겠습니다.
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
보시다시피,registerController 함수는 여러 구성 요소(함수), verifyInput, emailShouldNotBeDuplicated 및 createUser 함수를 통합합니다.
이제 통합 테스트를 작성해 보겠습니다.
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
예제를 살펴보겠습니다.
실제로 이 예에서는 엔드 투 엔드 테스트를 위한 환경 구성이 통합 테스트의 환경 구성과 유사합니다.
이 경우 등록 페이지 열기, 세부 정보(이름, 이메일, 비밀번호) 입력, '등록' 버튼 클릭, 마지막으로 성공 페이지로 리디렉션되는 실제 사용자 등록 동작을 정확하게 시뮬레이션해야 합니다. . 코드를 살펴보세요:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
이 코드를 분석해 보겠습니다.
Unsplash의 Nathan Dumlao 사진
이 시점에서는 각각 고유한 구성이 있는 모든 테스트 유형을 동시에 실행하는 방법이 궁금할 것입니다. 예:
그렇다면 각 테스트 유형이 해당 구성을 준수하는지 확인하면서 동시에 모든 테스트 유형을 실행할 수 있는 방법은 무엇일까요?
이 문제를 해결하려면 다음 단계를 따르세요.
1. 세 가지 구성 파일인 jest.unit.config.js를 만들어 보겠습니다.
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
jest.integration.config.js:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
jest.e2e.config.js:
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
2. 다음으로 package.json 파일에서 npm 스크립트를 다음과 같이 업데이트하세요.
// register.controller.js const { User } = require('../models/user'); const registerController = async (input) => { ... await emailShouldNotBeDuplicated(input.email); ... }; const emailShouldNotBeDuplicated = async (email) => { const anotherUser = await User.findOne({ email }); if (anotherUser) throw new Error('Duplicated email'); };
--config: Jest 구성 파일의 경로를 지정합니다.
npm-run-all --parallel: 모든 테스트를 병렬로 실행할 수 있습니다.
3. 그런 다음 이전 섹션에서 사용한 필수 설정 코드가 포함된 setup.unit.js, setup.integration.js 및 setup.e2e.js라는 세 개의 설정 파일을 만듭니다.
4. 마지막으로 npm run test 명령을 실행하여 모든 테스트를 실행합니다. 이 명령은 해당 구성에 따라 모든 단위, 통합 및 엔드투엔드 테스트를 병렬로 실행합니다.
이 기사에서는 단위, 통합 및 E2E(엔드 투 엔드) 테스트를 살펴보며 안정적인 애플리케이션 구축에 대한 중요성을 강조했습니다. Node.js 및 MongoDB를 사용한 간단한 사용자 등록 예제에서 Jest, Supertest 및 Puppeteer를 사용하여 이러한 테스트 방법을 구현하는 방법을 시연했습니다.
실제로 탄탄한 테스트 전략은 코드 품질을 향상시킬 뿐만 아니라 개발자의 자신감과 사용자 만족도도 높여줍니다.
이 기사가 귀하의 프로젝트에 적용할 수 있는 유용한 통찰력을 제공하였기를 바랍니다. 즐거운 테스트 되세요!
이 기사가 유용했다면 다음 기사도 확인해 보세요.
지금까지 함께해주셔서 정말 감사드립니다. 이 글을 재미있게 읽어주시길 바랍니다.
위 내용은 Jest를 사용한 한 예제의 단위, 통합 및 ETesting의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!