평범한 컴공 대학생의 공부일지

Node.js Jest 테스트 본문

자바스크립트

Node.js Jest 테스트

Taram 2024. 5. 23. 15:04

1. Jest Test
    - 명령어 : npm test ~
       -> 테스트용 파일은 파일명에 test or spec가 있으면 자동으로 찾아서 테스트를 진행
       -> 키워드가 들어간 파일이 여러 개라면 경로를 적어주어 테스트 진행 가능
       -> 아래와 같은 경우 1+1이 3과 같은지 비교 -> 3이 아니기 때문에 Fail이 나옴

테스트 실패 시 결과

        -> 테스트 성공 시 PASS가 출력되며 올바르게 진행 되는 것을 확인

        ※ 테스트는 자신이 만든 서비스가 제대로 동작하는지 알기 위해 꼭 필요함
             1) 허무한 에러로 프로그램이 고장나는 것을 막을 수 있음.
             2) 한 번 발생한 에러를 테스트를 만들어두면 같은 에러가 발생하지 않게 방지 가능
             3) 코드를 수정할 때 프로그램이 자동으로 어떤 부분이 고장나는 지 알려줌


- 아래 코드는 사용자의 로그인 상태를 확인하는 미들웨어 함수 isLoggedInisNotLoggedIn에 대한 테스트 코드
- 각각의 함수는 로그인 상태에 따라
next 함수 호출 또는 적절한 응답을 반환하는지를 확인
- 미들웨어 테스트를 위해 req와 res를 가짜로 만들어주어 테스트를 진행

const { isLoggedIn, isNotLoggedIn } = require('./');

// isLoggedIn 미들웨어 함수 테스트
describe('isLoggedIn', () => {
  // 가짜 응답 객체와 next 함수 생성
  const res = {
    status: jest.fn(() => res),
    send: jest.fn(),
  };
  const next = jest.fn();

  // 로그인 되어있을 경우 isLoggedIn이 next를 호출해야 함을 테스트
  test('로그인 되어있으면 isLoggedIn이 next를 호출해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => true), // 가짜 요청 객체에서 로그인 상태를 true로 설정
    };
    isLoggedIn(req, res, next);
    expect(next).toBeCalledTimes(1); // next가 한 번 호출되었는지 확인
  });

  // 로그인 되어있지 않을 경우 isLoggedIn이 에러를 응답해야 함을 테스트
  test('로그인 되어있지 않으면 isLoggedIn이 에러를 응답해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => false), // 가짜 요청 객체에서 로그인 상태를 false로 설정
    };
    isLoggedIn(req, res, next);
    expect(res.status).toBeCalledWith(403); // 상태 코드 403으로 응답하는지 확인
    expect(res.send).toBeCalledWith('로그인 필요'); // "로그인 필요" 메시지로 응답하는지 확인
  });
});

// isNotLoggedIn 미들웨어 함수 테스트
describe('isNotLoggedIn', () => {
  // 가짜 응답 객체와 next 함수 생성
  const res = {
    redirect: jest.fn(),
  };
  const next = jest.fn();

  // 로그인 되어있을 경우 isNotLoggedIn이 에러를 응답해야 함을 테스트
  test('로그인 되어있으면 isNotLoggedIn이 에러를 응답해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => true), // 가짜 요청 객체에서 로그인 상태를 true로 설정
    };
    isNotLoggedIn(req, res, next);
    const message = encodeURIComponent('로그인한 상태입니다.'); // 에러 메시지 인코딩
    expect(res.redirect).toBeCalledWith(`/?error=${message}`); // 리다이렉트 경로가 올바른지 확인
  });

  // 로그인 되어있지 않을 경우 isNotLoggedIn이 next를 호출해야 함을 테스트
  test('로그인 되어있지 않으면 isNotLoggedIn이 next를 호출해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => false), // 가짜 요청 객체에서 로그인 상태를 false로 설정
    };
    isNotLoggedIn(req, res, next);
    expect(next).toHaveBeenCalledTimes(1); // next가 한 번 호출되었는지 확인
  });
});

    - Test Coverage ( 명령어 : npm run -coverage)

       1) Test Coverage란?

           테스트 커버리지 툴은 소프트웨어 테스팅 과정에서 코드가 얼마나 잘 테스트되었는지를 측정하는 도구입니다.
           이는 코드 내의 각 줄, 함수, 조건 등이 테스트에 의해 실행되었는지 여부를 분석
           전체 코드 베이스 내에서 테스트가 얼마나 충분히 이루어졌는지를 수치로 나타냅니다.
           즉, 테스트 커버리지는 단순히 코드량에 대한 통계를 넘어, 코드의 품질을 직접적으로 향상시킬 수 있습니다.
           -> 전체 코드 중에서 테스트되고 있는 코드의 비율

 

         -> 필터를 걸어 특정 테스트 파일을 제외하도록 수정 가능
         -> Stmts: 구문

             Branch: 분기점

             Funcs: 함수

             Lines: 줄 수


       2) 중요성
          - 품질 보장: 테스트 커버리지 툴을 사용하면 코드의 빈틈을 발견하고, 이를 통해 버그를 줄이며 코드 품질을 향상
          - 효율적 리소스 활용: 어떤 부분이 충분히 테스트되었고, 어떤 부분이 더 많은 테스트가 필요한지를 명확히 할 수 있어, 테스트 리소스를 보다 효율적으로 배분 가능
         - 신뢰성 향상: 테스트 커버리지가 높은 코드는 일반적으로 더 낮은 결함율을 가지며, 이는 전반적인 소프트웨어의 신뢰성을 향상
         - 개발 속도 증가: 초기 개발 단계에서 활용하면, 장기적으로 코드 수정에 드는 시간과 노력을 줄일 수 있음

       3) 주의점

       - 테스트 커버리지가 100%라고 해서 그 코드가 완벽하다는 것은 아님. 중요한 것은 질적인 테스트를 하는 것
       - 단순히 수치를 높이기 위한 테스트는 오히려 역효과 발생 가능성이 높음.
       - 따라서, 사용할 때는 수치를 넘어서, 실제로 코드의 질을 개선하는 데 집중해야 함

실행 후 결과 화면

 

 

'자바스크립트' 카테고리의 다른 글

Node.js 웹 소켓  (0) 2024.05.23
자바스크립트(JS) Array 객체 함수  (0) 2023.08.05
자바스크립트(JS) Array 객체, 배열  (0) 2023.08.05
자바스크립트(JS) 객체(2)  (0) 2023.08.05
자바스크립트(JS) 객체(1)  (0) 2023.08.05