TDD(Test Driven Develp), 테스트 주도개발

<br/>

<img src="https://file.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://file.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://file.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://file.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://file.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://file.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://file.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://file.podo-dev.com/blogs/images/2019/07/10/origin/6XC3UP181224235459.PNG" style="border-style:solid; border-width:1px"/>

성공적으로 모든 테스트를 통과하였습니다.

<br/>

0
이전 댓글 보기
등록
TOP