단위 테스트 작성 해보기

dev_qorh·2022년 9월 6일
1

CatchCatch

목록 보기
10/18

Jest를 사용하여

여태까지의 개발은 1인 개발이었기도 하고, 기능 구현 우선적인 환경에서 작업하느라 테스트와 관련된 준비를 할 수 없었다. 그래서 테스트라는 것은 내가 따로 프로젝트를 시작하면 가장 하고 싶은 것들 중 하나였다. (다른 것으로는, 자동화, 로그수집 및 분석, 알림 서비스, 구조적 프로그래밍 등이 있다.) 자바스크립트를 주구장창 해와서 많이는 들어보았지만 써보지 못한 jest를 드디어 써볼 차례가 온 듯 하다.

jest를 프로젝트에 적용하기 위해서, https://jestjs.io/docs/getting-started#using-typescript 를 참고하여 세팅을 완료하였다. typescript에서의 jest는 babel을 통해 지원된다고 한다. babel은 javascript 에서 javascript로 컴파일해주는 역할을 하는데, 이는 하위 호환성 및 jsx 등의 다른 언어로 분류된 js들도 모든 브라우저에서 동작할 수 있도록 하는 중요한 역할이다. 이 역할은 tsc와도 비슷한 것 같았다. 뭐, 그렇다고 해서 기존 사용하던 tsc를 굳이 babel로 바꿔가면서 할 필요는 없다고 판단하여 둘 다 사용하는 방식으로 프로젝트를 이어 나가겠다.

ts-jest라는 라이브러리가 있었다. 바벨과 같이 설치가 많거나 한 방식이 아니었기에 이것으로 대체해 보고자 한다. 중간에 오류가 나서, jest에게 ts 파일에 대한 테스트를 ts-jest로 진행하라고 알려주는 구문을 추가해주었다.모듈을 불러오는 과정에서 한가지 해결해야 하는 부분이 있었다. 나는 typedi와 typeorm을 사용중이었기 때문에 local 환경을 구성해서 테스트 할 때처럼 모든 의존관계에 있는 객체가 준비되지 않은 시점에서 어떻게 이를 사용할 수 있도록 해야하는지 찾아보아야 했다.

mock 활용하기

https://www.daleseo.com/jest-fn-spy-on/#:~:text=mocking%EC%9D%80%20%EB%8B%A8%EC%9C%84%20%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC,mocking%EC%9D%B4%20%EB%A7%8E%EC%9D%B4%20%EC%82%AC%EC%9A%A9%EB%90%A9%EB%8B%88%EB%8B%A4. 참고
jest의 mock 기능은 가짜 함수를 만들고, 그의 리턴 결과를 지정해 주는 방식이다. 단위 테스트에서 독립적인 환경을 세팅해줄 수 있다. 실제로 나는 aws secret manager 혹은 s3 등을 사용하고 있었기에 테스트를 위해 모든 연결을 수행하는 것은 꽤나 시간이 많이 들어가는 것을 바로 짐작할 수 있었다. 그런 의미에서 단위 테스트의 진가를 알 수 있었는데, 내가 순수히 작성한 코드에 대해서만 검증을 진행하고자 하는 의미라는 것이다. 추후에 테스트 환경에 배포하는 쪽의 cd 파이프라인에서는 해당 테스트가 전체 테스트로써 생성된 api를 직접 호출해보는 식으로 구성할 수 있겠구나, 생각했다.

https://stackoverflow.com/questions/61658973/mocking-typedi-service-with-jest
이 글에서는 mock을 사용하여 typedi 환경에서도 의존 관계의 객체에 구애받지 않는 방법으로 사용하는 예제를 볼 수 있었다. default export를 통해 클래스를 가져와서 mock 객체의 인터페이스로 사용하고 이를 test 로직에서 사용하도록 구성하였다. 근데, class 전체를 mock 하는 것은 ioc를 사용하는 유저에게 필수적이진 않다고 한다. 위 방법보다 공식 문서의 방법을 따르도록 한다.

구현하기

테스트 코드를 작성하는 것은 꽤나 간단하다. {test파일이름}.test.ts 로 파일명을 정한 후 describe, test 함수등을 이용하여 테스트하고자 하는 내용을 작성하면 된다. jest를 실행하면, jest.config.ts에 명시된 내용에 따라 테스트 코드를 모두 실행하게 된다. (*.test.ts 로 작성된 파일들)

위 코드는 service 단의 클래스를 가져와 mock해 준 후, 테스트에 사용할 mock된 클래스의 함수를 생성하고 그의 resolve 값을 지정하고 있다. 실제 클래스의 함수를 사용하는 것과 같게 하기 위해 mockResolvedValue를 사용하여 promise의 동작을 구현할 수 있도록 하였다.
jest.fn()으로 구현된 함수 하나하나는 jest.spyOn() 을 사용해 함수의 호출 횟수, 인자의 정보 등을 가져올 수 있다.yarn unit으로 jest를 실행하게 되면, 테스트 하는 파일들에 대한 테스트 결과를 보여준다. coverage라는 옵션을 활성화할 경우 테스트 코드가 참조하는 모든 라인들 중 실제로 사용하는 비율등의 조금 더 면밀한 분석 결과도 제공해준다.

profile
기술로써 가치를 만들고 싶은 사람입니다.

0개의 댓글