단위 테스트 지침 요약

일반 원칙
- 망가질 가능성이 있는 모든 것을 테스트한다.
- 망가지는 모든 것을 테스트한다.
- 새 코드는 무죄가 증명되기 전까지는 유죄
- 적어도 제품 코드만큼 테스트 코드를 작성한다.
- 컴파일을 할 때마다 지역테스트를 실행한다.
- 저장소에 체크인하기 전에 모든 테스트를 실행해 본다.

자문해 봐야 할 사항
- 이 코드가 옳게 작동한다면, 어떻게 그것을 알 수 있는가?
- 이것을 어떻게 테스트할 것인가?
- '그밖에' 어떤 것이 잘못될 수 있는가?
- 이와 똑같은 종류의 문제가 다른 곳에서도 일어날 수 있을까?

무엇을 테스트해야 하는가 RIGHT-BICEP
- 결과가 옳은가(right)?
- 모든 경계(Boundary)조건이 CORRECT한가?
-> EX) "fn2o8f892rnifd!@#@fdsja"라는 파일이름
"fred@daum." 과 같이 최상위 도메인이 없는 메일 주소
"10000"살이라는 사람의 나이
중복된 값이 없어야 하는 목록에서 중복된값
순서가 있는 목록인데 순서대로 되어있지 않은 경우

- Inverse 관계를 확인할 수 있는가?
-> EX) 
double x = mySqrt(4.0);
Assert.Equals(4.0*4.0,x);
- 다른 수단을 사용해서 결과를 교차 확인(Cross-check)할 수 있는가?
-> EX)
Assert.Equals(Math.Sqrt(num), mySqrt(num));
- 에러 조건(error Condition)을 강제로 만들어낼 수 있는가?
-> 메모리 고갈, 디스크 공간 고갈, 네트워크 가용성과 에러 등...
- 성능(Performance)특성이 한도 내에 있는가?

좋은 테스트는 A-TRIP해야 한다.
- 자동적(Automatic)
- 철저함(Thorough)
- 반복가능(Repeatable)
- 독립접(Independent)
- 전문적(Professional)

CORRECT 경계조건
- 형식 일치(Conformance) - 값의 형식이 예쌍한 형식과 일치하는가?
- 순서(Order) - 적절히 순서대로 되어 있거나 그렇지 않은 값인가?
- 범위(Range) - 적당한 최소값과 최대값 사이에 있는 값인가?
- 참조(Reference) - 코드가 자기가 직접 제어하지 않는 외부 코드를 참조하는가?
- 존재성(existence) - 값이 전재하는가 ? (ex. null이 아님, 0이아님, 집합 안에 존재함 등)
- 개체수 (Cardinality) - 확실히 충분한값이 존재하는가?
- 시간 (Time)(절대적 or 상대적) - 모든 것이 순서대로 일어나는가? 제시간에? 때맞추어?