Post

JUnit으로 테스트 케이스 작성하는 법: 기본 어노테이션과 어설션 활용하기

UnitTest 추가하기


우리 Q&A 플랫폼은 앞만 보고 달려왔다! 이제 어느정도 성과도 이뤘고 조금씩은 안정석에 신경을 쓸때가 오고 있다 그에 대한 첫 걸음은 바로 Unit Test 를 추가하는 것이다! Unit Test 는 미리 요구사항이 들어왔을때 했었으면 참 좋았을거 같은데 아쉽게도 그러지 못했기에 지금이라도 보충하여 신입개발자들이 오거나 큰 기능 개발이 있을떄 TC를 돌려보면서 안정감있게 개발을 할 것이다!

Junit 의 기본!


우선 우리가 테스트 하려고 하는 Class 를 Byungwook 이라고 하나 만들어 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// src/main/java/com/test/utils/Byungwook.java
@Component
public class Byungwook {

	public String makeSpaceId(String spaceName) {
		return String.format("%s:%s", "space", spacename);
	}

	public String extractSpaceName(String spaceId) {
        int colonIndex = spaceId.indexOf(':');
	    if (colonIndex < 0) return "";
        return input.substring(colonIndex + 1);
    }
}

spaceName 으로 qna 를 넣었다면 space:qna 를 리턴하는 간단한 makeSpaceId 메소드가 있다. 또 spaceId 를 받으면 spaceName 을 리턴하는 메소드도 있다. 이 친구들의 TestCase를 만들어 보자! 우선 test directory 를 만들어 주고 그 안에 같은 구조로 폴더를 구성한다

1
2
3
4
5
6
7
// src/test/java/com/test/utils/ByungwookTest.java

package com.test.utils;

public class ByungwookTest {

}

그리고 그 아래에 TestCase 를 하나씩 만들어 주면 된다. 테스트 케이스를 만들때 사용하는 기본적인 annotation 이 몇가지 있다.

1
2
3
4
5
@BeforeClass // 테스트 클래스 실행 제일 전에 한번 실행
@AfterClass // 테스트 클래스 실행 마지막에 한번 실행
@Before // 각 테스트 케이스 실행 전에 각각 한번씩 실행
@After // 각 테스트 케이스 실행 후에 각각 한번씩 실행
@Test // 각 테스트 케이스

따라서 처음에 진행해야하거나 initialize 해야할 정보들이 있으면 저 annotation 을 method위에 적어서 사용하면 좋다! 또 assert 를 이용해서 우리가 원하는 값이 나왔는지 확인을 주로 하는데 보통 Assert.* 를 임포트해서 사용하고 있다.

1
import static org.junit.Assert.*;

종류는 다양하지만 내가 주로 사용하는것은 이정도이다

1
2
3
4
5
6
7
assertTrue(condition); // condition 이 true 면 성공
assertFalse(condition); // condition 이 false 면 성공
assertEquals(expected, actual); // expected 와 actual 의 값이 같으면 성공
assertSame(expected, actual); // expected와 actual이 같은 주소값이면 성공
assertNull(actual); // actuaㅣ이 null이면 성공
assertNotNull(actual); // actual이 null 이 아니면 성공

그러면 위의 TestCase 는 다음과 같이 작성을 해 볼 수 있을것이다!

예시 TestCase


TestCase 를 작성할때 우리는 우리끼리 정한 ground rule 이 있다.

  1. given, when, then 을 작성해 주는것이 나중에 TC 를 수정할때 아주 좋다!
  2. 그리고 TC 의 이름은 TC의 이름만 보아도 어떤 테스트를 진행중인지 알수 있도록 우리는 should + {원하는 행동} + when + {주어진 상황} 이런 형식으로 작성을 하고 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// src/test/java/com/test/utils/ByungwookTest.java

package com.test.utils;

import static org.junit.Assert.*;

public class ByungwookTest {

	Byungwook byungwook;

	@Before
	public class setUp() {
		//Given
		byungwook = new Byungwook();
	}

	@Test
	public class shouldGetProperSpaceIdWhenGetIdFromSpaceName () {
		//When
		String spaceName = "sample";
		String actualSpaceId = byungwook.makeSpaceId(spaceName);

		//Then
		String expectedSpaceId = "space:sample";
		assertEquals(expectedSpaceId, actualSpaceId);
		
	}

	@Test
	public class shouldGetEmptySpaceNameWhenExtractNameFromInvalidSpaceId() {
		//When
		String invalidSpaceID = "invalid";
		String actualSpaceName = byungwook.extractSpaceName(invalidSpaceID);

		//Then
		String expectedSpaceName = "";
		assertEquals(expectedSpaceName, actualSpaceName);
	}
}

이렇게 Test 를 작성 할 수 없는 경우가 있다.


바로 다른 Class 에 의존하고 있는 경우다 제일 자주 발생하는 것이 DB 와 연결이 되는 Class 와 의존성이 있는 경우 인데 이런 경우에는 Mock 이라는 개념을 활용 해야 한다! Mock 은 다음번에 정리하도록 하겠다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.