리팩토링

리팩터링 2판 - Java로 정리 - (2) 테스트 코드

Griotold 2024. 6. 6. 09:51

https://www.yes24.com/Product/Goods/89649360

 

리팩터링 2판 - 예스24

개발자가 선택한 프로그램 가치를 높이는 최고의 코드 관리 기술마틴 파울러의 『리팩터링』이 새롭게 돌아왔다.지난 20년간 전 세계 프로그래머에게 리팩터링의 교본이었던 『리팩토링』은,

www.yes24.com

1. 리팩터링을 할 때 가장 먼저 해야할 일! - 테스트 코드 

 

리팩토링을 진행할 때, 테스트 코드는 매우 중요한 역할을 합니다. 테스트 코드는 현재 코드의 동작을 보장하고, 변경 후에도 기능이 올바르게 작동하는지를 확인하는 데 필수적입니다. 특히, 복잡한 시스템에서 기능이 다수의 모듈과 상호작용할 때, 테스트 코드는 리팩토링 중 발생할 수 있는 예기치 않은 오류를 사전에 방지할 수 있습니다.

 

리팩토링의 핵심 목표 중 하나는 코드의 가독성과 유지보수성을 높이는 것입니다. 하지만 코드 변경이 항상 예상한 대로 작동하지 않을 수 있기 때문에, 테스트 코드는 이러한 변화를 안전하게 수행할 수 있는 보호망을 제공합니다. 따라서, 모든 주요 기능과 경계 상황을 포괄하는 테스트 코드를 작성함으로써, 리팩토링 과정에서 발생할 수 있는 문제를 조기에 발견하고 수정할 수 있습니다. 이는 개발자의 자신감을 높이고, 코드 품질을 유지하는 데 큰 도움이 됩니다.

 

리팩터링을 하기 위해서 테스트 코드는 선택이 아니라 필수란 말씀!

 

2. 테스트 코드 작성

지난 시간에 작성한 코드는 링크를 참고하세요.

https://griotold.tistory.com/6

 

리팩터링 2판 - Java로 정리

https://www.yes24.com/Product/Goods/89649360  리팩터링 2판 - 예스24개발자가 선택한 프로그램 가치를 높이는 최고의 코드 관리 기술마틴 파울러의 『리팩터링』이 새롭게 돌아왔다.지난 20년간 전 세계

griotold.tistory.com

package org.study.refactoringpractice.play;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

class TheaterTest {

    private Theater theater;

    @BeforeEach
    void setUp() {
        theater = new Theater();
    }

    @DisplayName("원하는 문자열이 출력되는 자가진단 테스트")
    @Test
    void testOne() {
        // Given
        Play hamlet = new Play("hamlet", "Hamlet", "tragedy");
        Play asYouLikeIt = new Play("as-like", "As You Like It", "comedy");
        Play othello = new Play("othello", "Othello", "tragedy");

        Performance hamletPerformance = new Performance("hamlet", 55);
        Performance asYouLikeItPerformance = new Performance("as-like", 35);
        Performance othelloPerformance = new Performance("othello", 40);

        Map<String, Play> plays = Map.of(
                "hamlet", hamlet,
                "as-like", asYouLikeIt,
                "othello", othello
        );

        String customerName = "BigCo";

        Invoice invoice = new Invoice(customerName,
                List.of(hamletPerformance, asYouLikeItPerformance, othelloPerformance));

        // When
        String result = theater.statement(invoice, plays);
        String expected = "statement for (customer: BigCo)\n" +
                "Hamlet: $650.00 (55 seats)\n" +
                "As You Like It: $580.00 (35 seats)\n" +
                "Othello: $500.00 (40 seats)\n" +
                "Total amount: $1,730.00\n" +
                "You earned: 47 points\n";

        // Then
        assertThat(result).isEqualTo(expected);
    }
}

 

테스트 코드를 작성했으니, 이제부터 마음 놓고 리팩터링을 수행할 수 있게 되었습니다.

2 - 2. 자가진단 테스트 

개발자가 일일이 코드의 동작 여부를 눈으로 확인하는 것은 비효율적입니다. 대신, 자동화된 테스트는 코드 변경 후 테스트가 통과되는지 여부를 빠르게 확인할 수 있도록 해줍니다. 이는 개발자가 코드 변경 후 발생할 수 있는 문제를 신속하게 발견하고 수정할 수 있게 하며, 코드 품질을 유지하는 데 중요한 역할을 합니다. 자동화된 테스트를 통해 초록불로 모든 테스트가 통과되었음을 확인하면, 코드가 정상적으로 작동하고 있음을 쉽게 확인할 수 있습니다. 이로 인해 개발자는 더 효율적으로 작업할 수 있고, 코드의 신뢰성을 높일 수 있습니다.

3. 테스트 통과 확인

테스트 통과!

4. 마무리

오늘은 리팩터링을 수행하기전, 테스트 코드를 작성해보았습니다. 테스트 코드는 일종의 "안전망"과 같은 역할을 해줌으로써, 개발자가 코드를 망가뜨릴 걱정없이 리팩터링을 수행할 수 있게 해줍니다.

 

테스트는 코드 변경 후 기능이 올바르게 작동하는지를 보장하며, 자동화된 테스트는 개발자가 일일이 검증할 필요 없이 코드의 안정성을 확인할 수 있게 해줍니다. 리팩터링 전 테스트 코드를 작성하는 습관을 길러, 더 나은 코드 품질을 유지할 수 있도록 노력합시다.

 

https://github.com/Griotold/refactoring-practice

 

GitHub - Griotold/refactoring-practice: 마틴 파울러 - 리팩토링 2판 - java로 연습

마틴 파울러 - 리팩토링 2판 - java로 연습. Contribute to Griotold/refactoring-practice development by creating an account on GitHub.

github.com