본문 바로가기
Team

[CS 스터디] TDD

by seungh2 2023. 3. 4.

TDD

  • Test Driven Development. 테스트 주도 개발
  • 짧은 개발 주기의 반복에 의존하는 개발 프로세스
  • 작은 단위의 테스트케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복해서 구현한다.

 

TDD 개발 순서

  • 먼저 요구사항을 검증하는 자동화된 테스트케이스를 작성한다.
  • 해당 테스트케이스를 통과하기 위한 최소한의 코드를 생성한다.
  • 작성한 코드를 표준에 맞도록 리팩토링한다.

TDD의 효과

  • 빠르게 피드백을 받을 수 있다.
    • 이미 완성된 코드를 가지고 테스트해서 발견하는 문제는 정확하게 어떤 것이 문제인지 파악하기 어렵다.
  • 작성한 코드가 가지는 불안정성을 개선할 수 있다.
    • 사용자에게 가기 전에 문제가 없는지 먼저 진단할 수 있다.
  • 프로그래머의 오버 엔지니어링을 방지한다.
    • 테스트를 통과하기 위한 최소한의 코드만 작성하기 때문에 오버 코딩을 하지 않는다.

TDD의 장점

  1. 객체 지향적인 코드 개발
  2. 설계 수정시간의 단축
  3. 유지보수의 용이성
  4. 테스트 문서의 대체 가능

 

TDD는 무조건 해야 한다?

NO.

기능을 구현할 때마다 테스트케이스를 먼저 작성하고 코드를 작성하는 과정을 거치는 것은 오히려 비효율적일 수도 있다.

따라서 프로젝트 일정과 자원을 고려하여 TDD를 사용할지 안할지 결정해야 한다.

하지만 TDD를 사용하면 일정 시간이 지나면 TDD를 사용하지 않을 때와 비교해서 비용이 더 커지지 않는다. 즉, 초기에 TDD를 사용하는 것은 비용이 많이 들 수 있으나 전체적으로 봤을 때는 비용이 늘어나지 않는다.

 

TDD를 하면 버그가 없다?

NO.

TDD는 버그를 없애주는 것이 아니라 사전에 발견하는 것이다.

버그를 빠르고 효과적으로 개선할 수 있도록 프로그래머를 도와주는 것이지 버그를 아예 없애는 것은 아니다.

 

Test 종류

  1. 단위 테스트 Unit Test
    • 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행해 잘 동작하는지 확인하는 테스트 
    • 소프트웨어 내부 코드에 관한 지식을 알고 있어야 하는 화이트 박스 테스트이다.
  2. 통합 테스트 Integration Test
    • 단위 테스트보다 더 큰 동작을 하기 위해 여러 모듈을 모아 의도대로 협력하는지 확인하는 테스트 
    • 개발자가 변경할 수 없는 부분(외부 라이브러리, DB에 접근하는 것 포함)까지 묶어 검증한다.
    • 단위 테스트보다 더 많은 코드를 테스트하기 때문에 어디서 문제가 발생한 것인지 확인하기 어렵다.

TDD Tools

JUnit

  • 전세계적으로 널리 사용되는 JAVA의 표준 단위 테스트 프레임워크
  • 단정문으로 테스트 케이스의 수행 결과를 판별한다. (assertEquals(기댓값, 실제값))
  • annotation으로 간결하게 지원한다.
  • 결과는 성공(Green), 실패(Red) 중 하나로 표시된다.

JUnit Annotation

  • @BeforeClass 
    • 테스트 클래스 내에서 수행 전 한 번만 실행
  • @AfterCalss
    • 테스트 클래스 내에서 수행 후 한 번만 실행
  • @Before
    • 테스트 수행 전 반복 실행
  • @After
    • 테스트 수행 후 반복 실행

 

JUnit Assertions

  • assertEquals([message], expected, actual) : 두 값이 같은지 비교
  • assertSame([message], expected, actual), assertNotSame([message], expected, actual) : 두 객체 비교
  • assertTrue([message], expected), assertFalse([message], expected) : 참/거짓 판별
  • assertNull([message], expected), assertNotNull([message], expected) : null 여부 판단

 

given/when/then 패턴

1개의 단위 테스트를 3가지 단계로 나누어 처리하는 패턴

  • given : 준비 단계. 어떠한 데이터가 준비되었을 때
  • when : 실행 단계. 어떠한 함수를 실행하면
  • then : 검증 단계. 어떠한 결과가 나와야 한다.

 

Lotto 번호 생성

import java.util.Random;

public class Lotto {
    // money가 1000이면 랜덤 숫자 6개를 생성해준다.
    public int[] generate(int moeny){
        if(!checkMoney(money)){
            throw new RuntimeException("FAIL : not valid money");
        }
        return generate();
    }

    // 랜덤 숫자 6개를 생성해준다.
    public int[] generate(){
        int[] number = new int[6];
        for(int i = 0; i < 6; i++){
            Random random = new Random();
            number[i] = random.nextInt(45) + 1;
        }
        return number;
    }

    // money가 1000인지 확인한다.
    public boolean checkMoney(int money){
        return money == 10000;
    }

}

LottoTest

class LottoTest {
    @Test
    void lottoNumberLenTest(){
        //given
        Lotto lotto = new Lotto();
        int price = 1000;

        //when
        // price를 인자로 generate 함수를 실행하면
        int[] lottoNumber = lotto.generate(price);

        //then
        // 6개의 랜덤 숫자가 나온다.
        assertThat(lottoNumber.length).isEqualto(6);
    }
    @Test
    void lottoMoneyTest(){
        //given
        Lotto lotto = new Lotto();
        int price = 100;

        //when
        // price를 인자로 generate 함수를 실행하면
        RuntimeException exception = assertThrows(RuntimeException.class, () -> lotto.generate(price));

        //then
        // exception이 발생한다.
        assertThat(exception.getMessage()).isEqualto("FAIL : not valid money");
    }

    @Test
    void lottoNumberRangeTest(){
        //given
        Lotto lotto = new Lotto();
        int price = 1000;

        //when
        // price를 가지고 generate 함수를 실행하면
        int[] lottoNumber = lotto.generate(price);

        //then
        // 1에서부터 45 사이의 숫자 6개가 나온다.
        for(int i = 0; i < lottoNumber.length; i++){
            assertThat(lottoNumber[i] >= 1 && lottoNumber[i] <= 45).isTrue();
        }
    }
}

 

 

728x90

'Team' 카테고리의 다른 글

[CS 스터디] 교착 상태  (0) 2023.03.19
[CS 스터디] 멀티 프로세스와 멀티 스레드  (0) 2023.03.11
[CS 스터디] Hadoop  (0) 2023.02.25
[CS 스터디] MSA  (0) 2023.02.16
[CS 스터디] Java  (0) 2023.01.30

댓글