인프런

테스트에 필요한 개념

date
Jan 19, 2025
slug
test-on-spring-with-architecture-2-4
status
Public
tags
테스트를 추가하고 싶은 개발자들의 오답노트
author
summary
테스트에 필요한 개념들
type
Post
thumbnail
updatedAt
Jan 18, 2025 07:39 PM
category
인프런

📝 강의 정리


[1]. 테스트 관련 용어


SUT( System Under Test )

  • 테스트 하려는 대상

BDD( Bahavior Driven Development )

  • 시스템이 어떻게 동작해야 하는지( 행동 )을 정의하는데 중점
  • given, when, then의 형식을 가짐
    • given : 어떤 상황이 주어졌을 때
      when : 이 행동을 하면
      then : 결과가 이렇게 된다.

Interaction Test

  • 메서드가 실제로 호출이 됐는지를 검증하는 테스트
    • → 이러한 방식은 그닥 좋은 방식이 아니라고 해석될 수 있다.
    • 내부 구현을 ‘감시’하는 행위 이기 때문에 이는 캡슐화에 위배된다고 볼 수 있다.
 

상태 검증 VS 행위 검증

 

테스트 픽스쳐

  • 테스트에 필요한 자원을 생성하는 것
    • private Book sut; @BeforeEach void 책을_미리_할당() { sut = Book.builder().build(); } @Test void ~~~ //
  • 테스트 픽스쳐를 사용할 경우, 테스트가 한눈에 이해되기 어려운 경우가 생기므로
    • 가급적 사용을 지양하는 편.
 

비욘세 규칙

  • 유지하고 싶은 상태나 정책이 있다면, 테스트를 만들어 놓아라
    • → 싱글 레이디 가사 중 “네가 나를 좋아했다면, 프로포즈를 했었어야지” 에서 유래된 규칙
  • 테스트가 없는 환경에서 협업을 하다 보면, 아래와 같은 상황이 계속 반복된다
    • “이 부분은 이렇게 바뀌어도 되지 않나요?”
    • “내가 이렇게 수정해도 되나?”
    • → 이때, 작성된 테스트는 시스템의 정책이 되어준다.
       

✨ Testability ( 테스트 가능성 )

  • 소프트웨어가 테스트 가능한 구조인가?
 

Test Double ( 테스트 대역 )

  • Double은 영어로 스턴트맨과 같은 ‘대역’을 의미한다.
  • 테스트에 필요한 가짜 객체를 의미
 

[2]. Test Double( 테스트 대역 )


💡
테스트에 필요한 가짜 객체

Dummy

  • 아무런 동작도 하지 않고, 정상적으로 돌아가기 위해 사용

Fake

  • 로컬에서 사용하거나 테스트를 위해 만들어진 가짜 객체, 자체적인 로직이 있다.

Stub

  • 미리 준비된 값을 출력하는 객체
    • class StubBookRepository implements BookRepository { public Book getByName(String name) { if (name.equals("aril2nd")) { // 출력될 값을 미리 세팅 return Book.builder() .name("april2nd") .writer("김준호").build(); } throw new BookNotFoundException(name); } // mockito 프레임워크 이용 시 given(bookRepository.getByName("april2nd")) .willReturn( Book.builder() .name("april2nd") .writer("김준호") .build() );
       

Mock

  • 메소드 호출을 확인하기 위한 객체로 자가 검증 능력을 갖는다.
  • 사실상 테스트 더블과 동일한 의미로 사용되고 있다.
    • final class MockMailer implements Mailer { private bool hasBeenCalled = false; public function sendWelcomeEmail(UserId userId): void { this.hasBeenCalled = true; } public function hasBeenCalled(): bool { return this.hasBeenCalled; } }
       
 

Spy

  • 메소드 호출을 전부 기록했다가 나중에 확인하기 위한 객체
    • final class EventDispatcherSpy implements EventDispatcher { private array events = []; public function dispatcher(Object event): void { this.events[] = event; } public function dispatcherEvents(): bool { return this.events; } }
 

📎 출처