본문 바로가기
개발/차근차근 개발일지 TIL

TIL 230510_TEST CODE란?

by 코딩하는짱구 2023. 5. 10.
반응형

 

TIL 230510_TEST CODE란?

 

✅TEST CODE?

말 그대로 우리가 작성한 코드에 문제가 없는지 테스트하기 위해 작성하는 코드!

 

일곱 테스트 원칙 (Seven Testing Principles)

  • 테스팅은 결함의 존재를 보여주는 것이다.
  • 완벽한 테스트는 불가능하다.
  • 테스트 구성은 가능한 빠른 시기에 시작한다.
  • 결함은 군집되어 있다.
  • 살충제 역설(Pesticide Paradox) — 비슷한 테스트가 반복되면 새로운 결함을 발견할 수 없다.
  • 테스팅은 정황에 의존적이다.
  • 오류 부재의 오해 — 사용되지 않는 시스템이나 사용자의 기대에 부응하지 않는 기능의 결함을 찾고 수정하는 것은 의미가 없다.

 

테스트 코드의 종류

  • 단위테스트(Unit Test) : 가장 작은 규모의 기능을 테스트 ex)repository, service, controller .. etc.. 
  • 통합테스트(Intergration Test): 여러가지 기능을 합쳤을 때 생기는 문제를 방지하기 위한 테스트 ex)POST, GET ..etc..

 

✅JEST?

JS 테스트 프레임워크로 프론트/백엔드 개발에서 널리 사용되며 대규모 프로젝트에서도 효과적으로 사용됌. 

 

사용방법 예시

  1. npm init -y
    npm i jest -D
  2. package.json파일을 아래와 같이 수정
    {
    ...
      "scripts": {
        "test": "jest"
      },
    ...
    }
  3. // validation.js

    module.exports = {
        isEmail: (value) => {
            // value가 이메일 형식에 맞으면 true, 형식에 맞지 않으면 false를 return 하도록 구현해보세요
            return false;
        },
    };

 

✅TDD(Test-Driven Devlopment)?

소프트웨어 개발 방법론 중 하나로, 테스트가 개발의 주도 역할을 하므로, 개발자가 테스트를 먼저 작성한 후에 해당 테스트를 통과 시키기 위한 코드를 작성하는 방법이다. 

 

TDD의 주요한 원칙은 다음과 같다.

  1. 테스트 작성(Test First): 실제 코드를 작성하기 전에 해당 코드에 대한 테스트를 먼저 작성합니다. 테스트는 기대되는 동작을 명확하게 정의하고, 코드가 원하는 결과를 제공하는지 확인합니다.
  2. 테스트 실행(Execute Test): 작성한 테스트를 실행하여 현재 코드가 테스트를 통과하지 못하는지 확인합니다. 테스트는 초기에 실패할 것으로 예상됩니다.
  3. 코드 작성(Code Implementation): 테스트가 실패한 상태에서는 해당 테스트를 통과할 수 있는 최소한의 코드를 작성합니다. 목표는 테스트를 통과하는 코드를 작성하는 것입니다.
  4. 리팩토링(Refactor): 작성한 코드를 리팩토링하여 코드의 가독성, 유지보수성, 성능 등을 향상시킵니다. 이 단계에서도 테스트가 계속 통과되는지 확인합니다.

 

 

✅오늘 알게된 점 및 추후 학습 계획 

우선 통합테스트의 과정을 추후에 알아보기 쉽게 정리해보았다. 

 

**supertest란?통합테스트
통합테스트 순서
1. sequelize TestDB설정하기 (내 db에)

{
  "development": {
    "username": "root",
    "password": "4321aaaa",
    "database": "layered_architecture_pattern_db",
    "host": "express-database.cv64ek1xh9gd.ap-northeast-2.rds.amazonaws.com",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": "4321aaaa",
    "database": "layered_architecture_pattern_test_db",
    "host": "express-database.cv64ek1xh9gd.ap-northeast-2.rds.amazonaws.com",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

2. sequelize TestDB 생성하기
# test 환경에 설정값을 이용해 DB를 생성합니다.
NODE_ENV=test npx sequelize db:create

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

3.각 api 테스트 시작하기
-GET/api/posts API의 검증 로직
 a. API를 호출하였을 때 성공적으로 실행할 경우 200 Http Status Code를 반환한다.
 b.API의 RES는 아무런 데이터를 삽입하지 않은 상태이므로 {data:[]}의 구조를 가진다.


-POST/api/posts 성공 API의 검증 로직
 a.API를 호출하였을때 성공적으로 실행할 경우 201 Http Status Code를 반환한다.
 b.API의 RES는 { data: createdPostData }의 형식을 가짐,
   createdPostData는 { postId, nickname, title, content, createdAt, updatedAt} 객체형태

-POST/api/posts 실패 API의 검증 로직
 a.API를 호출하였을때 InvalidParmasError 경우 400 Http Status Code를 반환한다.
 b.API의 RES는 { errorMesssage: "InvalidParamsError" }의 형식을 가짐,


4. 생성된 데이터를 검증하는 통합테스트 

테스트 코드가 다 작성되있을 때 
npx jest --verbose --coverage 를 치면 테스트 코드가 어떻게 실행됐고 coverage가 어떤지 나온다.

 

단위테스트부터 통합테스트까지 따라해보는데에 생각보다 시간이 오래 걸렸다.

개념 자체를 어렵지 않았지만 어떤 부분을 어떻게 검사할건지 익숙해지지 않아서인 것 같다.

테스트코드 강의의 과제 및 기존에 내가 진행했던 프로젝트에 TEST CODE를 적용시키며 손에 익힐 예정이다. 

화잇띵

반응형