본문 바로가기
Test

JUnit5 (2)

by oncerun 2021. 3. 14.
반응형

 

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 프레임워크를 이용하는 것이 작성이 편리하다.

 

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

 

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

 

반응형

'Test' 카테고리의 다른 글

TDD 시작  (0) 2022.12.10
JUnit  (0) 2022.11.08
데이터베이스 연동 테스트  (0) 2022.10.14
Test  (0) 2021.03.14
JUnit5 (1)  (0) 2021.03.13

댓글