다양한 기록

TDD (Test Driven Development) 본문

소프트웨어공학

TDD (Test Driven Development)

라구넹 2024. 12. 15. 18:21

테스트 주도 개발: 테스트 주도가 되는 개발 방식

테스트 코드를 먼저 개발한 후에 애플리케이션 코드를 개발하는 방식

TDD Process

TDD는 테스트 방식이 아닌 프로그램 개발 방식이며 TDD의 목적은 단순한 코드를 얻는 것

단순한 코드란 문제에 대한 가장 간단한 해결책을 제공하는 동시에 깨끗한 코드

 

 

TDD 규칙

- 실패하는 테스트를 통과하는 코드를 작성하는 것을 제외하고는 먼저 절대 제품 코드를 작성하지 않는다

- 테스트 코드를 작성할 때 실패할 만큼만 작성

- 테스트를 통과할 만큼만 제품 코드를 작성한다

 

실패하는 테스트 => 현재의 애플리케이션 코드가 충분히 구현되지 않았거나 오류가 있는 의미

애플리케이션 코드에 기능을 추가하기 전에 실패하는 테스트 코드를 작성

 

ex. 계산기

1

@Test
public void testAdd()
{
    Calculator calc = new Calculator();
    calc.add(20);
}
public void add(int i) {}

 

2

@Test
public void testAdd()
{
    Calculator calc = new Calculator();
    calc.add(20);
    assertEquals(20, calc.getResult());
}
public void add(int i)
{
    r = 20;
}

* 동작할 수 있는 가장 간단한 것을 해야 함 .. 우선 속인 후(fake it) 제대로 해라(make it) by Kent Beck

* 속이는 것이 제대로 한 것보다 힘이 들면 제대로 해라

 

3

@Test
public void testTwoConsecutiveAdd()
{
    Calculator calc = new Calculator();
    calc.add(20);
    calc.add(30);
    assertEquals(50, calc.getResult());
}
public void add(int i)
{
    r = r + i;
}

Mockito

- 모의 객체 생성 프레임워크

- 자바 단위 테스트에서 가짜 객체를 지원 .. Mock을 만들어줌

 

활용 이유

- Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 행동을 관리하는 객체

- 편리한 테스트 가능, 시간 단축 가능

 

문제

- 만약 테스트 대상이 되는 클래스(CUT, Class Under Test)와 협력하는 클래스가 아직 구현되지 않았을 경우

- CUT의 실행 경로들이 협력 클래스로부터 온 입력에 따라 달라지는 경우

- CUT를 테스트할 때 협력 클래스의 특정 기능이 호출되었는지를 확인하는 경우


OCP (Open Closed Principle)

- 테스트 대상 클래스를 변경하지 않고(closed) 대상 클래스의 환경을 변경할 수 있는(open) 설계가 되어야 한다

 

TDD 특징

1. 클린 코드를 위한 확신

2. 높은 소스 코드 품질

3. 재설계 시간의 절감

4. 손쉬운 테스트 근거 산출 및 문서화

5. 디버깅 시간의 절감

 

장점

- 보다 튼튼한 객체지형적인 코드 생산

- 재설계/디버깅 시간의 단축

- 테스트 정의서 대체, 추가 구현 용이

- 결함의 수가 적음

- 입출력 흐름이 명확 -> 구조 변경 용이

- 재사용 테스트 쉽게 가능, 시간/노력 절역

 

단점

- 요구사항이 계속 바뀌는 경우 도입 어려움

- 단순 개발 프로젝트 -> 타이트한 일정소화 어려움

- 어려운 예외 케이스 적용

- 숙련되기까지 6개월 이상(팀 속도 저하)

- 복잡한 소스

- 비즈니스 로직 변경/개선 속도 저하

'소프트웨어공학' 카테고리의 다른 글

테스팅 - 블랙박스, 화이트박스  (0) 2024.12.15
테스팅 (Testing)  (0) 2024.12.14
DevOps & CI/CD  (0) 2024.12.14
구현과 재사용 (Implementation & Reuse)  (0) 2024.12.13
Software Design  (0) 2024.12.13