설모의 기록

[JUnit] 단위테스트를 위한 JUnit Framework 본문

언어/Spring

[JUnit] 단위테스트를 위한 JUnit Framework

HA_Kwon 2018. 7. 4. 01:22


이 포스트는 Java 언어를 이용해 프로그램을 구현해 나갈 때, 단위 테스트를 수행하기 위해 사용하는 프레임워크인 JUnit에 대한 내용입니다.

프로그램을 구현하다보면 지금 내가 작성하고 있는 코드가 정상적으로 수행되는 코드인지가 궁금한 경우가 많습니다. Java의 경우 System.out.print() 또는 디버깅 툴을 이용해 알아보고, JavaScript, TypeScript 의 경우에는 console.log() 를 이용하거나 debugger를 이용해 알아볼 수는 있습니다. 그러나 코드 중간중간의 단위에 대한 결과값을 빠르게 보기에는 어려움이 많습니다. 중간 결과를 알아보기 위해 이전에 수행해야하는 작업까지 모두 수행한 후 알아볼 수 있기 때문입니다. 

이럴 때 유용한 프레임워크가 바로 JUnit 입니다. 우아한테크캠프 2기에 참여하면서 알게된 프레임워크인데요. 내가 구현한 함수가 제대로 구현한 함수인지, 결과값이 내가 예상한 값과 일치하는지를 비교하는데에 유용하게 사용할 수 있습니다. 그러나 테스트 코드를 작성하려면 접근 제어자를 수정해 더 열여줘야 한다거나 극단적으로는 모두 public으로 구현해야할 때도 있습니다. 따라서 필요한 테스트 코드만 적절히 구현하는 것이 좋을 것 같습니다.

JUnit은 다수의 테스트에서 동일한 코드를 수행할 때, 해당 코드를 여러 번 작성하지 않고 미리 정의해둔 것으로 재사용할 수 있습니다. 또한 시간을 확인할 수 있어 용이합니다.

아래의 코드는 JUnit 환경을 모두 세팅했다는 가정하에 사용법을 소개합니다.


JUnit 사용법

package racingcar;

public class Car {
private int position;
private String name;

public Car(int position, String name) {
this.position = position;
this.name = name;
}

int getPosition() {
return position;
}

public String getName() {
return name;
}

int move(int randomValue) {
if (randomValue >= 4)

this.position++;
return this.position;
}
}

위와 같이 Car 클래스를 구현해봅니다. Car 클래스는 position 과 name 을 인스턴스 변수로 가지고 있으며, 생성자 이외에 getPosition(), getName(), move() 함수를 가지고 있습니다. 이 때, 제가 테스트해보고 싶은 것은 Car 클래스의 인스턴스 객체의 move(4) 를 실행시키면 그 객체의 position 이 실제로 하나 증가하는지입니다. 이것을 알아보기 위해 우선 테스트 클래스를 생성합니다. 



 

[그림 1]                                                                                                [그림 2]


[그림 3]

Car클래스에서 오른쪽 버튼을 클릭해 [그림 1]과 같이 Test를 클릭하거나, Cmd + Shift + T를 눌러 Create New Test를 클릭합니다. [그림 3] 창이 나타난다면 클래스 명은 원하시는 클래스 명으로 만든 후 Ok를 누르면 원하시는 패키지에 원하시는 CarTest 클래스가 생성됩니다.


package racingcar;

import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;


public class CarTest {
@Test
public void move() {
Car car = new Car(2, "hyeona`s car");
assertThat(car.move(4)).isEqualTo(3);
}
}

이제 CarTest코드에서 자동차가 제대로 움직이는지 확인하는 테스트 코드를 작성해보겠습니다. 위의 테스트 코드는 move() 함수를 테스트하는 코드입니다. 테스트 코드에는 상단에 @Test 라는 어노테이션을 붙여 테스트 코드라는 것을 명시하도록 합니다. 

JUnit은 기본적으로 assertXXX라는 메소드들을 이용해 테스트를 진행합니다. 위의 코드는 assertThat() 이라는 메소드로 테스트해본 예제입니다. Car 객체를 만들고 assertThat(실행값).isEqualTo(기대값); 을 이용해 4라는 랜덤값을 넘겼을 때 1칸 움직이는지를 확인했습니다. 테스트는 함수 옆에 작은 초록색 삼각형을 누르시면 됩니다. 성공하시면 status 0 이 출력되며 실패한다면 에러가 발생합니다. 

위의 CarTest는 move라는 하나의 테스트 코드를 가지고 있지만, 만약 move, stop, booster와 같이 여러 테스트 코드를 가지고 있다면 car 객체를 생성하는 코드가 모든 테스트 메소드마다 구현되어 있을 것입니다. 이것은 매우 비효율적입니다. 따라서 이럴때는 아래와 같이 setup()메소드를 구현해야 합니다.

package racingcar;

import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;


public class CarTest {
private Car car;

@Before
public void setUp() throws Exception {
car = new Car(2, "hyeona`s car");
}

@Test
public void move() {
assertThat(car.move(4)).isEqualTo(3);
}

@Test
public void stop() {
assertThat(car.move(3)).isEqualTo(2);
}
}

위의 코드는 move와 stop 두 개의 테스트 코드가 있습니다. 이 두 메소드 안에서 car 객체를 이용하기 때문에 car객체를 인스턴스 변수로 작성하고 setUp이라는 메소드안에서 초기화해줍니다. @Before 어노테이션은 모든 테스트 코드가 실행되기 이전마다 수행되며, @After 어노테이션은 모든 테스트 코드가 실행된 후마다 실행됩니다. 따라서 위의 코드의 실행 순서는 (setUp -> move), (setUp -> stop) 이 두 흐름이 실행되며 어느 것이 먼저되고 나중에 되는지는 알 수 없습니다.

이제 아래의 JUnit의 다양한 메소드를 이용해 테스트 코드를 구현해보시기 바랍니다.



JUnit의 다양한 메소드

  • assertArrayEquals(a, b) : 배열 a 와 배열 b 가 일치하는지를 검사
  • assertEquals(a, b)      : 객체 a 와 객체 b 가 같은지를 검사
  • assertSame(a, b)        : 객체 a 와 객체 b 가 같은 객체인지를 검사
  • assertNotSame(a, b)     : 객체 a 와 객체 b 가 같은 객체가 아님을 검사
  • assertTrue(a)           : a가 참인지를 검사
  • assertFalse(a)          : a가 거짓인지를 검사
  • assertNotNull(a)        : a가 null이 아닌지를 검사


'언어 > Spring' 카테고리의 다른 글

[Spring] 상속 관계 매핑  (4) 2018.10.05
[Spring] WebSocket 구현하기  (5) 2018.08.26
[Spring] 다대일, 일대다 연관관계 매핑  (1) 2018.08.17
[Spring] 영속성이란 (persistence)  (11) 2018.08.12
[Spring] Ehcache 캐시 사용  (1) 2018.08.08
Comments