BDD란?
- BDD는 행위 주도 개발 (Behavior Driven Development)로, TDD를 근간으로 파생된 개발 방법론이다.
- TDD에서 파생되어 테스트케이스 자체가 요구사항이 되도록 하는 개발방법이다.
BDD 기본 패턴
- 시나리오를 기반으로 테스트 케이스 작성
- 함수 단위 테스트를 권장하지 않음
- 일반인이 봐도 이해할 수 있을 정도로 작성
Given-When-Then
- Feature : 테스트 대상의 기능/책임을 명시
- Scenario : 테스트 목적에 대한 상황을 설명
- Given : 시나리오 진행에 필요한 값을 설정
- When : 시나리오를 진행하는데 필요한 조건을 명시
- Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시
즉, 테스트 대상의 상태 변화를 테스트하는 것
- 테스트 대상의 환경을 A 상태에 두고(Given)
- 어떤 행동을 요구했을 때(When)
- 기대하는 결과를 돌려받아야 합니다. (Then)
Describe-Context-It (DCI 패턴)
- Describe : 테스트 대상 명시 (클래스, 메서드 이름 등)
- Context : 테스트를 위한 특정 상황이나 조건 명시
- It : 테스트 대상의 행위 설명
즉, 테스트 대상의 입장에서 행동을 상세하게 테스트하는 것
참고: https://johngrib.github.io/wiki/junit5-nested/
BDD로 테스트 코드 작성하기
Given-When-Then
describe("자동차", () => {
describe("자동차는 전진 또는 멈출 수 있다.", () => {
test("자동차가 있고 무작위 결과가 4 이상인 경우, 자동차가 움직이려고 시도하면, 이동 거리가 1 증가한다.",
() => {
// given
const CAR_NAME = "ham";
const car = createCar(CAR_NAME); // 자동차가 있고
mockRandoms(4); // 무작위 결과가 4 이상인 경우
// when
car.move(); // 자동차가 움직이려고 시도하면
// then
expect(car.getDist()).toEqual(1); // 이동 거리가 1 증가
},
});
});
Describe-Context-It
"자동차의 이동 거리는" (대상)
"무작위 결과가 4 이상이고" (조건)
"자동차가 움직이려고 시도하면" (조건)
"1 증가한다." (행위)
describe("자동차", () => {
describe("getDist()", () => {
test("무작위 결과가 4 이상이고 자동차가 움직이려고 시도하면, 1 증가한다.",
() => {
// context
const CAR_NAME = "ham";
const car = createCar(CAR_NAME);
mockRandoms(4); // 무작위 결과가 4 이상이고
car.move(); // 자동차가 움직이려고 시도하면
// it
expect(car.getDist()).toEqual(1); // 1 증가
},
});
});
TDD와 BDD
여기까지 알아봤을 때 TDD와 BDD는 상호배타적인 관계라고 생각하고, “아, 이번에는 BDD로 개발해 봐야겠다.” 라고 다짐하며 모든 테스트를 시나리오 식으로 작성했는데, 뭔가 이상하다는 생각이 들었다.
Unit tests are isolated and independent of each other.
즉 TDD로 개발 시 독립적인 유닛테스트를 작성함으로써 모듈 간의 결합도를 낮출 수 있었는데, 시나리오 중심으로 작성하다 보니 이러한 부분을 놓쳤던 것이다. 그래서 카카오의 TDD와 BDD에 관련된 영상을 보고, TDD로 부족한 모듈 테스트를 진행해서 보완해야겠다고 생각하게 되었다.
그렇지만 이번 기회에 확실하게 알게 되었으니… 다음부터는 두 개념을 상호보완적으로 잘 활용해보자!
'TIL > 테스트' 카테고리의 다른 글
예제로 알아보는 jest 문법 (1) (0) | 2024.10.21 |
---|