JUnit

SungBum Park·2021년 4월 4일
0
post-thumbnail

JUnit을 사용하면서 알게된 점을 정리하는 공간(주로 JUnit 5 위주)

1. JUnit 간단한 동작과정


  1. 테스트 클래스에서 다음의 조건을 만족하는 메서드를 모두 찾는다.
  • @Test 어노테이션이 붙음
  • 접근제어자가 public
  • 반환형이 void
  • 파라미터가 없음 (@ParameterizedTest 와 같은 어노테이션은 제외인듯함)
  1. 1번 과정에서 찾은 테스트 메서드마다 테스트 클래스의 오브젝트를 하나 만든다.
  2. @BeforeEach 어노테이션이 붙은 메서드가 있으면 실행한다.
  3. @Test 어노테이션이 붙은 메서드를 하나 호출하고 결과를 저장해둔다.
  4. @AfterEach 어노테이션이 붙은 메서드가 있으면 실행한다.
  5. 나머지 테스트 메서드에 대해 2 ~ 5번 과정을 반복한다.
  6. 모든 테스트의 결과를 종합해서 돌려준다.

주의할 점은 각 테스트 메서드의 실행 순서는 보장하지 않는다. (순서는 랜덤)

1.1. 실제 테스트 메서드마다 각각 오브젝트를 만드는지 알아보자.

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);
    }
}

2. 자주 사용하는 기능


참고자료


profile
https://parker1609.github.io/ 블로그 이전

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

놀라운 정보를 공유한 귀하의 블로그를 방문했습니다. 나는 당신이 제공한 정보를 정말 좋아합니다. mario games

답글 달기