JUnit Basic

Park Young Jun

Github : https://github.com/june0313

Y3S Study group : https://github.com/y3s-study

2018.02.27

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public int divide(int a, int b) {
        return a / b;
    }
}

Example 

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class CalculatorTest {

    @Test
    public void addTest() {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }
}

Basic Test Case 

calculator.add(1, 2) 의 결과 (result) 가 3이 되길 기대한다.

public class CalculatorTest {

    @Test
    public void addTest() {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }

    @Test
    public void subtractTest() {
        Calculator calculator = new Calculator();
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
    }
}

Multiple Test Case 

  • 여러 개의 테스트 메서드 작성 가능
  • 테스트가 실행되는 순서는 보장되지 않는다!
public class CalculatorTest {
    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void addTest() {
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }

    @Test
    public void subtractTest() {
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
    }
}

Remove duplicate 

각 @Test 가 실행되기 전에 @Before가 실행됨

public class CalculatorTest {
    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
        System.out.println("setup");
    }

    @Test
    public void addTest() {
        int result = calculator.add(1, 2);
        assertEquals(3, result);
        System.out.println("add");
    }

    @Test
    public void subtractTest() {
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
        System.out.println("subtract");
    }

    @After
    public void tearDown() {
        System.out.println("tearDown");
    }
}

JUnit Test Lifecycle

setup
add
tearDown
setup
subtract
tearDown

JUnit Basic Assert

org.junit.Assert 패키지

code ​설명
assertEquals(expected, actual) 두 값이 같은지 확인
assertTrue(expected)
assertFalse(expected)
참 / 거짓을 확인
assertNull(expected)
assertNotNull(expected)
객체의 null 여부 확인
assertSame(expected, actual)
assertNotSame(expected, actual)
두 객체의 동일성 여부 확인
assertArrayEquals(expected, actual) 두 배열이 같은지 확인

Assert with Hamcrest Matcher

Hamcrest Matcher?

  • 가독성 높은 테스트 코드를 작성할 수 있도록 도와주는 라이브러리
  • org.hamcrest.MatcherAssert.assertThat() 과 함께 사용
  • JUnit 의존성을 추가하면 hamcrest-core 도 자동 추가
  • hamcrest-all 라이브러리를 추가하면 훨씬 다양한 Matcher 사용 가능
// hamcrest-core example

assertThat(result, is(3));
assertThat(result, is(not(3)));

assertThat(result, is(nullValue()));
assertThat(result, is(notNullValue()));

assertThat(list, hasItems("apple", "banana"));
assertThat(list, not(hasItems("apple", "banana")));

assertThat("testString", containsString("test"));
assertThat("testString", startsWith("t"));
assertThat("testString", endsWith("g"));

Assert with AssertJ

AssertJ ?

  • Hamcrest Matcher 보다 더 멋진 테스트를 작성할 수 있다!
  • IDE의 자동완성 기능을 충분히 활용할 수 있다.
  • 테스트에 필요한 거의 모든 메서드를 제공한다.
assertThat(테스트 타켓).메소드1().메소드2().메소드3();

Assert with AssertJ

AssertJ String Test example

assertThat("Hello, world! Nice to meet you.")
    .isNotEmpty()
    .contains("Nice")
    .contains("world")
    .doesNotContain("ZZZ")
    .startsWith("Hell")
    .endsWith("u.")
    .isEqualTo("Hello, world! Nice to meet you.");

Assert with AssertJ

AssertJ Number Test example

assertThat(3.14d) // 주어진 3.14라는 숫자는
	.isPositive() // 양수이고
	.isGreaterThan(3) // 3보다 크며
	.isLessThan(4) // 4보다 작고
	.isEqualTo(3, offset(1d)) // 오프셋 1 기준으로 3과 같고
	.isEqualTo(3.1, offset(0.1d)) // 오프셋 0.1 기준으로 3.1과 같으며
	.isEqualTo(3.14); // 오프셋 없이는 3.14와 같다

Assert with AssertJ

AssertJ Collection Test example

assertThat(Arrays.asList("apple", "banana", "orange", "mango"))
    .isNotNull()
    .isNotEmpty()
    .contains("apple", "banana")
    .doesNotContain("kiwi")
    .containsExactlyInAnyOrder("mango", "orange", "banana", "apple")
    .containsSubsequence("banana", "orange")
    .startsWith("apple")
    .endsWith("mango")
    .containsExactly("apple", "banana", "orange", "mango");

Parameterized Test

동일한 테스트를 입력 값(조건)을 바꿔가면서 여러번 테스트 할때 사용

@RunWith(Parameterized.class)
public class CalculatorTest2 {
    @Parameter(value = 0) public int a;
    @Parameter(value = 1) public int b;
    @Parameter(value = 2) public int expected;
    private Calculator calculator;

    @Parameters
    public static Object[][] data() {
        return new Object[][]{
                {1, 2, 3},
                {10, 20, 30},
                {100, 200, 300},
                {1000, 2000, 3000}
        };
    }

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void addTest() {
        assertThat(calculator.add(a, b)).isEqualTo(expected);
    }
}

Etc..

1. 실행 시간 테스트

@Test(timeout = 2000)
public void addTest() {
    assertThat(calculator.add(a, b)).isEqualTo(expected);
}

2. 예외 발생 테스트

@Test(expected = RuntimeException.class)
public void addTest() {
    assertThat(calculator.add(a, b)).isEqualTo(expected);
}

More to study...

  • Test Double
  • Mockito
  • TDD
  • BDD
  • Spock
  • JUnit5

숫자 야구 게임 TDD :

https://www.youtube.com/watch?v=960hX13PDuk

TDD로 문자열 계산기 만들기 :

https://www.youtube.com/watch?v=rEkPAfZw41o&t=494s

Thank you!

JUnit Basic

By Young Jun Park (박영준)

JUnit Basic

기본적인 JUnit의 동작 방식 및 사용법에 설명합니다.

  • 374