Test-Driven Development(TDD)란?
작성해야 하는 프로그램에 대한 테스트를 먼저 작성하고 이 테스트를 통과할 수 있도록 실제 프로그램의 코드를 작성한다.
여기서 만드는 테스트도 그 자체로 하나의 프로그램이며 프로그램의 요구사항을 반영할 수 있게 만든다. 예를 들어 두 수를 더하는 add 함수를 만들어야 한다면 add 함수부터 만드는 것이 아니라 다음과 같은 testAdd 함수를 먼저 만든다.
func testAdd() {
// 1. given
let first = 5
let second = 4
// 2. when
let result = calc.add(firstValue: first, secondValue: second)
// 3. then
XCTAssertEqual(result, 5 + 4, "Add function is wrong")
}
테스트 메소드의 이름은 항상 test로 시작하며, 그 뒤에 무엇을 테스트하는지 설명을 해준다.
테스트는 given, when, then 섹션으로 테스트 형식을 지정하는것이 좋다.
- given 섹션에서, 필요한 모든 값을 설정한다.
- when 섹션에서, 테스트 중인 코드를 실행한다.
- then 섹션에서, 예상한 결과를 확인하며, 테스트가 실패 할때의 메시지를 출력한다.
그리고 나서 이 테스트를 통과하도록 add 함수를 만드는 것이다.
만약 testAdd를 실행했는데 add 함수에 문제가 있으면 XCTAssertEqual에서 에러가 발생할 것이다.
테스트를 통과하면 add 함수는 5 + 4를 정확하게 계산해낸다는 것을 보증할 수 있다.
이처럼 테스트에 요구사항이 제대로 동작함을 입증할 수 있는 코드를 작성하고 이 테스트를 만족하는 실제 프로그램을 써나가는 것이 Test-Driven Development이다.
TDD의 과정을 단계별로 요약하면 다음과 같은 과정이 된다.
- 테스트를 작성한다.
- 작성한 테스트를 통과할 수 있도록 가장 빠른 방법으로 코드를 작성한다. 이 과정에 중복된 코드를 만들어도 상관 없다.
- 테스트를 수행한다.
- 테스트를 통과하면 작성한 코드에서 중복을 제거한다. 아니면 2번으로 돌아간다.
- 테스트를 수행한다.
- 테스트를 통과하면 완성. 다음 테스트를 1번부터 시작한다. 실패하면 4로 돌아가서 디버깅한다.
그러면 왜 Test-Driven Development를 하는가?
- 먼저 테스트를 먼저 작성하고 실제 코드를 작성하기 때문에 테스트 되지 않는 코드가 없어진다. 즉, 프로그램의 모든 코드가 테스트되기 때문에 버그의 발생 가능성이 줄어든다.
- 테스트 자체가 요구사항을 분명하게 드러나게 해주는 효과가 있고 테스트에 맞게 코딩하다보면 자연스럽게 프로그램의 디자인이 SimpleDesign이 되는 경향이 있다.
- 테스트가 잘 작성되어 있으면 프로그램에 여러 가지 변경 작업을 할 때 그 변경으로 인해 다른 부분에서 예상치 못한 문제가 발생하는 것을 쉽게 알아차릴 수 있으므로 변경 작업을 두려움 없이 쉽게 할 수 있게 되어 개발 과정의 유연성이 높아진다.
따라서 최종적으로 생산성 향상에 기여한다.
TDD 의 3가지 절차
실패
첫 번째 절차는 실패이다. 이는, 실패하는 테스트 케이스를 먼저 만들라는 것이다. 실패하는 테스트 케이스를 만들 때는 프로젝트의 전체 기능에 대하여 처음부터 모든 테스트 케이스를 작성하는 것이 아니라, 지금 가장 먼저 구현할 기능 하나씩 테스트 케이스를 작성한다.
개발팀/상황에 따라 한꺼번에 여러 테스트 케이스를 먼저 작성하기도 한다.
성공
두 번째 절차는 성공이다. 우리가 작성하는 실패하는 테스트 케이스를 통과시키기 위하여, 코드를 작성하여 테스트를 통과시키는 것이다.
리팩토링
세 번째 절차는 리팩토링이다. 우리가 구현한 코드에 중복되는 코드가 있거나, 혹은 더 개선시킬 방법이 있다면 리팩토링을 진행한다. 리팩토링을 진행하고 나서도 테스트 케이스가 성공하는지 확인한다. 이 절차가 끝났다면, 다시 첫 번째 절차로 돌아가서 다음 기능 구현을 위하여 새로운 실패하는 테스트 케이스를 작성하시오.
TDD 의 장점
- TDD를 진행하면서 테스트 케이스를 작성할때 주로 작은 단위로 만들기 때문에, 코드를 작성 할 때 코드가 너무 방대해지지 않고, 코드의 모듈화가 자연스럽게 잘 이루어지면서 개발이 진행된다.
- TDD를 하면 자연스레 테스트 커버리지가 높아질 수 밖에 없다. 테스트를 먼저 작성을 하고 구현하기 때문이다. 테스트 커버리지가 높아지면 결국 리팩토링도 쉬워지고 유지보수도 쉬워진다. 결국 프로젝트의 퀄리티를 높이기에 좋은 환경이 구성된다. 추가적으로, 협업을 할 때도 매우 도움이 된다.
- 버그에 낭비하는 시간도 최소한으로 할 수 있고 우리가 구현한 기능이 요구사항을 충족하는지 쉽게 확인 할 수 있다.
'프로그래밍 > 기타' 카테고리의 다른 글
[Vus.JS] 하위 컴포넌트의 Key Event를 막아보자. (0) | 2023.03.20 |
---|---|
[Jenkins] 싱글벙글 Jenkins 핥아보기(Spring boot + Maven + Jar + Git) (0) | 2023.02.28 |