테스트 코드가 무엇인지 어떤 종류가 있는지는 지난 포스팅에서 언급했기 때문에 이번엔 실제 그 테스트 코드를 작성하는 방법과 어떻게 코드를 짜야하는지에 대해서 알아보겠다.
간단하게 정의만 집고 가자면
테스트 코드란
작성한 코드에 문제가 없는지 테스트하기 위해 작성하는 코드
테스트 코드의 종류
- 단위 테스트(유닛 테스트)
가장 작은 규모의 기능을 테스트
- 통합 테스트
여러 가지 기능을 합쳤을 때 생시는 문제를 방지하기 위한 테스트
- E2E 테스트(end-to-end 테스트)
백앤드부터 시작해서 최종적으로 웹페이지가 원하는 대로 동작하며 원하는 데이터를 잘 보여주는지 확인
jest란
jest란 페이스북에서 만들어서 리액트와 더불어 많은 js 개발자들이 사용하고 있는 테스팅 라이브러리이다.
주로 단위 테스트에서 사용되고, 통합 테스트는 supertest라는 라이브러리를 사용한다.
jest 설치 및 세팅
1. 설치
npm i jest -D
개발환경에서만 사용하기 때문에 -D를 붙여준다.
2. 스크립트 변경
// package.json 파일
"scripts": {
"test": "jest",
"coverage": "jest --coverage"
},
package.json 파일의 중간에 스크립트 안에 test를 부분을 위와 같이 바꾸어준다.
3. 파일 생성
test파일을 만들 땐, 검증할 파일명.test.js 로 만든다. 혹은 검증할 파일명.spec.js
4. 테스트 코드 작성
// 예시
describe('계산 테스트', () => {
const a = 1, b = 2;
test('a + b는 3이다.', () => {
expect(a + b).toEqual(3);
});
});
5. 터미널 실행
npm test
터미널에서 위와 같이 테스트를 시작할 수 있다.
모킹 mocking
테스트하고자 하는 코드의 함수나 클래스에 대해 모조품을 만들어 일단 돌아가게 하는 것이다.
단위 테스트를 작성할 때 해당 코드가 의존하는 부분을 가짜로 대체하는 기법이다.
테스트를 진행 함에 있어 실제로 기능의 함수들을 그대로 테스트하거나, 데이터베이스에 접근하는 것은 복잡하고, 위험한 일이 될 수 있다.
그래서 (했다 치고 함수), 모킹 함수를 만들어서 가짜로 대체한다.
정리)
1) 테스트할 함수 안에, 데이터베이스를 넣는 메서드 로직이 있다고 가정하자.
2) 우리가 테스트할 것은 데이터베이스에 잘 넣어졌는지 아닌지 검증하는 게 아니다.
3) 따라서 데이터베이스에 넣는 메서드 자체를 mock 함수로 구성한다. (가짜화)
4) 그리고 리턴 값을 정말로 데이터베이스에서 넣어 반환된 값을 직접 지정해준다.
5) 그렇게 하면, 실제로 데이터베이스 트랜잭션은 일어나지 않았지만, 마치 트랜잭션이 일어난 것처럼 동작이 되는 것이다.
6) mock함수의 반환 값을 가지고 이제 함수를 테스트하면 된다.
mocking 메서드
jest.fn()
// 변수를 mock함수로 만들기
const mockFn = jest.fn();
// mock는 빈 함수이기 때문에 기본적으로 undefined
mockFn(); // undefined
mockFn(1); // undefined
mockFn([1, 2], { a: "b" }); // undefined
// mock 리턴값 지정하기
mockFn.mockReturnValue("I am a mock!");
mock(); // I am a mock!
mock.mockReturnValue(42);
mock(); // 42
필자의 개인적인 이해와 정리
이 모킹이라는 것이 처음에 무슨 말이야 싶었는데 내 나름대로 이해하고 정리하자면
했다 치고 함수라고 생각을 하고
const 어떠한 함수 = jest.fn()
으로 jest.fn()라는 함수라고 칭하고, 어떠한함수.mockReturnValue(value) 로 항상 value라는 값을 리턴하도록 한다.
ex) likeservice.likeRepository.findOneLike = jest.fn(() => "3")처럼 항상 3을 리턴하도록 할 수도 있다.
이렇게 내가 원하는 값을 억지로 리턴하게 하여 내가 예상한 값과 같은지 확인한다.
이러한 방법은 디비에 접근할 때 많이 쓰이는데
실제 데이터베이스에 접근하면 안 되니 테스트 데이터베이스를 만들어 접근을 하거나
위처럼 모킹 함수를 만들어 디비에서 3이라는 값을 가져왔다 치고를 만들어서 테스트를 진행한다.
아래 블로그에서 많은 도움을 받았습니다.
'coding > JS' 카테고리의 다른 글
소수점 반올림 (0) | 2022.08.30 |
---|---|
supertest 테스트 코드 작성 (0) | 2022.08.11 |
class의 호이스팅 (0) | 2022.08.09 |
객체지향 class (ES5/ES6) (0) | 2022.08.09 |
배열과 유사 배열 객체 (0) | 2022.08.01 |