ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Jest] Jest로 단위테스트 시작하기
    framework/jest 2024. 12. 21. 12:28

    Jest로 단위테스트 시작하기 

     



    단위테스트

    소스코드의 개별단위를 테스트하여 해당단위가 제대로 동작하는지 확인
    개발 라이프 사이클의 초기 단계에서 디버깅이 가능해지고 개발 시간을 크게 절약할 수 있다.



     

    단위테스트의 조건


    1. 독립성
    테스트들은 독립적이어야하고 다른 테스트에 영향을 받으면 안된다

    2. 격리
    Ajax, axios등 외부 모듈에 의존해선 안된다


     

    단위 테스트를 하는 이유

    1. 테스트 자동화 - 프로그램이 커질수록 로컬환경에서 모든 코드를 실행시켜보기 어렵다.

    2. 디버깅 용이 - 클래스간 종속성이 있는 상황에서도 쉽게 에러를 확인할 수 있다.



     

    Jest

    페이스북이만든 JS 테스트 프레임워크
    단위테스트를 위해 이용


     

    Jest시작하기

    1. jest설치

    npm install jest -dev



    2. package.json 수정

    "scripts": {
      "test": "jest"
    }

     

    로 변경


    3. 테스트 실행

    코드 작성후 테스트실행

    npm test

     

     



    Jest파일구조

     

    테스트 파일명

    *.test.js
    *.spec.js

     



    테스트 폴더명

    디렉토리 내 모든파일을 테스트 대상으로 간주

    *.__tests__.*

     


    예시

    유닛테스트

    test/unit/*.test.js



    통합테스트

    test/integration/*.int.test.js

     

     

    Jest 파일내 구조

    하나의 describe안에 여러개의 test(it)가 들어간 형태

    -Describe
    관련된 여러 테스트들을 그룹화

    -test(or it)
    개별 테스트를 수행하는 곳

    -Expect, matcher
    각각의 test에는 expect와 matcher가 있다. 이 expect와 matcher를 비교해봄으로써 테스트 결과를 검증할 수 있다.
    결과를 비교하는 다양한 matcher가 있다.

     

    예제코드)

    describe("product Service Test", () => { //describe: test(=it)를 그룹화
      test("2+2 should be 4", () => {    //test: 개별테스트 단위
        expect(2 + 2).toBe(4); //expect, matcher: 둘의 값을 비교하여 테스트 검증
      });
    
      test("2+2 should not be 5", () => {
        expect(2 + 2).not.toBe(5);
      });
    });

     






    단위테스트가 독립적이어야하는 이유



    1. *테스트의 목적은 로직적인 오류를 찾는 것  

    하지만 로직외 외부 의존성들에 영향을 받게되면 로직검증이 어려워지고 테스트 결과도 신뢰하기 어려워진다 따라서 단위테스트는 외부요소와 격리되어야 한다. 


    2. 의존적인 부분들을 구현하기는 어렵다


    예를들어
    db데이터 저장하는 것을 테스트한다면
    nodejs가 db에 데이터를 전송하는 과정에서 네트워크, i/o작업, 트랜잭션생성, 쿼리전송, 테스트후 db데이터 원복(혹은 트랜잭션 롤백), db서버가 활성화된 상태인지 등의 너무 많은 작업이 발생하게된다.
    이처럼 테스트가 너무많은 요소들에 의존적이게 되고 영향을 많이 받게된다. 테스트의 목적은 로직적인 오류를 찾는 것이다.



     

    jest.fn()

    - 모킹함수를 생성하는 함수
    - 모킹함수는 해당함수가 의존하는 부분들을 가짜로 대체하는 역할을 한다
    - 함수의 기록을 추적할 수 있게해준다(매개변수, 호출회수) (스파이와 같다)

     


    모킹함수(jest.fn)을 이용하는 이유

    1. 모킹함수는 가짜 함수를 생성해서 네트워크요청, db작업등 외부 요소에 의존하지 않도록 격리하여 순수 로직 테스트에 집중할 수 있게해준다 

    2. 모킹함수는 이 함수에 대한 정보(어떤일들이 발생했는지, 어떻게 호출되었는지)들을 기억해놓는다. 이를 통해 테스트를 검증할 수 있다


     

    Jest.fn()(모킹함수 사용법)



    1. 모킹함수 생성
    2. 모킹함수도 매개변수 이용가능
    3. 모킹함수(가짜함수)가 어떤 결과값을 반환할지 직접입력
    4. 모킹함수가 몇번호출되었는지, 어떤매개변수를 사용했는지, 등을 검증

    const mockFunction = jest.fn() // 1. 모킹함수 생성
    
    mockFunction()
    mockFunction('hello') // 2. 모킹함수도 매개변수 이용가능
    
    mockFunction.mockReturnValue("가짜함수반환") // 3. 모킹함수가 반환할 값 지정
    console.log(mockFunction) // 가짜함수반환
    
    expect(mockFunction).toBeCalledWith('hello') // 4. 모킹함수에 넘어온 매개변수 검증
    expect(mockFunction).toBeCalledTimes(2)  // 모킹함수 호출회수 검증







Designed by Tistory.