TDD with JUnit 2

23
TDD with JUnit Test Driven Development Junyoung Lee 14528수요일

description

TDD with JUnit 2 We are the Java Experts 스터디 자료

Transcript of TDD with JUnit 2

Page 1: TDD with JUnit 2

TDD with JUnitTestDrivenDevelopment

Junyoung Lee14년 5월 28일 수요일

Page 2: TDD with JUnit 2

Never in the field of software development

was so much owed by

so many to so few lines of code

- Martin Fowler

14년 5월 28일 수요일

Page 3: TDD with JUnit 2

Need무엇을 테스트 할 것인가?

Test실패하는 테스트 작성

Code테스트를 통과하는 코드 작성

Refactoring코드의 중복 제거

TDD FlowRemind

14년 5월 28일 수요일

Page 4: TDD with JUnit 2

단위 테스트 프레임워크의 몇 가지 규칙

단위 테스트는 다른 모든 단위 테스트들과 독립적으로 실행되어야 한다.

프레임 워크는 테스트 각각의 오류를 식별하고 보고해야 한다.

어떤 테스트를 실행할 지 선택하기 쉬워야 한다.

14년 5월 28일 수요일

Page 5: TDD with JUnit 2

JUnit의 설계 목표

유용한 테스트를 작성하는 데 보탬이 되어야 한다.

시간이 지나도 가치가 변치 않는 테스트를 작성하는 데 보탬이 되어야 한다.

코드 재사용을 통해 테스트 작성 비용을 낮추는 데 보탬이 되어야 한다.

14년 5월 28일 수요일

Page 6: TDD with JUnit 2

계산기 클래스에서 시작하기public class Calculator { public double add(double number1, double number2) { return number1 + number2; }}

14년 5월 28일 수요일

Page 7: TDD with JUnit 2

public static void main(String[] args) { Calculator calculator = new Calculator(); double result = calculator.add(10, 50); if (result != 60) { System.out.println("Bad result: " + result); }}

간단한 add 메서드 테스트

14년 5월 28일 수요일

Page 8: TDD with JUnit 2

개선된 add 메서드 테스트private int nbErrors = 0;public void testAdd() { Calculator calculator = new Calculator(); double result = calculator.add(10, 50); if (result != 60) { throw new IllegalStateException("Bad Request: " + result); }}

public static void main(String[] args) { CalculatorTest test = new CalculatorTest(); try { test.testAdd(); } catch (Throwable e) { test.nbErrors++; e.printStackTrace(); } if (test.nbErrors > 0) { throw new IllegalStateException("There were " + test.nbErrors + " error(s)"); }}

14년 5월 28일 수요일

Page 9: TDD with JUnit 2

import org.junit.Test;import static org.junit.Assert.*;

public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); double result = calculator.add(10, 50); assertEquals(60, result, 0); }}

JUnit을 적용한 add 메서드 테스트

14년 5월 28일 수요일

Page 10: TDD with JUnit 2

JUnit����������� ������������������  핵심����������� ������������������  들여다����������� ������������������  보기

14년 5월 28일 수요일

Page 11: TDD with JUnit 2

JUnit의 핵심

테스트 클래스가 되기 위한 조건

- public 클래스

- 기본 생성자

테스트 메서드 되기 위한 조건

- @Test

- public 메서드

- 파라미터 X

- 반환형은 void

14년 5월 28일 수요일

Page 12: TDD with JUnit 2

JUnit의 핵심

JUnit은 각 @Test 메서드를 호출할 때 마다

테스트 클래스의 인스턴스를 새로 생성한다.

14년 5월 28일 수요일

Page 13: TDD with JUnit 2

JUnit의 핵심

테스트 검증에는 Assert 클래스에 정의된 assert 메서드를 사용

assertXxx 메서드assertArrayEquals(“message”, A, B)

assertEquals(“message”, A, B)

assertSame(“message”, A, B)

assertTrue(“message”, A)

assertNotNull(“message”, A)

...

14년 5월 28일 수요일

Page 14: TDD with JUnit 2

테스트 클래스(혹은 테스트 케이스)

@Test가 부여된 테스트를 하나 이상 포함한 클래스.

