버그가 있는 경우 => 버그에 의해 실패하는 테스트 코드를 작성하여 어떤 경우에 실패하는지 확인(의도적으로 실패) => 해당 테스트 코드를 통과하기 위해 버그 수정
느린것에 대한 의존성 낮추기
파일, 데이터베이스 접근, 네트워크 사용으로 해당 요소에 의존하게 된다면 테스트 코드가 느려질 수 있고, 테스트코드가 불안정하다.
의존성 낮추기 위해 mock, stub을 활용할 수 있다.
최소한의 유닛으로 검증하기
독립적이고, 집중적으로 유지
하나의 테스트에서 너무 많은 것을 동시에 테스트하는 것은 지양
실행할 때마다 동일한 결과를 유지
다른 테스트 코드에 의존하거나, 네트워크와 같은 외부적인 환경에 의존하는 테스트 코드는 지양
테스트 코드는 환경에 영향을 받으면 안된다.
스스로 결과를 검증하기
ex) jest-> toBe, toEqual
자동화를 통한 검증단계(CI/CD)
repo에 새로운 테스트가 추가된다면 자동으로 모든 테스트가 실행되어 기존에 영향을 주지 않는지, 실패하는 테스트는 없는지 확인할 수 있도록 하는 것도 좋다.
시기적절하게 테스트 코드 작성
사용자에게 배포되기 이전에 테스트 코드 작성
모든 요구 사항이 정상 동작 하는지 확인
모든 결과가 정확한지 확인
모든 코너 케이스에 대해 테스트를 하기
ex) 학생 수에 대해 테스트를 한다면 => 0명, 100명, 더 많은 학생들이 있을 때
잘못된 포맷의 인풋, null, undefined, 중복값일 경우, 특수문자, 잘못된 이메일, 작은 숫자, 큰 숫자, 중복, 순서가 맞지 않을 때 등등
역관계를 적용해서 결과값을 확인
일관성 유지
ex) 5 + 5가 10인 것을 확인한 다면, 10 - 5가 5인 것을 확인할 수 있어야 한다.
ex) 배열에 학생 A를 추가했을 때, A를 다시 제거하면 이전의 배열과 동일해야 한다.
다른 수단을 이용해서 결과값이 맞는지 확인
추가된 과일 == 전체과일 - 예전의 과일 갯수
A 알고리즘 == B 알고리즘
불행한 경로에 대해 우아하게 처리 하는가?
네트워크 에러, 메모리 부족, 데이터베이스 중지 등의 에러가 있을 때 정상적으로 동작하는지.
성능 개선의 척도와 확인도 데이터를 통해 확인
특정 포맷을 준수하는가
인풋이 포맷에 적합할 때, 적합하지 않을 때, 이상한 포맷일 때 코드가 어떻게 동작하는지 예상하는 테스트를 작성해야 한다.
전화번호, 이메일, 아이디, 파일 확장자...
순서 조건 확인하기
순서가 중요한 경우, 순서가 잘못되어 있을 때 어떻게 동작하는지 예상하는 테스트 작성
숫자의 범위
제한된 범위보다 작거나 큰 경우
외부 의존성 여무, 특정한 조건의 유무
~일때, ~가 되어 있을 때, 어떤 특정한 상황/상태가 조건으로 있을 때, 만약 이러한 조건이 충족되지 않고 실행된다면 어떻게 되는지
우리가 가정하고 있는 상황이 아닐 때 어떻게 동작하는지.
값이 존재하지 않을 때 어떻게 동작하는지
null, undefined, ' ', 0
0-1-N 법칙에 따라 검증
목록이 하나도 없을 때, 하나만 있을 때, 여러개가 있을 때 어떻게 동작하는지.
상대, 절대, 동시의 일들
순서가 맞지 않은 경우, 소비한 시간, 지역 시간이 서로 상이할 경우 어떻게 동작하는지