[JUnit] Right-BICEP : 무엇을 테스트할 것인가?

우리에게 필요한 것은 무엇을 테스트할 지 도와줄 수 있는 지침이다.

  • 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

환경에 따라 실패하는 테스트가 있을 수도 있다. 성능 조건에 대해서 측정할 때에는 가능한 프로덕션 환경과 유사한 머신에서 실행하자.