좋은 테스트란 무엇인가?

yiwoojung·2023년 10월 4일
0

General

목록 보기
4/5
post-thumbnail

테스트코드를 꼭 작성해야 할까?
테스트 코드를 어떻게 작성해야 할까?
어떤 걸 테스트 해야 하는걸까?
도대체 좋은 테스트 코드란 무엇일까?

📌 Given-When-Then 구조로 작성한다.

어떤 상태에서 출발(given)하여 어떤 상태에 변화를 가했을 때(when) 기대하는 어떠한 상태가 되어야 한다.(then)

Given

  • 준비 Arrange
  • 테스트를 위해 준비하는 과정
  • ex) 테스트에 사용하는 변수, 입력 값 등을 정의하거나 Mock 객체를 정의한다.

When

  • 실행 Act
  • 테스트하고자 하는 코드를 실행하는 과정

Then

  • 검증 Assert
  • 실행된 값을 예상한 값과 비교 및 검증하는 과정

다음과 같이 더하기 함수에 대한 테스트 코드를 Given-When-Then 구조로 작성할 수 있다.

// math.test.js
const { add } = require('./math');

describe('add function', () => {
  it('should return the correct sum when given two positive numbers', () => {
     // Given
    const num1 = 5;
    const num2 = 3;

    // When
    const result = add(num1, num2);

    // Then
    expect(result).toBe(8);
  });
});


🐝 FIRST의 원칙을 지켜서 작성한다.

Fast

  • 좋은 테스트는 실행이 빨라야한다.
  • ex) 파일, 데이터베이스, 네트워크 등 느릴 수 있는 조건은 mock이나 stub를 사용하여 대체한다.

Isolated

  • 고립된, 독립적인
  • 테스트하고자 하는 단위 기능에 집중해야 한다.

Repeatable

  • 좋은 테스트는 반복적으로 실행하더라도 항상 동일한 결과를 반환해야 한다.
  • 환경에 영향을 받지 않도록 작성해야 한다.

Self-Validating

  • 스스로 결과를 검증하기
  • 기대하는 결과가 무엇인지 단언(assert)해야 한다.

Timely

  • 미루지 않고 사용자에게 배포되기 이전에 테스트 코드를 작성해야 한다.


🚵🏻 테스트 범위는 Right-BICEP의 원칙으로 정한다.

  • 테스트 범위
  • 어떤 것을 테스트할 것인지
  • 모든 결과가 정확한지
  • 모든 요구사항이 정상 동작하는지

Boundary conditions

  • 모든 경계 조건에 맞는지
  • ex) 모호하고 일관성 없는 입력 값, 잘못된 포맷, 정렬, 빈 값, 중복, 예상할 수 없는 값 등

Inverse relationship

  • 역 관계를 적용했을 때도 일관성을 유지하는지

Cross-check

  • 다른 수단을 활용하여 교차 검사할 수 있는지

Error conditions

  • 다양한 오류 조건에 대처할 수 있는지
  • ex) 네트워크 에러, 메모리 부족 ...

Performance characteristics

  • 성능 테스트
  • 모든 성능 최적화 시도는 실제 데이터로 해야 하며 추측을 기반으로 해서는 안된다.


🧪 테스트의 조건(CORRECT)을 확인한다.

  • 경계 조건에 관계된 결함들을 미연에 방지할 수 있다.

Conformance

  • 특정 포맷을 준수하는지
  • ex) 파일 확장자, 아이디, 이메일, 전화번호 …

Ordering

  • 순서 조건

Range

  • 숫자의 범위

Reference

  • 외부에 의존하고 있는지
  • 특정한 조건이 있는지
  • ex) 어떤 특정한 상황/상태일 때 이런 동작을 한다.

Existence

  • 값이 존재하지 않을 경우

Cardinality

  • 집합도, 중복성이 없는 정도
  • 하나도 없을 때, 하나만 있을 때, 여러개가 있을 때

Time

  • 상대 시간, 절대 시간, 동시의 일들
  • ex) 지역 시간이 다를 경우



Reference.

profile
프론트엔드 개발자

0개의 댓글