노드심화 5-9

·2022년 12월 29일
0

study

목록 보기
49/81
post-thumbnail

Layered Architecture Pattern 테스트 코드 (3)

구현할 통합 테스트는 supertest 라이브러리 하나만을 이용해 테스트 코드를 구현할 것이 아닌, jest와 supertest를 함께 사용해 더욱 명확하게 테스트 코드를 구현할 예정입니다.

Supertest 시작하기

supertest는 jest와 함께 사용하여 부분적인 테스트 뿐만 아니라, 원하는 요청(Request)를 이용해 반환(Response)된 정보를 검증하기 위해 사용되는 대표적인 테스트 라이브러리입니다.

supertest는 구현한 Express.js를 이용해 통합 테스트(Integration Test)를 구현할 수 있는 테스트 라이브러리
대표적으로 Express의 서버를 구동시켜 가상의 API 요청(Request)을 보내고 원하는 결과가 발생하였는지 검증할 수 있습니다.

supertest를 이용한 테스트 코드를 작성 예시

const supertest = require("supertest");
const app = require("../../app.js");

const response = await supertest(app)
  .post(`/api/posts`) // API의 HTTP Method & URL
  .query({}) // Request Query String
  .send({}) // Request Body
  • 계층별 단위 테스트를 구현한 것과 다르게, supertest를 이용한 통합 테스트의 경우 Http Method, API의 URL을 입력하여 테스트를 진행합니다.
  • supertest의 공식 예제는 메서드 체이닝(Method Chaning) 형식으로 테스트를 진행하지만, 반환된 Response의 값을 기준으로도 테스트 코드를 작성할 수 있습니다.

supertest의 문법

  • .post(”URL”): Http Method와 URL을 입력해 테스트 하려는 API를 호출할 수 있습니다.
  • .query(object): API에게 Query String을 이용해 데이터를 전달합니다.
  • .send(object): API에게 Body에 데이터를 전달합니다.
  • response: supertest를 이용해 API를 수행한 반환(response)값이 할당됩니다.
    • response.type: Response HeaderContent-type의 값입니다.
    • response.body: API Response의 반환된 json 데이터입니다.
    • response.headers: API Response에 반환된 헤더 정보입니다.
    • 이외에도 response에는 다양한 반환값이 존재합니다!

Sequelize Test DB 설정하기

test DB랑 실제 사용할 db를 분리해주기 위해서!!

  • SequelizeMySQL을 연결할 때, NODE_ENVtest로 설정할 경우 기존에 설정된 DB가 아닌, config.jsontest 부분에 설정된 값으로 DB를 연결 할 수 있습니다.
  • 통합 테스트(Integration Test)를 실행할 때, 기존에 사용하는 Development 환경이 아닌, test DB를 사용할 경우 데이터를 언제든지 자유롭게 관리 할 수 있고, 생성삭제가 쉽게 가능해집니다.
  • config/config.json 파일에서 test 환경을 원하는 DB 설정으로 수정하면 됨!
    => "logging": false 추가하면 log가 뜨지않아 깔끔함!!
# test 환경에 설정값을 이용해 DB를 생성합니다.
# NODE_ENV=test npx sequelize db:create
# 가 안됨. 밑에 걸로 해야 됨...
npx sequelize db:create --env test

# test 환경에 설정값을 이용해 Table을 생성합니다.
# NODE_ENV=test npx sequelize db:migrate
npx sequelize db:migrate --env test 

# test환경에서 npm start
NODE_ENV=test npm start

통합 테스트 (Integration Test) 시작하기

supertest 라이브러리를 사용하기 위해서는 express의 app 객체를 이용하여 테스트를 진행할 수 있습니다.

그렇기 때문에 app.js 파일에서 express의 app 객체를 export하여 테스트 코드에서 app 객체를 가져올 수 있도록 설정해야 합니다!
=> app.js파일 마지막에 modul.exports = app 추가

supertest를 이용하여 생성(POST), 조회(GET)에 해당하는 API가 정상적으로 동작하는지를 확인할 예정입니다.

통합 테스트를 구현하기 위해 tests/integration/ 폴더 하위에 posts.integration.spec.js 파일을 생성

// __tests__/integration/posts.integration.spec.js
const supertest = require("supertest");
const app = require("../../app.js");
const { sequelize } = require("../../models/index.js");

// 통합 테스트(Integration Test)를 진행하기에 앞서 Sequelize에 연결된 모든 테이블의 데이터를 삭제합니다.
//  단, NODE_ENV가 test 환경으로 설정되어있는 경우에만 데이터를 삭제합니다.
beforeAll(async () => {
  if (process.env.NODE_ENV === "test") await sequelize.sync(); //생성
  else throw new Error("NODE_ENV가 test 환경으로 설정되어 있지 않습니다."); 
});

describe("Layered Architecture Pattern, Posts Domain Integration Test", () => {
  test("GET /api/posts API (getPosts) Integration Test Success Case, Not Found Posts Data", async () => {
    const response = await supertest(app)
      .get(`/api/posts`) // API의 HTTP Method & URL
      .query({}) // Request Query String
      .send({}); // Request Body
  });

  test("POST /api/posts API (createPost) Integration Test Success Case", async () => {
    // TODO: 여기에 코드를 작성해야합니다.
  });

  test("POST /api/posts API (createPost) Integration Test Error Case, Invalid Params Error", async () => {
    // TODO: 여기에 코드를 작성해야합니다.
  });

  test("GET /api/posts API (getPosts) Integration Test Success Case, is Exist Posts Data", async () => {
    // TODO: 여기에 코드를 작성해야합니다.
  });
});

afterAll(async () => {
  // 통합 테스트가 완료되었을 경우 sequelize의 연결된 테이블들의 정보를 초기화합니다.
  if (process.env.NODE_ENV === "test") await sequelize.sync({ force: true }); //초기화&생성
  else throw new Error("NODE_ENV가 test 환경으로 설정되어 있지 않습니다.");
});

sequelize.sync 문법

  • sequelize.sync(): 테이블이 없는 경우 새롭게 생성합니다. 하지만, 테이블이 이미 생성되어있는 경우 아무런 행동을 하지 않습니다.
  • sequelize.sync({ force: true }): 테이블을 생성하고, 만약 테이블이 존재하는 경우에는 삭제한 후 다시 생성합니다.
profile
개발자 꿈나무

0개의 댓글