TDD 강의 정리

이서현·2021년 4월 10일
0

Capstone

목록 보기
1/1

2021-1 아주대학교 캡스톤 디자인
Riot Games 유석문 개발이사님의 TDD 강의 정리 자료 입니다.

TDD 실습 코드
2021-1-Ajou-TDD-lee_seohyun

1. Unit test

unit test를 잘한다 = 퀄리티 있는 유지, 보수가 용이한 코드를 만들 수 있다!

개발 초기 단계에서 bug가 발생한다면 수정 비용이 낮을 것이다.
하지만 개발이 완료되어서 고객에게 인도된 단계에서 bug가 발생했다면 수정 비용이 높을 것이다.

unit test는 버그를 가능한 빨리, 즉 feedback을 빠르게 받아서 개발하기 위함이다.


ATDD는 고객 관점에서의 test이고 TDD는 개발자 관점에서 동작이 제대로 되는지 확인하는 것이다.
개발자가 만드는 것이 의도대로 동작하는지 보기 위한 목적이다.

출근 -> 코드를 최신으로 업데이트 (여러명이 작업하기 때문에) -> full build (정상적으로 작동하는지)
-> TDD를 이용해서 기능 개발 -> integrate -> 문제없으면 check in -> 퇴근

The F.I.R.S.T rule of unit test

1. Fast

Unit test give immediate feedback about the quality of implemented changes.
가능한 빨리 피드백을 받을 수 있는 방법이 필요하다. -> unit test
-> 좋은 코드를 바로바로 작성할 수 있다.

2. Isolation

Unit tests do not require configuration.
여러가지들이 복잡하게 연결되어 있다. 문제가 발생했을 때 어디서 에러가 발생했는지 식별하기 어렵다. (ex DB 문제, 네트워크 문제...등등)
unit test는 자신이 작성한 코드에서만 테스트를 하기 때문에 문제 에러 확인이 용이하다.
현업에 나가면 isolation이 잘 시키느냐가 개발하고 검증하는데 중요하다.

Unit tests have no dependencies on a runtime environment.
dependency가 적을 수록 좋다. 명백하게 내 코드 문제인지 알기 쉽기 때문이다.

3. Repeatable

Unit tests must be automated and repeatable anytime.
반복했을 때 동일한 결과가 나와야 한다. 즉 자동화가 되어있어야 한다.

4. Self validating

Unit tests have a Boolean outcome If the specification is violated, they should fail.
실패인지 성공인지 명백하게 나와야 한다. 문제가 있으면 명확하게 떨어져야 한다.

5.Timely

Unit tests are written in a timely manner Ideally before the production code.
제때 작성하는 것이 중요하다. 나중에 작성하는 경우는 유닛 테스트를 작성해서 얻을 수 있는 이점을 버리는 것이다. 개발자들이 한번에 한가지 문제에 집중하게 하는 효과가 크다. 한번에 단순한 문제에 집중하는 게 중요하다. test 코드를 먼저 작성하기 때문에 production code의 test ability가 높다.

2. Unit test 실습

Java, JUnit4를 이용해서 unit test를 진행했다. Bowling Game을 만들어 보았다.

2.1 The first test

test code

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class BowlingGameTest {

	@Test
	public void testGutterGame() {
		Game g = new Game();
		for(int i=0;i<20;i++) {
			g.roll(0);
		}
		
		assertEquals(0,g.score());
	}
}

Game.java

public class Game {
	public void roll(int pins) {
		// TODO Auto-generated method stub
		
	}
	public int score() {
		// TODO Auto-generated method stub
		return 0;
	}
}

test 결과 error 없이 통과했다.

2.2 The second test

test code

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class BowlingGameTest {

	protected Game g;
	@Before
	public void setUp() {
		g = new Game();
	}
	
	@Test
	public void testGutterGame() {
		rollMany(20,0);
		
		assertEquals(0,g.score());
	}
	
	@Test
	@Ignore
	public void testAllOnes() {
		rollMany(20, 1);
		
		assertEquals(20,g.score());
	}

	protected void rollMany(int n, int pins) {
		for(int i=0;i<n;i++) {
			
			g.roll(pins);
		}
	}
}

Game.js


public class Game {

	public void roll(int pins) {
		
	}

	public int score() {
		return 0;
	}


}

testcode에서 @Ignore은 테스트를 하지 않는다는 의미이다. @Before은 테스트 이전에 수행하게 된다. 코드에서 중복되는 부분을 refactor 한 후 테스트 결과 통과되었다.

profile
안녕하세요. 이서현입니다( ღ'ᴗ'ღ )

0개의 댓글