인프런

강의 마무리

date
Mar 22, 2025
slug
test-on-spring-with-architecture-7
status
Public
tags
테스트를 추가하고 싶은 개발자들의 오답노트
author
summary
[테스트를 추가하고 싶은 개발자들의 오답노트] 강의 정리
type
Post
thumbnail
updatedAt
Mar 24, 2025 01:19 PM
category
인프런

📝 강의 정리


테스트의 범위

  • 무엇을 테스트 해야 할 지 모를 때, RIGHT-BICEP 원칙을 생각하자
 

RIGHT-BICEP

  • RIGHT : 결과가 올바른가?
  • Boundary conditions
  • Inversion relationship
  • Cross check
  • Error conditions
  • Performance Characteristics

Boundary conditions

  • Boundary conditions : 경계 조건은 맞는가
    • corner case : 시스템 내/외부 조건에 의해 발생하는 특이 케이스( 서버의 메모리,, )
    • edge case : 입력의 양 끝단과 같은 특별한 케이스
      • → 시스템 내부 조건에 의해 발생하는 특이 케이스( 변수 값의 범위)
  • CORRECT
    • Conformance: 데이터 형식이 제대로 됐는가
    • Ordering: 데이터 순서가 적합한가
    • Range: 최댓값, 최솟값일 때도 시스템의 의도대로 동작하는가
      • 덧셈 함수가 Long.MAX + Long.MAX일 때 어떻게 동작하는지
    • Reference: 협력 객체의 상태에 따라 시스템의 의도대로 동작하는가
      • 휴면 사용자를 초대하기 했을 때 어떻게 동작하는지
    • Existence: 값이 존재할 때와 없을 때를 테스트
      • 입력값 null, 0, “”일 때 어떻게 동작하는지
    • Cardinaity: 값이 충분히 존재할 때와 그렇지 않을 때
    • Time: 시간 순서가 제대로 지켜지는 지
      • 병렬 처리 시, 메시지 순서가 제대로 처리되는지

테스트 팁


[1]. ParameterizedTest( JUnit5 이상 )

  • 동일 로직을 여러번 돌리고 싶을 때
    • input값과 대조값을 배열로 생성 후 loop 하는 방식은
      • 어디서 에러가 발생하는지 확인이 어렵다
@ParameterizedTest @MethodSource("provideValidInputs") void testValidCalculation(long num1, char operator, long num2, long expected) throws Exception { // given // when long result = calculator.calculate(num1, operator, num2); // then assertEquals(result, expected); } private static Stream<Arguments> provideValidInputs() { return Stream.of( Arguments.of(1, "+", 2, 3), Arguments.of(123, "+", 234, 357), Arguments.of(111, "+", 222, 333), Arguments.of(100, "-", 50, 50), Arguments.of(10, "/", 2, 5), Arguments.of(6, "*", 50, 300) ); }
 

[2]. assertAll


  • 여러 assert문을 검증할 때, 중간에 실패해도 모든 assert문을 돌릴 수 있는 방법
  • 에러 지점 파악도 가능하다
assertAll( () -> assertThat1(), () -> assertThat2() );
 

[3]. 한 개의 테스트는 한 개만 테스트한다

  • assert가 하나라는 뜻은 아니다~
 

[4]. Thread.sleep

  • Thread.sleep을 이용해 테스트를 진행한다면, 데스크탑 성능에 따라 테스트 결과가 달라질 수 있다.
 
Thread.join
  • Thread가 정확히 끝나는 지점
  • 범용적으로 사용하기 어렵다
Awaitility
  • 나중에 정리해보기
 

[4]. FIRST 원칙

  • Fast
  • Independent
  • Repeatable
  • Self-validating
  • Timely
 

📎 출처