TDD(Test Driven Develop)
TDD(Test Driven Develp), 테스트 주도개발
<br/>
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/QPPEKZ181224235459.PNG" style="border-style:solid; border-width:1px; width:400px"/>
단어 그대로 테스트가 주도로 되는 개발 방식,
TDD의 목적은 단순한 코드를 얻는것, 여기서 단순한 코드란 문제에 대한 가장 간단한 해결책을 제공하는 동시에 깨끗한 코드를 의미합니다.
또한 코드의 모든 부분이 빠짐없이 테스트 될 수 있도록 합니다.
<br/>
<br/>
TDD 규칙
-
실패하는 테스트코드를 작성하는것 말고는, 절대 제품 코드를 작성하지 않는다.
-
테스트코드를 작성할때 실패할 코드만큼만 작성한다.
-
테스트를 통과할만한 코드를 작성한다.
<br/>
음..??
결국 다음과 같이 동작함을 말합니다.
<br/>
while(더 많은 테스트가 필요하니?){
** 최소한의 실패할 테스트 코드를 작성한다 -> 테스트 코드를 통과하는 코드를 작성한다 -> 리팩토링 한다. **
}
<br/>
여기서 실패란, 테스트 실패 뿐만 아니라, 빨간줄 즉 에러도 포함합니다.
<br/>
<hr/>
<br/>
코드를 통해 TDD 방식으로 계산기를 만들어 봅시다.
<br/>
<br/>
계산기 프로그램을 만들려고 합니다. 다음과 같은 테스트 목록을 작성하였습니다.
1. 계산기의 초기값을 따로 설정하지 않았을때는 0으로 설정된다.
2. 계산기의 초기값을 생성자를 통해 설정할 수 있다.
3. 계산기는 덧셈 기능을 제공한다.
4. 계산기의 덧셈 기능은 이전 계산 결과와 덧셈을 수행한다.
Maven Project를 하나 생성해주었고, JUnit 라이브러리를 추가하였습니다.
<br/>
다음으로 **1번 테스트(계산기의 초기값을 따로 설정하지 않았을때는 0으로 설정된다)**를 통과하는 코드를 작성하려고합니다.
1번 규칙(실패하는 테스트코드를 작성하는것 말고는, 절대 제품 코드를 작성하지 않는다)에 따라 실패하는 테스트코드를 먼저 작성합니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
}
}
작성 중 5번줄에서 빨간줄이 생겼습니다. Calcualtor 클래스가 정의되어있지 않기 때문입니다.
**2번 규칙(테스트코드를 작성할때 실패할 코드만큼만 작성한다)**에 따라 더 이상 테스트 코드를 작성하지 않습니다.
<br/>
**3번 규칙(테스트를 통과할만한 코드를 작성한다)**에 따라서, 빨간줄을 통과할 코드를 작성합니다.
다음 클래스를 만들어주었습니다. 에러가 사라졌습니다.
public class Calculator {
}
<br/>
다시 테스트코드 작성을 이어갑니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
}
<br/>
작성중 6번줄에서 빨간줄이 생겼습니다. getResult() 메소드가 정의되어 있지 않기 때문입니다.
2번 규칙에 따라, 더 이상 테스트 코드를 작성하지 않습니다.
<br/>
3번 규칙에 따라서, 빨간줄을 통과할 코드를 작성합니다.
다음과 같이 코드를 작성하였습니다.
public class Calculator {
public int getResult() {
return 0;
}
}
<br/>
<br/>
테스트를 실행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/WS6UIB181224235459.PNG" style="border-style:solid; border-width:1px"/>
1번 테스트를 통과하였습니다.
<br/>
다음으로 **2번 테스트(계산기의 초기값을 생성자를 통해 설정할 수 있다)**를 진행합니다.
1번 규칙에 따라서 실패하는 테스트 코드를 먼저 작성합니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
@Test
public void createCalculatorWithValue() {
Calculator calculator = new Calculator(10);
}
}
<br/>
작성 중 11번 줄에 빨간줄이 생겼습니다. 매개변수가 있는 생성자가 정의되어 있지 않기 때문입니다.
2번 규칙에 따라 테스트 코드 작성을 중지합니다.
<br/>
3번 규칙에따라 코드를 작성합니다.
public class Calculator {
public Calculator() {
}
public Calculator(int result) {
}
public int getResult() {
return 0;
}
}
<br/>
<br/>
다시 테스트 코드를 작성합니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
@Test
public void createCalculatorWithValue() {
Calculator calculator = new Calculator(10);
assertEquals(10, calculator.getResult());
}
}
다음과 같이 테스트를 작성하였고, 빨간줄이 생성되지 않았습니다.
<br/>
테스트를 실행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/Q6RHEC181224235459.PNG" style="border-style:solid; border-width:1px"/>
실패하는 테스트가 발생하였습니다.
2번 규칙에 따라 테스트 코드 작성을 중지하였습니다.
<br/>
3번 규칙에 따라 테스트를 통과하는 코드를 작성합니다.
public class Calculator {
int result;
public Calculator() {
result = 0;
}
public Calculator(int result) {
this.result = result;
}
public int getResult() {
return result;
}
}
<br/>
테스트를 실행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/ZDGIVZ181224235459.PNG" style="border-style:solid; border-width:1px"/>
2번 테스트를 통과하였습니다.
<br/>
이제 **3번 테스트(계산기는 덧셈 기능을 제공한다)**를 진행합니다.
1번 규칙에 따라 실패하는 테스트 코드를 먼저 작성합니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
@Test
public void createCalculatorWithValue() {
Calculator calculator = new Calculator(10);
assertEquals(10, calculator.getResult());
}
@Test
public void testAdd() {
Calculator calculator = new Calculator();
calculator.add(20);
}
}
작성 중, 18번줄에서 빨간줄이 발생하였습니다. add()메소드가 구현되어있지 않기 때문입니다.
2번 규칙에 따라, 테스트 코드 작성을 중지합니다.
<br/>
3번 규칙에 따라서 코드를 작성합니다.
public class Calculator {
int result;
public Calculator() {
result = 0;
}
public Calculator(int result) {
this.result = result;
}
public int getResult() {
return result;
}
public void add(int i) {
}
}
<br/>
테스트 코드 작성을 이어갑니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
@Test
public void createCalculatorWithValue() {
Calculator calculator = new Calculator(10);
assertEquals(10, calculator.getResult());
}
@Test
public void testAdd() {
Calculator calculator = new Calculator();
calculator.add(20);
assertEquals(20, calculator.getResult());
}
}
<br/>
다음과 같이 작성하였고, 빨간줄이 생기지 않았습니.
<br/>
테스트를 실행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/ZBOKMC181224235459.PNG" style="border-style:solid; border-width:1px"/>
실패하는 테스트가 발생하였습니다.
2번 규칙에 따라 테스트 코드 작성을 중지합니다.
<br/>
3번 규칙에 따라 테스트를 통과하는 코드를 작성하였습니다.
public class Calculator {
int result;
public Calculator() {
result = 0;
}
public Calculator(int result) {
this.result = result;
}
public int getResult() {
return result;
}
public void add(int i) {
result = 20;
}
}
<br/>
<br/>
테스트를 수행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/DHJZPE181224235459.PNG" style="border-style:solid; border-width:1px"/>
테스트를 통과하였습니다.
<br/>
이제 **4번 테스트(계산기의 덧셈 기능은 이전 계산 결과와 덧셈을 수행한다)**를 진행합니다.
먼저 **1번 규칙에 **따라 실패하는 테스트를 작성합니다.
public class CalculatorTest {
@Test
public void createCalculator() {
Calculator calculator = new Calculator();
assertEquals(0, calculator.getResult());
}
@Test
public void createCalculatorWithValue() {
Calculator calculator = new Calculator(10);
assertEquals(10, calculator.getResult());
}
@Test
public void testAdd() {
Calculator calculator = new Calculator();
calculator.add(20);
assertEquals(20, calculator.getResult());
}
@Test
public void testTwiceAdd() {
Calculator calculator = new Calculator();
calculator.add(20);
calculator.add(30);
assertEquals(50, calculator.getResult());
}
}
테스트 코드를 작성하였고, 빨간줄이 발생하지 않습니다.
<br/>
테스트를 수행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/ZONUX2181224235459.PNG" style="border-style:solid; border-width:1px"/>
실패하는 테스트가 발생하였습니다.
2번 규칙에 따라 테스트 코드 작성을 중지하였습니다.
<br/>
3번 규칙에 따라 테스트를 통과하는 코드를 작성하였습니다.
public class Calculator {
int result;
public Calculator() {
result = 0;
}
public Calculator(int result) {
this.result = result;
}
public int getResult() {
return result;
}
public void add(int i) {
result = result + i;
}
}
<br/>
<br/>
테스트를 수행합니다.
<img src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/6XC3UP181224235459.PNG" style="border-style:solid; border-width:1px"/>
성공적으로 모든 테스트를 통과하였습니다.
<br/>