JUnit을 사용하면서 알게된 점을 정리하는 공간(주로 JUnit 5 위주)
- JUnit 5 공식 사이트: https://junit.org/junit5/
@Test
어노테이션이 붙음public
void
@ParameterizedTest
와 같은 어노테이션은 제외인듯함)@BeforeEach
어노테이션이 붙은 메서드가 있으면 실행한다.@Test
어노테이션이 붙은 메서드를 하나 호출하고 결과를 저장해둔다.@AfterEach
어노테이션이 붙은 메서드가 있으면 실행한다.주의할 점은 각 테스트 메서드의 실행 순서는 보장하지 않는다. (순서는 랜덤)
public class InstanceTest {
private int num = 10;
@Test
void changeTo20() {
System.out.println("changeTo20 Test Method : " + this);
Assertions.assertThat(num).isEqualTo(10);
this.num = 20;
Assertions.assertThat(num).isEqualTo(20);
}
@Test
void changeTo30() {
System.out.println("changeTo30 Test Method : " + this);
Assertions.assertThat(num).isEqualTo(10);
this.num = 30;
Assertions.assertThat(num).isEqualTo(30);
}
@Test
void changeTo40() {
System.out.println("changeTo40 Test Method : " + this);
Assertions.assertThat(num).isEqualTo(10);
this.num = 40;
Assertions.assertThat(num).isEqualTo(40);
}
}
위의 테스트 코드를 동작해보면, 각 테스트 메서드마다 인스턴스 변수 값이 초기화한 10의 값을 가지는 것을 볼 수 있다. 만약 하나의 오브젝트에서 동작한다면, 각 테스트 메서드마다 이 값을 변경해주므로 2 개의 테스트 메서드는 실패해야 한다. 하지만 실제로는 메서드마다 각각의 오브젝트를 만들기 때문에 인스턴스 변수 역시 모두 초기값을 유지한다.
물론, 인스턴스 주소값 출력은 다음과 같이 각 메서드마다 다른 주소값을 나타낸다.
changeTo20 Test Method : InstanceTest@4ef8e038
changeTo30 Test Method : InstanceTest@6c35a6d9
changeTo40 Test Method : InstanceTest@698bd9d3
즉, 각 테스트 메서드는 완전히 독립된 환경에서 동작한다. 이는 JUint 의 테스트 철학인 각 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 확실히 보장한다.
토비의 스프링 1권에 보면 이를 테스트하는 학습 테스트 코드를 확인할 수 있다. (위처럼 눈으로 확인이 아닌 자동으로 확인할 수 있는 테스트 코드이다.)
public class JUintTest {
static Set<JUintTest> testObjects = new HashSet<>();
@Test
void test1() {
Assertions.assertThat(testObjects).doesNotContain(this);
testObjects.add(this);
}
@Test
void test2() {
Assertions.assertThat(testObjects).doesNotContain(this);
testObjects.add(this);
}
@Test
void test3() {
Assertions.assertThat(testObjects).doesNotContain(this);
testObjects.add(this);
}
}
Strategy games snake require planning and forethought, fostering strategic thinking.
놀라운 정보를 공유한 귀하의 블로그를 방문했습니다. 나는 당신이 제공한 정보를 정말 좋아합니다. mario games