: 애자일과 TDD라는 개념 덕에 단위 테스트를 자동화하고 이를 자신의 프로그램에 적용시키는 프로그래머들이 점차 늘고있다.
: 그렇다면 우리는 테스트를 왜 할까? 그리고 테스트는 왜 중요한걸까?
: 먼저 TDD에 대해서 알아보자.
TDD 법칙
1.
실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 말라.
2.
Checked Exception은 발생시키지 않으면서 Runtime Exception, 논리적 오류가 발생하는 정도로 단위 테스트를 작성한다.
3.
현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
: 위 세 가지 규칙을 지키면서 30초 주기로 테스트 코드 작성, 실제 코드 작성을 수행한다. 이렇게 했을 때, 우리는 실제 코드를 모두 테스트할 수 있다. 하지만 방대해진 테스트 코드는 좋기만 한 것은 아니다.
깨끗한 테스트 코드 유지하기
: 테스트 코드도 깨끗해야 하는 건가? 그냥 기능만 테스트해서 내 코드의 신뢰성을 확보할 수 있고 리팩토링 시 이점을 가져가면 되는 것이 아닌가?
: 아니다. 테스트 코드도 깨끗해야 한다. 잘 설계되지 못한 테스트 코드는 테스트 코드를 작성하지 않는 것만 못하다.
: 테스트 코드는 실제 코드가 변함에 따라 변동 가능성이 생긴다. 그렇다면 잘 설계되지 못한 테스트 코드를 수정하는 것은 분명히 고역이다. 테스트 케이스를 수정하다 모든 리소스가 사용되어버릴 수도 있는 것이다.
: 그렇다고 테스트 코드를 삭제해버리면 우리는 우리의 코드에 대해서 신뢰성을 얻기 힘들다. 내가 이쪽을 수정했는데, 이게 저쪽에 영향을 주는 코드다. 테스트 코드로 테스트를 하지 않는다면 문제가 없다고 확신할 수 있을까?
: 테스트 코드도 실제 코드 못지 않게 깨끗하게 짜야 한다.
•
테스트는 유연성, 유지보수성, 재사용성을 제공한다.
: 우리는 테스트 코드 덕분에 유연성을 확보할 수 있다. 테스트 코드가 통과한다면 내가 방금 변경한 코드가 기존의 목적대로 동작한다는 것이니까
: 테스트 케이스가 없다면 모든 변경은 잠정적인 버그다..!
깨끗한 테스트 코드
: 깨끗한 테스트 코드는 세 가지가 중요하다. 가독성, 가독성, 가독성
•
좋은 테스트 구성의 예
1.
BUILD - OPERATE - CHECK
: 테스트 자료 만들기 - 테스트 자료 조작하기 - 조작한 결과 확인하기
2.
GIVEN - WHEN - THEN
: 자료 만들기 - 테스트하고자 하는 상황 수행하기 - 결과 확인하기
3.
TEMPLATE METHOD
: 템플릿 메소드 패턴을 사용해서 반복을 줄이고 재사용성을 높이라는 얘기 같은데.. 습.. 난 별로인 것 같다.
•
도메인에 특화된 테스트 언어
: 뭔가 우리의 도메인에서 사용되는 언어로 아니면 프로젝트 이해관계자들이 이해하기 쉬운 단어나 동작들을 사용을 해서 표현하라는 것 같다.
•
이중 표준
: 이중 표준이란 테스트 코드가 동작하는 환경은 실제 환경과 다르다는 것을 인지해야한다는 것이다.
: 즉, 굳이 실제 환경처럼 테스트 코드를 작성할 필요는 없다는 것이다. 이게 무슨 말이냐 가독성이 효율성보다 더 중요한 가치라는 것이다.
•
하나의 테스트는 하나만 테스트해라
: 하나의 테스트 코드에는 assert가 하나만 있는 것이 좋은 것 같다.
: 테스트 당 하나의 개념만을 체크하는 것, 물론 이는 유도리 있게 받아들이자.
F.I.R.S.T
•
Fast
: 테스트는 빨라야 한다. 테스트가 느리게 동작한다면 우리는 테스트를 자주 할 수 없다. 그렇다면 우리는 문제를 찾는 데 시간이 걸리게 된다.
•
Independant
: 각 테스트는 서로 의존하면 안 된다. signUp - signIn을 테스트할 때, 이 테스트 간에 순서를 보장하지 마라
: 하나가 실패하기 시작하면 도미노처럼 나머지 테스트들도 무너질 것이다.
•
Repeatable
: 테스트는 어떤 환경에서도 반복 가능해야 한다. 실제 환경, 테스트 환경, 네트워크에 연결되지 않은 환경 등 외부 요소에 의존적이지 말자.
•
Self-Validating
: 테스트는 부울 값으로 결과를 내야 한다. 통과 여부를 로그를 찍어서 알려하지 마라. 기면 기다 아니면 아니다를 확실하게 해라
•
Timely
: 단위 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다. 습..
: 실제 코드를 먼저 구현하고 테스트 코드를 구현한다면 어? 실제 코드가 테스트하기 어렵네? 할 수 있다.
: 테스트하기 쉽게 코드를 짜도록 생각해보자.