좋은 테스트의 FIRST 속성

FIRST 속성은 테스트의 효율성과 신뢰성을 보장한다. FIRST 각각에 대해 더 자세히 알아보기 전에 각 단어가 무엇을 의미하는지 확인하자.

  • F(fast) : 테스트를 신속하게 실행하여 원활한 개발 프로세스를 유지한다.
  • I(independent) : 연쇄적 오류를 방지하고 유연한 테스트 실행을 허용하기 위해 테스트가 서로 의존하지 않도록 한다.
  • R(repeatable) : 테스트가 다양한 환경과 시간에 걸쳐 일관된 결과를 생성하는지 확인한다.
  • S(self-validating) : 테스트 검증을 자동화하여 수동 검사가 필요하지 않는다.
  • T(timely) : 코드 이전에 테스트를 작성하여 개발을 추진하고 코드가 요구 사항을 충족하는지 확인한다.

Fast

Fast 테스트는 지연 없이 테스트를 자주 실행할 수 있게 해주기 때문에 매우 중요하다. TDD에서는 빠른 주기로 코드를 작성, 실행 및 리팩토링하는 경우가 많다. 테스트 속도가 느리면 빈번한 테스트를 진행 할 때마다 개발 프로세스가 방해를 받고 개발자가 테스트를 건너뛰거나 실행 빈도가 낮아지게 된다.

Independent

Independent 테스트는 다른 테스트의 결과나 실행에 의존하지 않는 테스트다. 각 테스트는 다른 테스트가 실행되는 순서에 관계없이 자체적으로 실행될 수 있어야 하며 여전히 동일한 결과를 생성할 수 있어야 한다.

Repeatable

Repeatable 테스트는 환경이나 상황에 관계없이 실행될 때마다 동일한 결과를 산출해야 한다. 예측할 수 없게 통과하거나 실패하는 테스트를 종종 "불안정한" 테스트라고 하며 테스트 모음에 대한 신뢰도를 약화시킬 수 있다.

Self-validating

Self-validating 테스트는 수동 검사 없이 통과 여부를 자동으로 확인할 수 있는 테스트다. 이는 일반적으로 코드의 실제 출력을 예상 결과와 비교하는 어설션을 통해 달성된다.

Timely

Timely 테스트는 검증할 프로덕션 코드 이전에 작성된다. 이 원칙은 TDD의 핵심이며, 테스트를 작성하면 요구 사항을 명확히 이해하게하고 코드 설계를 하는데 있어서 안내자 역할을 한다.

 


Right BICEP : 무엇을 테스트 할 것인가?

Right BICEP 약어는 TDD의 맥락에서 테스트가 철저하고 효과적인지 확인하는데 유용하다. 테스트를 작성할 떄 고려해야 하는 다양한 유형의 시나리오에 대한 체크리스트 역할을 한다.

  • Right : 시스템이 예상된 작업을 수행하는지 확인
  • Boundary condition : 시스템의 경계나 한계를 테스트
  • Inverse relationships : 역연산이 올바른지 확인
  • Cross-checks : 대체 방법으로 결과를 교차 확인
  • Error conditions : 오류 조건을 적절하게 처리
  • Performance characteristics : 시스템 성능을 평가

Right

시스템이 정상적인 조건에서 예상대로 작동하는지 확인하는 테스트 작성에 중점을 둔다. 유효한 입력이 주어졌을 때 소프트웨어가 해야 할 일을 수행하는지 확인하는 것이다.

Boundary conditions

테스트에서는 가능한 입력 값의 한계에서 시스템이 올바르게 작동하는지 확인하기 위해 엣지 케이스 또는 경계 조건을 확인해야 한다.

@Test
void testBoundaryConditions() {
    assertEquals(0, add(0, 0));   // lower boundary
    assertEquals(100, add(50, 50)); // upper boundary
}

 

Inverse relationships

서로 실행 취소해야 하는 작업이 올바르게 수행되는지 확인한다.

@Test
void testInverseOperations() {
    int result = add(10, 5);
    assertEquals(10, subtract(result, 5));
}

 

Cross - checks

다른 대체 방법으로 교차 확인하여 결과를 검증한다.

@Test
void testCrossCheck() {
    int result = multiply(4, 5);
    assertEquals(20, add(4, 4, 4, 4, 4));
}

 

Error conditions

테스트는 오류 조건이나 유효하지 않은 입력을 적절하게 처리해야 한다.

@Test
void testErrorConditions() {
    assertThrows(IllegalArgumentException.class, () -> {
        divide(10, 0); // Testing division by zero
    });
}

 

Performance characteristics

코드가 예상되는 로드 또는 스트레스 조건에서 적절하게 작동하는지 확인한다. 여기에는 대규모 입력, 대량 또는 집중적인 계산이 적용될 때 시스템이 어떻게 작동하는지 테스트하는 작업이 포함된다.

 

 

+ Recent posts