2021-1 아주대학교 캡스톤 디자인
Riot Games 유석문 개발이사님의 TDD 강의 정리 자료 입니다.
TDD 실습 코드
2021-1-Ajou-TDD-lee_seohyun
unit test를 잘한다 = 퀄리티 있는 유지, 보수가 용이한 코드를 만들 수 있다!
개발 초기 단계에서 bug가 발생한다면 수정 비용이 낮을 것이다.
하지만 개발이 완료되어서 고객에게 인도된 단계에서 bug가 발생했다면 수정 비용이 높을 것이다.
unit test는 버그를 가능한 빨리, 즉 feedback을 빠르게 받아서 개발하기 위함이다.
ATDD는 고객 관점에서의 test이고 TDD는 개발자 관점에서 동작이 제대로 되는지 확인하는 것이다.
개발자가 만드는 것이 의도대로 동작하는지 보기 위한 목적이다.
출근 -> 코드를 최신으로 업데이트 (여러명이 작업하기 때문에) -> full build (정상적으로 작동하는지)
-> TDD를 이용해서 기능 개발 -> integrate -> 문제없으면 check in -> 퇴근
Unit test give immediate feedback about the quality of implemented changes.
가능한 빨리 피드백을 받을 수 있는 방법이 필요하다. -> unit test
-> 좋은 코드를 바로바로 작성할 수 있다.
Unit tests do not require configuration.
여러가지들이 복잡하게 연결되어 있다. 문제가 발생했을 때 어디서 에러가 발생했는지 식별하기 어렵다. (ex DB 문제, 네트워크 문제...등등)
unit test는 자신이 작성한 코드에서만 테스트를 하기 때문에 문제 에러 확인이 용이하다.
현업에 나가면 isolation이 잘 시키느냐가 개발하고 검증하는데 중요하다.
Unit tests have no dependencies on a runtime environment.
dependency가 적을 수록 좋다. 명백하게 내 코드 문제인지 알기 쉽기 때문이다.
Unit tests must be automated and repeatable anytime.
반복했을 때 동일한 결과가 나와야 한다. 즉 자동화가 되어있어야 한다.
Unit tests have a Boolean outcome If the specification is violated, they should fail.
실패인지 성공인지 명백하게 나와야 한다. 문제가 있으면 명확하게 떨어져야 한다.
Unit tests are written in a timely manner Ideally before the production code.
제때 작성하는 것이 중요하다. 나중에 작성하는 경우는 유닛 테스트를 작성해서 얻을 수 있는 이점을 버리는 것이다. 개발자들이 한번에 한가지 문제에 집중하게 하는 효과가 크다. 한번에 단순한 문제에 집중하는 게 중요하다. test 코드를 먼저 작성하기 때문에 production code의 test ability가 높다.
Java, JUnit4를 이용해서 unit test를 진행했다. Bowling Game을 만들어 보았다.
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 없이 통과했다.
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 한 후 테스트 결과 통과되었다.