1. TDD(Test Driven Development)

TDD Cycle

- 테스트가 개발을 주도한다는 개념으로 사용한다.

- 테스트를 먼저 만들고 테스트를 통과하기 위한 행동들이 개발을 주도하는 것을 목표로 한다.

 

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 & BDD Cycle

- 행동에 기반하여 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

- https://wonit.tistory.com/493

- https://kchanguk.tistory.com/40

'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