728x90

JUnit 시리즈

[JUnit]JUnit IDE에서 사용하기(1)

[JUnit]JUnit으로 유닛 테스팅하기(2)


※JUnit은 3, 4, 4 버전의 사용법이 많이 다른편이다.

필자는 5버전을 사용하고 있으므로 사용시 참고하라


JUnit은 3,4,5모두 사용법에 차이가 있다.

필자는 5버전에서 하고 있으므로 필자코드가 안된다면

여러분은 다른버전에 하고있을 가능성이 높다.


JUnit시리즈 링크에 1장에 보면 각각의 IDE에서 어떻게 JUnit을 import할 수 있는지에 대해서 여러분에게 알려드렸다.

그럼 이제 JUnit을 사용해볼 때가 왔다.

사실 이번장에 알려주는 것만으로도 JUnit을 대부분 사용할 수 있다.

일단 전혀 어려운 라이브러리가 아니다.

먼저 여러분은 유닛테스트가 무엇인지 알 필요가 있다.

그래야 지금부터 무엇을 하는지를 의미를 가질 수 있다는 것이다.


기본적으로 Unit테스트를 하는 이유는 현재 내가 만든 클래스가 내가 의도한대로 동작하는지를 확인하기 위해서다.

가령 여러분이 Calculator(계산기)라는 클래스를 만들었다면 이 클래스가 정말 의도한대로 동작하는지 테스트하는 것이다.

여러분은 이 때까지 만약 Unit테스트를 몰랐다면 아마 정말 어플리케이션을 실행하고

값을 대입하면서 의도한대로 나오는지 안나오는지 테스트를 해봤을 것이다.

그런데 이렇게 작업하는건 시간도 길게 걸릴 뿐더러 경우에 맞는 테스트를 하기위해서

코드를 수정해야하는 경우까지 있었다.

이러한 작업들을 쉽게 명령어 하나로 할 수 있지 않을까해서 시작한게 바로 유닛테스트이다.


package net.theceres;

public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String nameDecorate(String str) {
return this.name + str;
}

public boolean isMatchAge(int age) {
return this.age == age;
}
}

일단 Person클래스가 존재한다고 가정하여 보자.

해당 클래스는 특별한게 없는 Data클래스인데 이 클래스를 만들고나서

이 클래스가 정말 의도대로 돌아가는지 Person이 가지고있는 nameDecorate와 isMatchAge를 테스트해보자.

일단 당연하지만 JUnit을 클래스패스에 포함시켜야한다. 해당 방법을 모른다면 1번 강의를 참조하라.


package net.theceres;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class PersonTest {
@Test
@DisplayName("Person's nameDecorate method's test")
void nameDecorate() {
Person p = new Person("kukaro", 26);
assertEquals("kukarogood", p.nameDecorate("good"),"fail");
}

@Test
void isMatchAge() {
Person p = new Person("kukaro", 26);
assertNotNull(p,"is null");
}
}

보통 특정 클래스를 테스팅하기 위해서는 클래스명 뒤에 Test를 붙힌다.

JUnit4이상부터는 class명에 제한이 없다. 따라서 Test를 붙혀도 되고 안붙혀도된다.

메소드는 각각의 테스트 캐이스가 된다.


필자의 경우 두개의 메소드를 만들었는데

해당 메소드는 당연히 여러분이 만든 메소드와 1대1 대응이 되게 만들었다.

이겄도 당연하지만 1대1 대응이 되게 만들지 않아도 무방하다.

중요한건 애너태이션으로 Test를 붙혀줘야한다.

그렇게해야 이게 테스트 캐이스인것을 알 수 있기 때문이다.

또한 함수의 반환형은 void로 해줘야한다.

이제 assert에 대해서 설명하려고한다.


assertArrayEquals - 두 배열이 똑같은 값을 가진 똑같은 크기의 배열인지 확인

assertEquals - 두 값이 똑같은 값인지 확인

assertTrue - 해당 값이 True인지 확인

assertFalse - 해당 값이 False인지 확인

assertNull - 해당 값이 Null인지 확인

assertNotNull - 해당 값이 Null이 아닌지 확인

assertSame - 두 개체가 같은 개체인지 확인

assertNotSame - 두 개체가 같은 개체가 아닌지 확인

fail - 무조건 실패

assertThat - 해당 개체가 특정 상황을 만족하는지 확인


assert는 원래 C에서 쓰던 디버깅용 함수였다.

그 전통이 내려와서 지금도 이름이 assert인데 assert메소드들은 해당 상황이 틀리면 fail를 반환한다.

즉 테스팅에 실패하는 것이다.

위의 테스팅 상황을 한번보면 PersonTest라는 테스트 캐이스는 총 두개의 테스트가 존재한다.

PersonTest는 이 두개의 테스트중 하나라도 fail이면 fail이 반환된다.

각각 캐이스도 각각 fail이 될 가능성은 얼마든지 가지고있다.

그럼 먼저 한가지를 보도록하자.


@Test
@DisplayName("Person's nameDecorate method's test")
void nameDecorate() {
Person p = new Person("kukaro", 26);
assertEquals("kukarogood", p.nameDecorate("good"),"fail");
}

해당 클래스는 두개의 애너테이션을 가지고 있다.

Test 애너테이션은 이를 Test캐이스중 하나로 인식하게 한다.

DisplayName은 이게 테스트시에 출력될 메시지이다.

이 테스트에서 Person을 임시로 만들고

이 클래스의 nameDecorate메소드에 good을 넣은 값과

kukarogood이라는 문자열이 동등(equals)하다면 성공

아니라면 실패를 반환한다.

일반적으로 assertEqulas메소드는 파라메터가 두개이지만 예제에서는 3개이다.

이렇게 모든 assert는 마지막에 message라는 파라메터가 존재하는데 이는 실패시 출력될 메시지이다.

그럼 이 테스트 캐이스를 테스트해보도록 하자.



테스팅을할때 잘보면 오른쪽에 재생버튼이 있다.(IntelliJ기준) 눌러주면된다.

다른 IDE에서도 그냥 해당 클래스를 run시키면된다.


이클립스에서는 우클릭을 해서 JUnit Test를 눌러주면 간단히 실행할 수 있다.




성공할경우 외와같이 된다.

@Test
@DisplayName("Person's nameDecorate method's test")
void nameDecorate() {
Person p = new Person("kukaro", 26);
assertEquals("kukarogood", p.nameDecorate("god"),"fail");
}

자세히 보면 조금 바꼈는데 good이 아니라 god으로 바꿨다.

이는 예제에서 실패하게 된다. 실패할 경우 어떻게 나오는지 확인하자.



실패할 경우 외와 같이 된다. 그리고 실패한경우의 우리가 적은 메시지(여기서는 fail)가 출력됨을 확인할 수 있다.

+ Recent posts