테스트코드를 꼭 작성해야 할까?
테스트 코드를 어떻게 작성해야 할까?
어떤 걸 테스트 해야 하는걸까?
도대체 좋은 테스트 코드란 무엇일까?
📌 Given-When-Then 구조로 작성한다.
어떤 상태에서 출발(given)하여 어떤 상태에 변화를 가했을 때(when) 기대하는 어떠한 상태가 되어야 한다.(then)
Given
- 준비 Arrange
- 테스트를 위해 준비하는 과정
- ex) 테스트에 사용하는 변수, 입력 값 등을 정의하거나 Mock 객체를 정의한다.
When
- 실행 Act
- 테스트하고자 하는 코드를 실행하는 과정
Then
- 검증 Assert
- 실행된 값을 예상한 값과 비교 및 검증하는 과정
다음과 같이 더하기 함수에 대한 테스트 코드를 Given-When-Then
구조로 작성할 수 있다.
const { add } = require('./math');
describe('add function', () => {
it('should return the correct sum when given two positive numbers', () => {
const num1 = 5;
const num2 = 3;
const result = add(num1, num2);
expect(result).toBe(8);
});
});
🐝 FIRST의 원칙을 지켜서 작성한다.
Fast
- 좋은 테스트는 실행이 빨라야한다.
- ex) 파일, 데이터베이스, 네트워크 등 느릴 수 있는 조건은 mock이나 stub를 사용하여 대체한다.
Isolated
- 고립된, 독립적인
- 테스트하고자 하는 단위 기능에 집중해야 한다.
Repeatable
- 좋은 테스트는 반복적으로 실행하더라도 항상 동일한 결과를 반환해야 한다.
- 환경에 영향을 받지 않도록 작성해야 한다.
Self-Validating
- 스스로 결과를 검증하기
- 기대하는 결과가 무엇인지 단언(assert)해야 한다.
Timely
- 미루지 않고 사용자에게 배포되기 이전에 테스트 코드를 작성해야 한다.
🚵🏻 테스트 범위는 Right-BICEP의 원칙으로 정한다.
Right
- 모든 결과가 정확한지
- 모든 요구사항이 정상 동작하는지
Boundary conditions
- 모든 경계 조건에 맞는지
- ex) 모호하고 일관성 없는 입력 값, 잘못된 포맷, 정렬, 빈 값, 중복, 예상할 수 없는 값 등
Inverse relationship
Cross-check
Error conditions
- 다양한 오류 조건에 대처할 수 있는지
- ex) 네트워크 에러, 메모리 부족 ...
- 성능 테스트
- 모든 성능 최적화 시도는 실제 데이터로 해야 하며 추측을 기반으로 해서는 안된다.
🧪 테스트의 조건(CORRECT)을 확인한다.
- 경계 조건에 관계된 결함들을 미연에 방지할 수 있다.
- 특정 포맷을 준수하는지
- ex) 파일 확장자, 아이디, 이메일, 전화번호 …
Ordering
Range
Reference
- 외부에 의존하고 있는지
- 특정한 조건이 있는지
- ex) 어떤 특정한 상황/상태일 때 이런 동작을 한다.
Existence
Cardinality
- 집합도, 중복성이 없는 정도
- 하나도 없을 때, 하나만 있을 때, 여러개가 있을 때
Time
- 상대 시간, 절대 시간, 동시의 일들
- ex) 지역 시간이 다를 경우
Reference.