우리에게 필요한 것은 무엇을 테스트할 지 도와줄 수 있는 지침이다.
RIght
- 결과가 올바른가?B
-(boundary conditions) 경계 조건은 맞는가I
-(inverse relationship) 역 관계를 검사할 수 있는가C
-(cross check)할 수 있는가E
-(error conditions) 오류 조건을 강제로 일어나게 할 수 있는가P
-(performance characteristics) 성능조건은 기준에 부합하는가
Right
테스트 코드는 먼저 기대한 결과를 산출하는지 검증할 수 있어야 한다.
[B]oundary Conditions
코드를 짜면서 행복회로를 굴릴 때는 입력 값의 양극단을 다루는 코드시나리오의 경계 조건에 걸리지 않을 수도 있다.
생각해야하는 경계 조건은 다음과 같다.
모호하고 일관성 없는 입력 값 → 예를들어 특수문자가 포함된 파일이름
잘못된 양식의 데이터 → 예를 들어 도메인이 빠진 이메일주소(
geon1120@gmail.
)수치적 오버플로우를 일으키는 계산
비거나 빠진 값 →
0
,0.0
,null
등이성적인 기댓값을 벗어나는 값 → 예를 들어 150세의 나이(언젠간 될지도?)
중복을 허용해서는 안 되는 목록에 중복 값이 있는 경우
정렬이 안 된 리스트 혹은 그 반대.
시간 순이 맞지 않는 경우 → 예를 들어
http서버
가OPTIONS메서드
의 결과를POST 메서드
보다 먼저 반환해야 하지만 그 후에 반환하는 경우
경계조건에서는 CORRECT를 기억하라
Conformance (준수) : 값이 기대한 양식을 준수하고 있는가
Ordering (순서) : 값의 집합이 적절하게 정렬되거나 정렬되지 않았나
Range (범위) : 이성적인 최솟값과 최댓값 안에 있는가
Reference (참조) : 코드 자체에서 통제할 수 없는 어떤 외부 참조를 포함하나
Existence (존재) : 값이 존재하는가(
non-null
,non-zero
) 등Cardinality (기수) : 정확히 충분한 값들이 모였는가
Time (절대적 혹은 상대적 시간) : 모든 것이 순서대로 일어나는가? 정확한 시간에?
[I]nverse relationship
종종 수학계산에서 사용한다. 곱셉으로 나눗셈을 검증하고 뺄셈으로 덧셈을 검증하는 것처럼.
[C]ross check
흥미로운 문제에는 무수한 해법이 존재한다. 그리고 두 해법이 동일한 값을 반환하는지 교차 검사한다.
예를 들어 도서 대출시스템을 개발할 때, 대출된 도서와 대출되지 않은 도서 개수를 합하면 각 도서의 총 수량과 같아야 한다. 각 도서는 서로 다른 장소에 저장될 수 있지만 모두 합하면 합이 맞아야 하고 서로 교차 검사할 수 있어야 한다.
[E]rror conditions
행복회로가 있다면 불행회로도 있다. 오류들을 강제로 발생시킬수 있어야 한다. 고려해야할 몇가지 시나리오가 있다.
메모리가 가득 찰 때
디스크 공간이 가득 찰 때
네트워크 가용성 및 오류들
시스템 로드
끔직한 결함은 전혀 예상하지 못한 곳에서 나올 수도 있다.
[P]erformance characteristics
환경에 따라 실패하는 테스트가 있을 수도 있다. 성능 조건에 대해서 측정할 때에는 가능한 프로덕션 환경과 유사한 머신에서 실행하자.