먼저 특강을 들었는데 이해가 되지않는 부분도 있어서 우선 저번에 실수로 나눠주신 강의에 있는 테스트코드 강의를 듣고 있습니다.
일단 jest를 설치 후 package.json파일에서 scripts부분 test를 수정해줬습니다.
npm init -y
npm i jest -D
변경 전 package.json
{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
...
}
변경 후 package.json
{
...
"scripts": {
"test": "jest"
},
...
}
그리고 단위테스트를 하기 위해 아래와 같이 작성해주고 터미널에 npm run test를 해주었습니다.
// validation.js
module.exports = {
isEmail: (value) => {
const email = value || "";
const [localPart, domain, ...etc] = email.split("@");
if (!localPart || !domain || etc.length !== 0) {
return false;
} else if (email.includes(" ")) {
return false;
} else if (email[0] === "-") {
return false;
} else if (!/^[a-z0-9+_-]+$/gi.test(localPart)) {
return false;
} else if (!/^[a-z0-9.-]+$/gi.test(domain)) {
return false;
}
return true;
},
};
const { isEmail } = require("./validation");
test('입력한 이메일 주소에는 "@" 문자가 1개만 있어야 이메일 형식이다.', () => {
expect(isEmail("sparta84@gmail.com")).toEqual(true);
expect(isEmail("sparta84@@@gmail.com")).toEqual(false);
expect(isEmail("sparta84gmail.com")).toEqual(false);
});
test("입력한 이메일 주소에 공백(스페이스)이 존재하면 이메일 형식이 아니다.", () => {
expect(isEmail("sparta74@gmail.com")).toEqual(true);
expect(isEmail("sparta 74@gmail.com")).toEqual(false);
expect(isEmail("sparta74@gma il.com")).toEqual(false);
});
test("입력한 이메일 주소 맨 앞에 하이픈(-)이 있으면 이메일 형식이 아니다.", () => {
expect(isEmail("sparta94@gmail.com")).toEqual(true);
expect(isEmail("-sparta94@gmail.com")).toEqual(false);
expect(isEmail("-----sparta94@gmail.com")).toEqual(false);
expect(isEmail("sp-arta94-@gma-il.--com")).toEqual(true);
});
test("입력한 이메일 주소중, 로컬 파트(골뱅이 기준 앞부분)에는 영문 대소문자와 숫자, 특수문자는 덧셈기호(+), 하이픈(-), 언더바(_) 3개 외에 다른 값이 존재하면 이메일 형식이 아니다.", () => {
expect(isEmail("sparta@gmail.com")).toEqual(true);
expect(isEmail("sp.a/||/r,ta@gmail.com")).toEqual(false);
expect(isEmail(";sp:==arta@gmail.com")).toEqual(false);
expect(isEmail("spa()r[]t{}a@gmail.com")).toEqual(false);
});
test("입력한 이메일 주소중, 도메인(골뱅이 기준 뒷부분)에는 영문 대소문자와 숫자, 점(.), 하이픈(-) 외에 다른 값이 존재하면 이메일 형식이 아니다.", () => {
expect(isEmail("sparta@gmail.com")).toEqual(true);
expect(isEmail("sparta@gm[]ail.com")).toEqual(false);
expect(isEmail("sparta@gmai;;;.,l.com")).toEqual(false);
expect(isEmail("sparta@gma()====il.c[]{}om")).toEqual(false);
});
이번에는 저희가 route에서만 구현한것이아닌 controller, service, repository등으로 나눴을때 각각의 테스트코드를 구현해보려고 합니다.
저는 강의와 맞춰 아래 파일을 다운받았습니다.
https://hanghae99-node-example.s3.ap-northeast-2.amazonaws.com/layered-architecture-pattern-test-code-template.zip
위 파일을 열고 나서 jest와 supertest 모듈을 설치해줬습니다.
npm i jest supertest -D
그다음 제일 바깥에서 jest.config.js 파일을 생성해주고 아래 코드를 입력해줬습니다.
// jest.config.js
module.exports = {
// 해당 패턴에 일치하는 경로가 존재할 경우 테스트를 하지 않고 넘어갑니다.
"testPathIgnorePatterns": ["/node_modules/"],
// 테스트 실행 시 각 TestCase에 대한 출력을 해줍니다.
verbose: true,
}
package.json 파일에서 Jest CLI 옵션을 추가한 jest script를 선언해보도록 하겠습니다.
// package.json
{
...
"scripts": {
...
"test": "NODE_ENV=test jest --forceExit",
"test:silent": "NODE_ENV=test jest --silent --forceExit",
"test:coverage": "NODE_ENV=test jest --coverage --forceExit",
"test:unit": "NODE_ENV=test jest __tests__/unit --forceExit",
"test:integration": "NODE_ENV=test jest __tests__/integration --forceExit"
},
...
}
// package.json
{
...
"scripts": {
...
"test": "jest --forceExit",
"test:silent": "jest --silent --forceExit",
"test:coverage": "jest --coverage --forceExit",
"test:unit": "jest __tests__/unit --forceExit",
"test:integration": "jest __tests__/integration --forceExit"
},
...
}
Jest CLI란?
Jest CLI는 여러분들이 테스트 코드를 검사할 때 추가적인 옵션을 설정하여 원하는 결과값을 도출할 수 있도록 만들어줍니다. 예를 들어서 테스트 코드의 실시간 모니터링을 진행하거나, 결과값을 별도의 파일로 생성하거나, 테스트 코드의 커버리지를 확인하는 등 다양한 옵션을 설정할 수 있습니다.
--forceExit
app
객체와 Sequelize 연결이 Connect
상태로 남아있어 테스트 코드가 종료되지 않을 때 사용합니다.--silent
--coverage
--verbose
특강 ci, cd도 들어야할거 같아서 수업은 1-24(수업자료에서는 목차 04)까지만 들었습니다.
ci/cd, github actions 특강을 듣는데 바로 따라하기에는 무서워서 일단 전체적으로 영상을 확인했습니다.
내일 시간이 된다면 직접 처음부터 하나씩 해보고싶습니다.
그리고 nestjs 수업을 다시 한번 더 들어봐야할거 같습니다.
CI/CD, Github Actions 특강
aws 배포 참고
참고 자료
테스트 코드 수업 자료