Test

JUnit5 (2)

oncerun 2021. 3. 14. 16:54
반응형

 

Application Context가 고유한지 테스트를 3가지 방법으로 작성하는데 약간의 불편함이 있었다.

 

junit5에서는 assertThat을 제공해주지 않아서 Hamcrest 라이브러리를 추가해서 사용해봤다. 

JUnit4에서는 포함되었다고 하는데 JUnit5에서는 제외됐다.

  <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = Configuration.class)
public class JUnitTest {

    //테스트마다 어플리케이션 di
    @Autowired
    ApplicationContext context;

        static   Set<JUnitTest> jUnitTestSet = new HashSet<>();
        static  ApplicationContext contextObject = null;

        //스프링 애플리케이션 컨텍스트가 하나만 생성되는지 확인 test

    @Test
    void test1(){
        //set구조에 테스트 오브젝트가 존재하지 않는다면
        Assumptions.assumeFalse(jUnitTestSet.contains(this));
        jUnitTestSet.add(this);  //추가한다.

        //처음 테스트경우 null 값이므로 자동 주입받은 context를 contextObject에 추가한다.
        Assertions.assertTrue(contextObject == null || contextObject == this.context);
        //다음 테스트 실행되는 경우 전역 context가  contextObject와 동일해야한다.
        contextObject = this.context;

        }
    @Test
    void test2(){
        //set구조에 테스트 오브젝트가 존재하지 않는다면
        Assumptions.assumeFalse(jUnitTestSet.contains(this));
        jUnitTestSet.add(this);  //추가한다.

        //처음 테스트경우 null 값이므로 자동 주입받은 context를 contextObject에 추가한다.
        //Junit 5 경우 assertThat hamcrest 라이브러리를 사용해서 macther를 사용합니다.
        assertThat(contextObject == null || contextObject == this.context,is(true));
        //다음 테스트 실행되는 경우 전역 context가  contextObject와 동일해야한다.
        contextObject = this.context;

    }@Test
    void test3(){
        //set구조에 테스트 오브젝트가 존재하지 않는다면
        Assumptions.assumeFalse(jUnitTestSet.contains(this));
        jUnitTestSet.add(this);  //추가한다.

        //처음 테스트경우 null 값이므로 자동 주입받은 context를 contextObject에 추가한다.
        //contextObject가 널값이거나 인스턴스 context일경우 통과
        assertThat(contextObject,either(is(nullValue())).or(is(this.context)));
        //다음 테스트 실행되는 경우 전역 context가  contextObject와 동일해야한다.
        contextObject = this.context;

    }


}



 

test 1은 assertTrue를 사용해 해당 조건문이 true를 반환하는지 검사했다.

test2는 조건문을 받아서 그 결과가 true인지 확인하도록 만들어진 검증용 메서드를 사용했다.

test 3는  조건문을 비교하는 대신에 매처의 조합을 이용하는 방법을 사용했다.

either와 or를 통해 둘 중 하나라도 참이라면 통과하도록 만들었다. nullValue()는 해당 객체가 null값인지 확인하며 is는 값을 검증한다.

 

테스트는 자동화되어야 한다. 빠르게 실행되어야 한다. 이 말은 단위 테스트에 해당되며 가장 독립적인 단위여서 외부에 영향을 받으면 안 된다는 말인 것 같다.

 

테스트를 만들 때 main메서드를 통해 만드는 것보단 JUnit 프레임워크를 이용하는 것이 작성이 편리하다.

 

결과는 일관성이 있어야 한다. 코드 변경 없이, 환경, 실행 순서에 영향을 받으면 안 된다.

 

코드 작성과 테스트 수행의 간격이 짧을수록 효과가 있다.

 

반응형