개발노트

Test Driven Development 실습

dantae 2020. 3. 12. 17:27

테스트 주도 개발방법(Test Driven Development, TDD)

 테스트 주도 개발방법(이하 TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 방식이다. 폭포수 모델(Waterfall Model)과 같은 기존의 개발 방식에서는 설계-구현-테스트 순으로 개발을 진행했다면, TDD에서는 반대로 테스트 코드를 먼저 작성하고 후에 구현을 진행한다. TDD는 다음과 같은 세가지 단계로 진행된다.

 

 

1. RED 

먼저, 개발하고자 하는 것을 어떻게 쓸 것인지 사용자 입장에서 테스트 코드를 작성한다. 이 단계에서는 테스트 코드만이 존재하므로 테스트는 실패하게 된다. 

- 이 과정에서 사용자 중심으로 생각하게 되기 때문에 TDD는 사용자 중심 개발, 인터페이스 중심 개발이라고 볼 수 있다. 

 

2. GREEN

실제 코드를 구현하여 1에서 실패한 테스트를 성공하게 만든다. 이 단계에서는 테스트를 성공시키는것이 목적이기 때문에 임시 데이터 등을 사용하여도 좋다. 

 

3. REFACTORING

2에서 구현한 코드가 일반적인 상황(같은 테스트 코드를 사용한 다른 index 호출 등)에서도 동작하도록 수정하고, 필요한 멤버변수 등을 만들고 코드를 효율적이게 정리한다.  

 

 

 

JUnit을 활용한 TDD

 JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크로, 사용하면 컴파일 타임에 JAR 형태로 링크된다. JUnit을 사용하려면 테스트 메소드에 @Test 와 같이 어노테이션을 사용해 표시한다. 현재 JUnit5 버전이 최신이며 JUnit4 버전과는 변경점이 좀 있다. (더 알아볼 것) 

 

 

IntellJ IDE에서 JUnit을 사용하여 TDD의 세 단계를 수행 해 보자.

 

 

1. 테스트 코드 작성하기

 

 우선 테스트하고자 하는 class를 생성하고 class 명을 우클릭 - Go To - Test 를 선택한다. 그 다음 나타나는 Create Test 다이얼로그에서 사용할 테스팅 라이브러리(JUnit)를 선택하고 테스트 클래스 이름을 적고 생성을 완료한다. 

 

 

테스트 클래스가 생성되면, 테스트 하고자 하는 내용을 메서드로 작성하고 그 위에 @Test 어노테이션을 붙여준다. 이때, 테스트를 하기 위해 호출되어야 하는 메서드도 정의 해 둔다.

 

Person kim 객체를 만들고, getName()이 "KIM"을 반환하는지 확인하는 테스트 메서드
Person class의 메서드

 작성한 테스트 메서드를 실행시켜 보면(테스트 메서드 좌측에 있는 초록색 삼각형 아이콘!) 테스트가 실패하는것을 볼 수 있다. 

 

2. 테스트를 성공하게 만들기

 위에서 작성한 테스트가 실패한 이유는 Person의 getName() 함수가 빈 문자열을 반환하기 때문이다. 테스트 성공을 위하여 "KIM" 문자열을 반환하도록 수정한다. 

테스트를 성공시키기 위해 문자열 "KIM"을 반환한다.

테스트에 성공하였다.

 

3. 일반적인 상황에서도 동작하도록 Refactoring 하기

Person park에 대하여 "PARK"을 반환하는지 검사하는 테스트 코드를 추가하였다.

 맨 처음 작성한 테스트는 성공하였으나, 위 그림과 같은 테스트 코드를 추가한다면 테스트에 다시 실패하게 된다. 이는 Person 클래스가 아무 데이터도 가지고 있지 않고, 작성된 문자열만 반환하기 때문이다. 이제 테스트하고자 하는 Person 클래스가 다른 상황에서도 동작하도록 Person 클래스에 생성자와 멤버 변수 등을 추가하고 코드를 정리한다.  

 

생성자에서 name 문자열을 받고, getName() 메서드에서 이를 반환한다.
문제 없이 동작하는 테스트 메서드

이제 테스트 메서드가 잘 동작 하는것을 확인할 수 있다! :)

 

 


처음 이렇게 개발해본 소감은 너무 신기하다..

개발 단계를 완전히 거꾸로 하는 기분인데 이렇게 개발해도 된다는점이 제일 신기하다.

프로젝트 볼륨이 커져도 이런식으로 개발할 수가 있나? 있으니까 쓰겠지.. 

신선해서 재밌긴 한데 IntelliJ나 JUnit 쓰는법이 익숙하지가 않아서 컴파일 오류에 고생하는중