반응형
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 |
댓글