유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. - Wikipedia
1) 실패하는 단위 테스트 를 작성할 때까지 실제 코드를 작성하지 않는다.
2) 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
3) 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
// given-when-then이라는 관례를 사용해서 테스트 코드를 더 읽기 쉽게 만든 것을 볼 수 있다.
public void testGetPageHierarchyAsXml() throws Exception {
givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsIssued("root", "type:pages");
thenResponseShouldBeXML();
}
public void testGetPageHierarchyHasRightTags() throws Exception {
givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsIssued("root", "type:pages");
thenResponseShouldContain(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
}
Fast : 테스트는 빨라야 한다. 테스트는 자주 돌려야 하기 때문에 느리면 안 된다.
Independent : 각 테스트는 서로 의존하면 안 된다. 의존 되어있으면 테스트가 연달아 실패하기 때문에 원인을 진단하기 어렵다.
Repeatable : 어떤 환경에서든 반복가능해야 한다. local, QA, Staging, 운영 환경 어디서든 테스트가 돌아가야 한다. 반드시
self-vaildating : 테스트는 성공 아니면 실패다. 통과 여부를 알려고 뭔가 읽게 만들어선 안된다.
Timely : 테스트는 적시에 작성해야 한다. 단위 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다.
9장을 읽으며 프로젝트를 할때 시간에 맞춰 기능하나하나를 만드는데 급급해 테스트를 소홀히 하던 나의 모습이 머리속에 계속 떠올라 많이 뜨끔했다.. 반성한다.. 테스트 코드가 방치되어 망가지면 실제 코드도 망가진다. 테스트 코드를 깨끗하게 유지하자라는 말대로 테스트코드 작성에 더 주의를 기울이자..