Junit으로 생산성을 높이려면 테스트 대상과 커버하는 경계조건, 좋은 테스트의 요건을 배워야한다.
✔️FIRST : 좋은 테스트의 조건
Fast : 빠른
설계를 깨끗하게 하면 빠르게 유지할 수 있다.
가장 먼저 느린 테스트에 대한 의존성을 줄일것. > 클린 객체 지향 설계 개념과 맞출수록 단위 테스트 작성도 쉬워짐.
Isolated : 고립된
다른 단위 테스트에 의존하지 않는다.
테스트 코드는 어떤 순서나 시간에 관계없이 실행할 수 있어야한다.
작은 양의 동작에만 집중하면 테스트 코드를 집중적이고 독립적으로 유지하기 쉬워진다.
** SRP(단일 책임 원칙)
Repeatable : 반복 가능한
실행할 때 마다 결과가 같아야한다. > 직접 통제할 수 없는 외부 환경에 있는 항목들과 격리시켜야 한다.
Self-validating : 스스로 검증 가능한
테스트는 스스로 검증할 뿐만 아니라 준비할 수도 있어야 한다.
테스트에 필요한 어떤 설정 단계든 자동화를 해야한다.
Timely : 적시의
cf) 그럼 나쁜테스트란?
- 테스트 사용하는 사람에게 어떤 정보도 주지 못하는 테스트
- 산발적으로 실패하는 테스트
- 어떤 가치도 증명하지 못하는 테스트
- 실행하는 데 오래 걸리는 테스트
- 코드를 충분히 커버하지 못하는 테스트
- 구현과 강하게 결합되어있는 테스트.
- 수많은 설정 고리로 점프하는 난해한 테스트.
✔️ Right-BICEP : 무엇을 테스트 할 것인가?
Right : 결과가 올바른가?
B : 경계조건(boundary conditions)은 맞는가?
경계조건 ex)
- 모호하고 일관성 없는 입력 값.
- 잘못된 양식의 데이터 (velog.i같은)
- 비거나 빠진 값.
- 이성적인 기댓값을 훨씬 벗어나는 값. (2999년도 같은)
- 중복을 허용해서는 안 되는 목록에 중복 값이 있는 경우(주민번호 뒷자리같은)
- 정렬이 안 된 정렬 리스트 혹은 그 반대. 정렬 알고리즘에 이미 정렬된 입력 값을 넣거나 정렬 알고리즘에 역순 데이터를 넣는 경우
- 시간 순이 맞지 않는 경우 (HTTP서버가 OPTIONS 메서드의 결과를 POST 메서드 보다 먼저 번환해야하는데 그 후에 반환하는 경우)
👉🏻이거까지 통과하면 그 기능은 정상 작동하는거라고 볼 수 있다 라는 의미!
I : 역 관계(Inverse relationship)를 검사할 수 있는가?
C : 다른 수단을 활용하여 교차 검사(cross-check)할 수 있는가?
ex) 도서 대출 시스템 개발 시 대출된 도서 + 선반에 있는 도서개수 = 각 도서의 총 수량
E : 오류 조건(error conditions)을 강제로 일어나게 할 수 있는가?
환경적인 제약 ex)
- 메모리가 가득 찰 때
- 디스크 공간이 가득 찰 때
- 네트워크 가용성 및 오류들
- 서버와 클라이언트 간 시간이 달라서 발생하는 문제들
- 시스템 로드
- 제한된 색상ㅇ 팔레트 * 매우 높거나 낮은 비디오 해상도
추측만으로 성능 문제에 바로 대응하기보다는 단위 테스트를 설계하여 진짜 문제가 어디에 있으며 예상한 변경 사항으로 어떤 차이가 생겼는지 파악해야한다.
✔️ CORRECT : 경계 조건
🌀 버그가 있는 것을 보여줄 수 있고, 버그가 없다는 것을 보여줄 수는 없다.
시스템의 데이터 흐름을 이해하면 불필요한 검사를 최소화할 수 있다.
보통 이메일 주소를 파싱하여 이름 부분을 추출할 수 있으나 @기호가 없는 경우나 이름이 비어 있는 경우에도 대처를 해야한다.
Ordering(순서) : 값의 집합이 적절하게 정렬되거나 정렬되지 않았나?
Range(범위) : 이성적인 최솟값과 최댓값 안에 있는가??
Reference(참조) : 코드 자체에서 통제할 수 없는 어떤 외부 참조를 포함하고있는가?
- 범위를 넘어서는 것을 참조하고 있지 않은지
- 외부 의존성은 무엇인지
- 특정 상태에 있는 객체를 의존하고 있는지 여부
- 반드시 존재해야 하는 그 외 다른 조건들
Existence(존재) : 값이 존재하는가(non-null), 0이 아니거나(nonzero), 집합에 존재하는가 등
Cardinality(기수) : 정확히 충분한 값들이 있는가?
Time(절대적 혹은 상대적 시간) : 모든 것이 순서대로 일어나는가?
그 밖에 문제될 것이 있는가?