유사한 기능을 시험하는 테스트들을 함께 묶는데 사용한다.

테스트는 @Test가 부여된 메서드를 말하고,

테스트 케이스는 테스트 메서드를 포함한 클래스를 말함.

대개 테스트할 클래스 하나 당 테스트 클래스 하나를 만듦

14년 5월 28일 수요일

Page 15: TDD with JUnit 2

테스트 스위트

테스트들의 집합.

테스트 스위트는 관련된 테스트들을 함께 묶는 편리한 수단

테스트 클래스에 별도의 테스트 스위트가 정의되지 않았다면,

JUnit은 테스트 클래스 내의 모든 테스트를 포함하는

테스트 스위트를 자동으로 만들어 준다.

14년 5월 28일 수요일

Page 16: TDD with JUnit 2

테스트 러너

테스트 스위트 실행 엔진.

JUnit에는 테스트를 실행할 수 있는 다양한 러너가 준비되어 있다.

추후 커스텀 러너를 제작할 예정.

14년 5월 28일 수요일

Page 17: TDD with JUnit 2

Parameterized 테스트@RunWith(Parameterized.class)public class ParameterizedTest { private double expected; private double valueOne; private double valueTwo; @Parameters public static Collection<Integer[]> getTestParameters() { return Arrays.asList(new Integer[][]{ {2, 1, 1}, // 예상값, 값1, 값2 {3, 2, 1}, // 예상값, 값1, 값2 {4, 3, 1}, // 예상값, 값1, 값2 }); }

public ParameterizedTest(double expected, double valueOne, double valueTwo) { this.expected = expected; this.valueOne = valueOne; this.valueTwo = valueTwo; }

@Test public void sum() { Calculator calc = new Calculator(); assertEquals(expected, calc.add(valueOne, valueTwo), 0); }}

14년 5월 28일 수요일

Page 18: TDD with JUnit 2

Parameterized 테스트 러너 사용 조건

테스트 클래스에 @RunWith 애노테이션 부착

@RunWith(Parameterized.class)

@Parameters 메서드 필요

public static Collection<?[]> xxx()

컬렉션에 들어가는 배열의 길이는 생성자에 전달될 파라미터의 길이와 같아야 함

14년 5월 28일 수요일

Page 19: TDD with JUnit 2

JUnit이 제공하는 테스트 러너

org.junit.internal.runners.JUnit38ClassRunner

org.junit.runners.JUnit4

org.junit.runners.Parameterized

org.junit.runners.Suite

특정 Runner 지정

@RunWith(러너 클래스 이름.class)

14년 5월 28일 수요일

Page 20: TDD with JUnit 2

JUnitCore 퍼사드

테스트 수행,

결과 취함,

통계 제공

테스트에 사용할 러너를 자동으로 선정

JUnitCore가 제공하는 정보를 Eclipse의 플러그인에서 GUI 뷰로 보여줌

14년 5월 28일 수요일

Page 21: TDD with JUnit 2

스위트를 이용한 테스트 조직하기

테스트 클래스가 하나가 아니라면..?

테스트 클래스 하나하나 정성들여 실행?

기본 테스트 러너 기본 스위트 생성 테스트 클래스 실행

14년 5월 28일 수요일

Page 22: TDD with JUnit 2

스위트를 이용한 테스트 조직하기

테스트 스위트 작성

@RunWith(Suite.class)

@SuiteClassed({Classes..})

스위트는 테스트 클래스 내의 모든

@Test 메서드들을 찾아 실행하는 일종의 러너.

@RunWith(Suite.class)@SuiteClasses({ CalculatorTest.class, ParameterizedTest.class})public class AllTests {

}

14년 5월 28일 수요일

Page 23: TDD with JUnit 2

스위트의 스위트

@RunWith(Suite.class)@SuiteClasses({CalculatorTest.class})public class TestSuiteA { }

@RunWith(Suite.class)@SuiteClasses({ParameterizedTest.class})public class TestSuiteB { }

@RunWith(Suite.class)@SuiteClasses({TestSuiteA.class, TestSuiteB.class})public class MasterTestSuite { }

14년 5월 28일 수요일