1. TDD(Test Driven Development)
- 테스트가 개발을 주도한다는 개념으로 사용한다.
- 테스트를 먼저 만들고 테스트를 통과하기 위한 행동들이 개발을 주도하는 것을 목표로 한다.
1.1 TDD 예제
① 만들고 싶은 Class와 해당 Test Class를 생성한다.
public class Calculator {}
class CalculatorTest {
//테스트 코드에 Calculator 클래스의 인스턴스를 생성했다.
Calculator calc = new Calculator();
}
② 원하는 기능을 만들고 무엇을 반환하는지 Test Class에 작성한다.
public class Calculator {}
class CalculatorTest {
Calculator calc = new Calculator();
//현재 Claculator 클래스에는 plus라는 메서드가 존재하지 않기 때문에 실패하게 된다.
@Test
void plus() {
int a = 10;
int b = 20;
int result = calc.plus(a, b);
}
}
③ Class에 해당 메서드를 통과할 수 있는 간단한 클래스를 구현한다.
public class Calculator {
//Calculator의 plus 메서드에서는 어떤 값이 반환돼도 좋다. 컴파일 성공이 목적이기 때문이다.
public int plus(int a, int b) {
return 0;
}
}
class CalculatorTest {
Calculator calc = new Calculator();
@Test
void plus() {
int a = 10;
int b = 20;
int result = calc.plus(a, b);
}
}
④ Class에서 나와야 하는 결과를 Test Class에서 다시 정의한다.
public class Calculator {
public int plus(int a, int b) {
return 0;
}
}
class CalculatorTest {
Calculator calc = new Calculator();
@Test
void plus() {
int a = 10;
int b = 20;
int result = calc.plus(a, b);
//매개변수 2개가 서로 동일하면 테스트 성공을 의미한다.
//현재 result에서는 0을 반환하기 때문에 테스트는 또 다시 실패할 것이다.
assertEquals(result, a+b);
}
}
⑤ Class에서 해당 테스트를 통과할 수 있는 로직을 구현한다.
public class Calculator {
public int plus(int a, int b) {
return a+b;
}
}
class CalculatorTest {
Calculator calc = new Calculator();
@Test
void plus() {
int a = 10;
int b = 20;
int result = calc.plus(a, b);
assertEquals(result, a+b);
}
}
2. BDD(Behavior Driven Development)
- 행동에 기반하여 TDD를 수행하자는 공통의 이해를 의미한다.
- 모든 테스트 문장은 Narrative하게 되어야 한다. 즉, 코드보다 인간의 언어와 유사하게 구성되어야 한다. TDD에서는 사실상 테스트 코드를 이요한 구현에 초점이 맞춰져 있지만, BDD는 TDD를 수행하려는 어떠한 행동과 기능을 개발자가 더 이해하기 쉽게 하는 것이 목적이다.
- 모든 테스트 문장은 Given, When, Then으로 나눠서 작성할 수 있어야 한다.
2.1 Given-When-Then Pattern
구분 | 설명 |
Given | - 테스트에서 구체화하고자 하는 행동을 시작하기 전에, 테스트 상태를 설명하는 부분이다. - 테스트에 사용하는 변수, 입력 값 등을 정의한다. - Mock 객체를 정의하는 구문도 포함한다. |
When | 구체화하고자 하는 행동을 의미한다. |
Then | 어떤 특정한 행동 때문에 발생할 것이라고 예상되는 변화에 대한 설명을 의미한다. |
//Given-When-Then Pattern 예시
@Test
public void 할인가격테스트() {
//given
String name = "americano";
int defaultPrice = 1000;
int expectedPrice = 900;
when(coffeeRepository.findOne(name))
.thenReturn(Coffee.builder().name(name).isMilk(false).price(defaultPrice));
//when
int actualPrice = coffeeService.getDiscountedPrice(name);
//then
assertEquals(expectedPrice, actualPrice);
}
참고
- https://jj-yi.tistory.com/m/51?category=930446
'Spring' 카테고리의 다른 글
Ant Style Pattern (0) | 2021.12.01 |
---|---|
@MatrixVariable (0) | 2021.11.29 |
RequestMappingHandlerAdapter (0) | 2021.11.16 |
Static resources, View templates (0) | 2021.11.16 |
@RequestBody, @ResponseBody (0) | 2021.11.16 |