단위 테스트 책 4챕터 읽기 (63~74)

Right-BICEP
Right - 결과가 옳은가?(결과의 유효성 검사)
B - 모든 경계 조건이 Correct한가?
I - 역의 관계를 확인할 수 있는가?
C - 다른 수단을 사용해서 결과를 교차확인 할 수 있는가?
E - 에러 조건을 강제로 만들어낼 수 있는가?
P - 성능 특성이 한도 내에 있는가?

1.Right
예상한 결과가 옳은지 살펴보는 것. 결과의 유효성 검사
테스트 파일 이용하기(testdata.text등을 활용할 수 있다)

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

3.역관계확인
논리적 역을 적용하여 검증할 수 있다(예:제곱근곱은 제곱한 값이 원래 값과 오차한계 안에서 같은지 테스트)

4.다른 수단을 이용한 교차확인
다른 알고리즘, 다른 데이터부분은 분리, 합하기

5.에러조건을 강제로 만들어내기
메모리고갈, 디스트공간고갈, 총계산시간과 관련된 문제, 네트워크 가용성과 에러,
시스템 부하, 색상 팔레트 제한, 초고해상도 또는 초저해상도
모의객체를 사용한 방법 - 6장에서 설명

6.성능 특성
빠른 회귀 테스트
10000개, 100000개 등등으로 동작 확인

m: 단위 테스트 책 5챕터 읽기 (75~95)

CORRECT 경계 조건
버그는 '경계 조건' 근처, 즉 그 코드가 평소의 루틴과 다르게 동작하는 조건에서 많이 발생한다.

1. 형식일치
어떤 특정한 형식을 따르는 데이터를 기대하거나 만들어야 한다.
- 이메일 주소 firstname.lastname%somewhere@subdomain.somewhere.com 등
- 구조가 복잡한 데이터(헤더가 없고 데이터와 트레일러만 있다면? 헤더만 있다면 등등)
이메일주소나 구조화데이터와 비슷한 것을 만들어 낼 때에는 그 결과물을 테스트하여 기대한 형식과 일치하는지를 확인해야 한다.

2. 순서
어떤 검색 루틴이라 해도 반드시 대상이 시작 부분이나 끝 부분에 있는 조건을 테스트 받아야 한다.
- largetest()메서드에서는 가장 큰 수가 목록의 시작 부분이나 끝부분에 있는 경우에 생기는 버그
일이 일어날 가능성이 있고, '그리고' 이 경우를 작성한 메서드가 처리해야 한다면, 이런 조건에 대해 테스트하고 그 문제를 해결해야 한다.

3. 범위
범위는 어떤 변수형이, 필요하거나 원하는 값보다 범위를 허용하는 상황을 포괄적으로 함축하는 단어다.
- 원에는 360도밖에 없다, 각도 개념을 클래스에 캡슐화
- 직사각형에서 어느 한 변도 100보다 크지 않아야 할 때
assertTrue(message, Math.abs(one.x - two.x)<MAX_DIST); ..
- 빈 스택이나 스택 오버플로우 확인하는 부분
- 인덱스 관련 개념 광범위하게 테스트 
시작 인덱스와 끝 인덱스가 같은 값이다.
처음 인덱스가 마지막 인덱스보다 크다
인덱스가 음수다
인덱스가 허용된 것보다 큰 값이다.
원소 개수를 세는 변수 값이 실제로 들어 있는 항목 개수와 맞지 않는다.

4. 참조
메서드가 자기 영역을 벗어난 어떤 것을 참조하는가? 외부 의존성이 있는가? 클래스가 가져야 하는 상태는?
클래스의 상태나 다른 객체 또는 전역 애플리케이션의 상태를 추정해야 한다면, 이런 조건들이 만족되지 않았을 때 잘 동작하는지 확인하기 위해 코드를 테스트 할 필요가 있다.
어떤 메서드의 '사전 조건'은 이 메서드가 실행되려면 어떤 상태여야 하는지 나타낸다.
'사후 조건'은 어떤 메서드가 끝나고, 그 메서드가 일으킬 것이락 보장되는 일을 나타낸다.

5.존재성
주어진 것이 존재하는가?
넘겨받거나 가지고 있는 모든 값에 대해, 그 값이 존재하지 않는다면, 즉 null이거나 비었거나 0이라면 그 메서드에 어떤 일이 일어날지 자문해 보라.
-"Age가 준비되지 않았습니다." 같은 것을 보고해 주는 예외

6.개체 수
울타리 기둥 에러(울타리 세우는 문제 12피트 폭이 3피트 울타리는 5개여야 한다. 4개로 생각하기 쉽다)
개수를 필요한만큼 갖고 있다든가, 정확히 필요한 만큼 만들었다는 것을 확인해야 한다(0,1,1보다 클 때:1개 이상을 처리할 수 있다면 10,20,1000개까지도 처리할 수 있다는 것을 전제로)
private final static int NUMBER_TO_RETAIN = 20;

7.시간
상대 시간(시간적 순서), 절대 시간(경과한 총 계산 시간), 동시성 문제
어떤 인터페이스는 본질적으로 상태 정보를 가지고 있다. login()은 logout전에 호출되는 식으로.
이 메서드들의 순서가 뒤섞여 호출된다면 어떻게 될까? 기대하는 순서에 어긋나는 메서드 호출을 시도해 봐야 한다.
제한시간은 메서드가 짧은 시간 동안 쓸 수 있는 어떤 자원을 기꺼이 기다리는 시간을 의미한다.
경과 시간 문제 : 어떤 것을 기다리는데 '지나치게 오래' 걸린다면? 
스레드 여러 개가 같은 시간에 같은 객체를 사용한다면 무슨 일이 일어날지 자문해 보라. 동기화해야 할 전역이나 인스턴스 수준의 데이터나 메서드가 있는가?
외부 파일이나 하드웨어에 접근하는 부분은 어떤가? synchronized 키워드가 필요한 모든 데이터 요소나 메서드에 확실히 이 키워드를 붙이도록 하라. 그리고 테스트의 일부로 
스레드 여러개를 돌려보도록 하라.


단위테스트
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 데이비드 토머스 외 (인사이트, 2004년)
상세보기





WRITTEN BY
뮤네

,