참고
https://junit.org/junit5/docs/current/user-guide/#overview-what-is-junit-5
XPath로 HTML 본문 테스트시
https://www.w3schools.com/xml/xpath_syntax.asp
https://www.freeformatter.com/xpath-tester.html#ad-output
그래들
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
Annotations
JUnit4 | JUnit5 | 설명 |
@BeforeClass | @BeforeAll | 테스트 실행 전 최초 1회 실행 (static void) |
@Before | @BeforeEach | 모든 @Test 실행 전에 실행 |
@After | @AfterEach | 모든 @Test 실행 후에 실행 |
@AfterClass | @AfterAll | 테스트 종료 후 마지막 1회 실행 (static void) |
@Ignore | @Disabled | 테스트 실행 제외 |
@RunWith(SpringRunner.class) | @ExtendWith(SpringExtension.class) | Runner 지정 |
@Test | 테스트 케이스 | |
@ParameterizedTest | @ValueSource와 함께 사용 ex) @ParameterizedTest @ValueSource(ints={2,3,4,5,6,Integer.MAX_VLUE}) 파라메터 하나하나를 모두 테스트, @NullSource, @NullAndEmptySource, @CvsSource() name = "{index} {displayName} message = {0} |
|
@RepeatedTest(반복횟수) | RepetitionInfo ri 인자 사용 가능, 반복횟수, 총반복횟수 참조가능 | |
@DisplayName | 테스트 메서드 설명 create_new_study | |
@DisplayNameGeneration | 클래스, 메서드, | |
예외테스트 | assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(()->obj.func()); |
|
@DataJpaTest | 리포지토리 관련 Bean 등록 : JPA 테스트시 사용 JPA테스트시 하이버네이트는 실제 쿼리를 날리지는 않음 RallBack할 걸 알기 때문 테스트에서 쿼리를 보려면, @Test @Rollback(false) 를 함께 사용 |
|
@WebMvcTest | MockMvc 주입 : 컨트롤러 테스트 시 사용 | |
테스트 구조 | // Given : 이런 조건하에서 // When : 이렇게 했을때 // Then : 이렇게 되길 기대한다 |
|
@Import(Config.class) | Config.class에서 필요 @Bean 등록 | |
@TestInstance(Lifecycle.PER_CLASS) | 테스트시 테스트별로 각 인스턴스를 만들어서 테스트 안하고 하나의 인스턴스로 | |
@TestMethodOrder | 각각의 테스트에 실행 순서를 정한다 (MethodOrderer.OrderAnnotation.class)사용시 @Order(숫자)로 지정 가능 |
|
@ExtendWith | @RegisterExtension 으로 Field 에 가져올 수도 있음 |
@WebMvcTest(SampleController.class)
class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
@DisplayName("헬로우월드 테스트")
public void helloWorldTest() throws Exception {
mockMvc.perform(get("/hello"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string("HelloWorld"));
}
}
@DisplayName("라이프사이클 테스트")
public class LifecycleTest {
@BeforeAll // JUnit 4의 @BeforeClass
static void initAll() {
System.out.println("initAll");
}
@BeforeEach // JUnit 4의 @Before
void init() {
System.out.println("init");
}
@DisplayName("어떤 테스트")
@Test
void someTest() {
System.out.println("someTest");
}
@Disabled("테스트 실행 제외")
@Test
void anyTest() {
System.out.println("anyTest");
}
@AfterEach // JUnit 4의 @After
void tearDown() {
System.out.println("tearDown");
}
@AfterAll // JUnit 4의 @AfterClass
static void tearDownAll() {
System.out.println("tearDownAll");
}
}
@SpringBootTest
@AutoConfigureMockMvc
class SamplConTest{
@Autowired
MockMvc mockMvc;
@Test
public void hello(){ }
}
Assert Method
https://javacan.tistory.com/entry/JUnit-5-Intro
assertEquals(expected, actual) | 기대하는값, 실제값, () -> "설명메시지", 실제값이 기대값과 같은지 확인 |
assertNotEquals | assertNotEquals(Object unexpected, Object actual) |
assertTrue(boolean condition) | 다음 조건이 참 인지 확인 |
assertFalse(boolean condition) | |
assertNull(Object actual) | 값이 null인지 아닌지 확인 |
assertNotNull(Object actual) | |
assertTimeout(duration,executalbe) assertTimeoutPreemptively: 특정시간 넘어가면 실행 바로 종료 |
assertTimeout(Duration.ofMillis(100), ()->{ new Study(10); Thread.sleep(300); }); |
fail() | |
@EnabledOnOS @DisabledOnOS @EnabledOnJre @EnabledIfEnvironmentVariable |
|
assertAll(람다식, ...) | 첫번째 람다식이 실패해도 나머지 모든 람다식 테스트 수행 assertAll( () -> assertEquals(2, score.getA()), () -> assertEquals(1, score.getB()) ); |
assertThrows() | @Test void simple() { ArithmeticException exception = assertThrows(ArithmeticException.class, () -> divide(100, 0)); String message = exception.getMessage(); assertEquals("하하하", exception.getMessage()); } private int divide(int op1, int op2) { return op1 / op2; } throw new IllegalArgumentException("limit은 0보다 커야 한다."); |
assumeTrue() assumeFalse() |
인자로 전달받은 값이 true일 경우에만 이후 테스트 진행 @Test void runTest_IfWindonw() { assumeTrue(System.getProperty("os.name").startsWith("Windows")); assertEquals(1, 2); } @Test void runTest_IfLinux() { assumeTrue(() -> System.getProperty("os.name").startsWith("Linux")); assertEquals(1, 2); } |
assumingThat() | 지정한 가정을 충족한 경우 지정한 검증 수행 @Test void runTest() { String osName = System.getProperty("os.name"); assumingThat( osName.startsWith("Linux"), // (1) 가정 boolean 또는 BooleanSupplier () -> assertEquals(1, 2) // (2) 가정을 충족할 때 실행할 코드(Executable 타입) ); assertEquals(1, 1); // (3) } |
@Tag("name") | 클래스, 메소드에 태깅 가능, 그래들이나 메이븐 설정에서 특정 테스트를 제외 가능 그래들 junitPlatform { filters { tags { include 'slow', 'very-slow' exclude 'pay' } } } |
AssertJ, Hemcrest ...
https://umanking.github.io/share/2020/03/07/intellij-gradle-test.html