본문 바로가기

테스트

node js 환경에서 jest와 supertest를 이용한 테스트 케이스 작성

단위 테스트 with jest

단위 테스트는 개발자가 수행하고 자신이 개발 한 코드 단위 (일명 모듈, 구성 요소) 를 테스트하는 것

소스 코드의 개별 단위를 테스트하여 사용할 준비가 되었는지 확인 하는 테스트 방법임

개발 라이프 사이클의 초기 단계에서 버그가 식별되므로 버그 수정 비용을 줄이는 데 도움이 됨

간단하게 생각하면 메소드를 테스트하는 또 다른 메소드

 

- 단위 테스트의 조건

(1) 독립적이어야 하며, 어떤 테스트도 다른 테스트에 의존하지 않아야함

→ 왜 독립적이어야할까? : 의존적인 부분을 구현하기 까다롭고, 의존적인 부분의 상태에 따라서 테스트하고자 하는 부분의 결과가 영향을 받을 수 있기 때문

Ex) DB에 데이터를 저장하는 부분을 테스트하면 데이터를 전송하는 가운데 네트워크, I/O작업, 트랜잭션 생성, 쿼리 전송 등등... 그리고 테스트 종료 후, db에서 변경 데이터를 직접 원복하거나 트랜잭션 rollback해줘야하는 필요가 있음

그래서 단위 테스트는 특정 기능만을 분리해서 독립적으로 사용함

이때, mock함수를 이용하여 의존적인 부분의 결과를 미리 정해서 사용하는 방법을 많이 씀

 

(2) 격리 되어야 함. Ajax, Axios, LocalStorage 등 테스트 대상이 의존하는 것을 다른 것으로 대체해야함

 

- why? 왜 단위 테스트를 할까?

(1) 프로그램이 크고, 메모리가 많이 필요하고, 다른 리소스 (Ex : AWS, DB) 등이 필요한 경우 로컬 환경에서 쉽게 코드를 실행시켜보기 어렵기 때문, 이런 프로그램을 개발하는 개발자들은 유닛 테스트를 만들어서 빠르게 자신의 코드가 정상적으로 작동 하는지 확인 할 수 있음

(2) 종속성이 있는 다른 클래스들에서 버그가 나는것을 방지하기 위함

그래서 Common Class 수정, A Class 버그 사라짐

하지만 Common Class 는 C Class에서도 사용중

그래서 C class버그를 해결하기 위해 다시 Common Class 수정....

이런 상황에서는 A Class에서 다시 에러가 생길 가능성이 높음!

Unit 테스트를 이용한다면 Common Class에 의존하는 다른 클래스들도 확인 가능하기에 이 에러를 해결하기 쉬워짐

 

 

통합 테스트 with Supertest

통합테스트는 모듈을 통합하는 단계에서 수행하는 테스트

단위 테스트를 먼저 수행하여 모듈들이 잘 작동되는 것을 확인했다면,

이제 이 모듈들을 연동하여서 테스트를 수행하는 것이 통합 테스트!

 

- 통합 테스트를 하는 이유?

(1) 모듈들의 상호 작용이 잘 이루어지는지 검증

(2) 통합하는 과정에서 발생할 수 있는 오류를 찾기 위해

 

Supertest란?

nodejs http 서버를 테스트하기 위해 만들어진 모듈

supertest 모듈을 이용해서 통합 테스트를 쉽게 구현할 수 있음

 

Supertest 주요 메서드

1. request() : 가상의 서버를 실행하고 api 요청

const request = require("supertest") // 1번
const express = require("express")

// 라우터
const app = express()
app.get("/user", (req, res) => res.json({ name: "alice" }))

request(app) // 2번
  .get("/user") // 3번
  .expect(200, { name: "alice" }) // 4번

 

 

JEST의 expect()와 유사하다고 보면 되지만, JEST와는 달리 .toXXxx()같은 Matcher가 없고, 체이닝 형태로 결과를 검증

 

 

 

'테스트' 카테고리의 다른 글

동기, 비동기에서의 예외처리  (0) 2023.12.14