본문 바로가기

개발관련 서적 정리/Unit Testing8

8. 통합테스트를 하는 이유 8.1 통합 테스트는 무엇인가? 단위 테스트가 아닌 모든 테스트가 통합 테스트에 해당된다. 단위 테스트는 도메인 모델을 다루는 반면, 통합 테스트는 프로세스 외부 의존성과 도메인 모델을 연결하는 코드를 확인한다. 단위 테스트로 가능한 한 많이 비즈니스 시나리오 예외 상황을 확인하고, 통합 테스트는 주요 흐름과 단위 테스트가 다루지 못하는 기타 예외 상황을 다룬다. 8.2 어떤 프로세스 외부 의존성을 직접 테스트해야 하는가? 8.2.1 프로세스 외부 의존성의 두 가지 유형 관리의존성(전체를 제어할 수 있는 프로세스 외부 의존성): 애플리케이션을 통해서만 접근할 수 있으며 대표적인 예로 데이터베이스가 있다. 비관리 의존성(전체를 제어할 수 없는 프로세스 외부 의존성): 대표적인 예는 SMTP서버와 메시지 버.. 2023. 2. 17.
7. 가치 있는 단위 테스트를 위한 리팩터링 7.1 리팩터링할 코드 식별하기 7.1.1 코드의 네 가지 유형 도메인 모델과 알고리즘 간단한 코드 컨트롤러 지나치게 복잡한 코드 도메인 모델 및 알고리즘을 단위 테스트하면 노력 대비 가장 이롭다. 컨트롤러의 경우, 포괄적인 통합 테스트의 일부로서 간단히 테스트해야 한다. 코드가 더 중요해지거나 복잡해질수록 협력자는 더 적어야 한다. 지나치게 복잡한 코드를 피하고 도메인 모델과 알고리즘만 단위 테스트하는 것이 매우 가치 있고 유지 보수가 쉬운 테스트 스위트로 가는 길이다. 결국 지나치게 복잡한 코드는 도메인 모델 및 알고리즘 및 컨트롤러로 나눠서 리팩터링을 해야한다. 7.1.2 험블 객체 패턴을 사용해 지나치게 복잡한 코드 분할하기 테스트 대상 코드의 로직을 테스트하려면, 테스트가 가능한 부분을 추출해야.. 2023. 2. 11.
6. 단위 테스트 스타일 6.1 단위 테스트의 세 가지 스타일 출력 기반 테스트(output-based testing) 상태 기반 테스트(state-based testing) 통신 기반 테스트(communication-based testing) 6.1.1 출력 기반 테스트 정의 @Test public void discount_of_two_products() { // given Product product1 = new Product("Hand Wash"); Product product2 = new Product("Shampoo"); PrinceEngine sut = new PrinceEngine(); // when double discount = sut.calculateDiscount(List.of(product1, product.. 2023. 2. 8.
5. 목과 테스트 취약성 5.1 목과 스텁 구분 5.1.1 테스트 대역 유형 목은 외부로 나가는 상호 작용을 모방하고 검사하는 데 도움이 된다. 이러한 상호 작용은 SUT가 상태를 변경하기 위한 의존성을 호출하는 것에 해당한다. 스텁은 내부로 들어오는 상호 작용을 모방하는 데 도움이 된다. 이러한 상호 작용은 SUT가 입력 데이터를 얻기 위한 의존성을 호출하는 것에 해당한다 5.1.2 도구로서의 목과 테스트 대역으로서의 목 class ControllerTest { @Mock private IEmailGateway emailGateway; // mock 생성 @Mock private IDatabase database; // mock 생성 @Test public void sending_a_greetings_email() { // g.. 2023. 2. 6.