springboot+idea+junit5 통합

8353 단어 springboot
1. 아이디어가 Junit5를 통합하기 전에 Junit 플러그인을 설치한다.https://blog.csdn.net/nicolas12/article/details/812239382. Pom 의존도를 추가하는 방법:

        
            org.junit.platform
            junit-platform-launcher
            1.3.2
            test
        
        
        
            org.junit.jupiter
            junit-jupiter-engine
            5.3.2
            test
        

        
            org.junit.vintage
            junit-vintage-engine
            5.3.2
            test
        

        
            org.junit.jupiter
            junit-jupiter-params
            5.3.2
            test
        

        
            org.junit.jupiter
            junit-jupiter-api
            5.3.2
            test
        

3. 명명: 도구가 생성한 이름은 테스트 방법명 앞에 테스트와 이니셜 대문자를 붙이는 것이 일반적이다. 예를 들어addapps->testAddApps는 테스트에 따라 조건이 다르고 장면의 상황이 많기 때문에 일반적으로 서로 다른 참여 명명 규칙은 다음과 같다. 앞의 이름은 변하지 않고 뒤에 참여하는 조건,예를 들어testAddAppsWhenChannelIdIsZero와testAddAppsWhenChannelNotExist는 서로 다른 상황에서 When으로 서로 다른 조건을 연결하는 것이다.
4. 몇 가지 자주 사용하는 주석(org.junit.jupiter 패키지) A, @Test 표시 방법은 테스트 방법 B, @Disabled 표시는 이 테스트 방법을 건너뛸 것임을 나타낸다. C, @DisplayName은 테스트 클래스나 테스트 방법의 이름을 사용자 정의한다. 예를 들어
    @DisplayName("test Disabled")
    @Disabled
    @Test
    void testDisabled(){
        log.info("test Disabled");
    }

D, @BeforeEach 표시 방법은 모든 테스트 방법이 실행되기 전에 E, @AfterEach 표시 방법은 모든 테스트 방법이 실행된 후에 F를 실행합니다. @BeforeAll 표시 방법은 모든 테스트 방법이 실행되기 전에 실행됩니다(클래스 방법, 정적 방법 필요) G, @AfterAll 표시 방법은 모든 테스트 방법 이후에 실행됩니다(클래스 방법, 정적 방법 필요)
    @BeforeAll
    public static void BeforeEach() throws Exception {
        //            
        log.info("Run before all test methods run");
    }

    @BeforeEach
    public void before() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

H, @RepeatedTest(중복 테스트, 높은 동시 사용) I, @EnabledOnos(어떤 환경에서 실행되는지), 예를 들어 @EnabledOnos({LINUX, MAC}) 등도 사용자 정의로 예를 들 수 있다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@EnabledOnOs(MAC)
@interface TestOnMac {
}

@TestOnMac
void testOnMac() {
    // ...
}

@EnabledOnJre (어느 버전의 jre를 바탕으로 하는지) 예를 들어 @EnabledOnJre ({JAVA 9, JAVA 10}) 5, 단언 A, assertEquals 단언 예상값과 실제값이 같다 (파라미터는 int double string 등일 수 있다) B, assertFalse 단언 조건은 가짜 C, assertNotNull 단언은 빈 D가 아니라 assertFalse 단언 조건은 진짜 예이다.
//   int
assertEquals(Math.round(Double.valueOf(gson.fromJson(result, Map.class).get("code").toString())),0);
//      
assertEquals(result,"");
//   boolean
assertTrue(Math.round(Double.valueOf(gson.fromJson(result, Map.class).get("code").toString()))==0);

E, assumeTrue는 true로 가정할 때 실행되며 false인 경우 예를 들어 실행이 중단됩니다.
 assumeTrue(!gson.fromJson(result, Map.class).get("msg").toString().contains("channelId must more than or equal to 1"));
 assumeTrue(!gson.fromJson(result, Map.class).get("msg").toString().contains("name must hava a value"));
 assumeTrue(!gson.fromJson(result, Map.class).get("msg").toString().contains("appKey must hava a value"));

6. 매개 변수화 테스트 @ParameterizedTest(@Test 대체) @CsvSource(여러 매개 변수의 다중 그룹 테스트) @ValueSource(한 매개 변수의 다중 그룹 테스트) @EnumSource는 사실 @ValueSource와 차이가 많지 않고 매개 클래스를 다시 사용할 수 있습니다.예:
public enum ActivityLimitEnum {
  LIMIT(1,"  "),
  UNLIMIT(0,"    ");
}

@ParameterizedTest
@EnumSource(ActivityLimitEnum.class)
@DisplayName("      ")
void test(ActivityLimitEnum activityLimitEnum) {
  if (ActivityLimitEnum.LIMIT.equals(activityLimitEnum)) {
    assertFalse(false);
  } 
  else if (ActivityLimitEnum.UNLIMIT.equals(activityLimitEnum)) {
    assertTrue(true);
  }
}

@MethodSource(한 방법의 반환 값을 테스트 방법의 입참으로 하고 인용하는 방법의 반환 값은Stream, Iterator 또는 Iterable이어야 함)
@ParameterizedTest
    @MethodSource("stringGenerator")
    public void test(String str){
        System.out.println(str);
    }

    static Stream stringGenerator(){
        return Stream.of("hello", "world", "let's", "test");
    }

7. MockMvc 사용(아날로그 controller 요청 수신)
A, GET 요청
     /**
     * Method: findAppListByChannelId(Integer channelId)
     */
    @DisplayName("query apps information by channelId")
    @ParameterizedTest
    @ValueSource(strings = {"1", "2", "3"})
    public void testFindAppListByChannelId(String channelId) throws Exception {
        String result = mockMvc.perform(
                get("/v1/appver/apps/list-by-channel")    //   url,      get
                        .param("channelId", channelId)         //    
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
        ).andExpect(status().isOk())    //      200
                .andReturn().getResponse().getContentAsString();   //            

        assertTrue(Math.round(Double.valueOf(gson.fromJson(result, Map.class).get("code").toString()))==0);
    }

주의: get이 요청한 매개 변수는 모두 String 형식을 씁니다. param 방법으로 필요한 형식으로 자동으로 조립됩니다.
B, POST 요청
/**
     * Method: addApps(AppsBo appsBo)
     */
    @DisplayName("add apps information success")
    @ParameterizedTest
    @CsvSource({"app1, key1,1", "app2, key2,1"})
    public void testAddAppsSuccess(String name, String appKey, int channdlId) throws Exception {
        log.info("test testAddAppsSuccess end");
        Date date = new Date();
        AppsBo appsBo = new AppsBo();
        appsBo.setName(name);
        appsBo.setChannelId(channdlId);
        appsBo.setAppKey(appKey);
        String requestBody = gson.toJson(appsBo);
        Map map = gson.fromJson(requestBody, Map.class);
        map.put("createTime", date.getTime());
        String newRequestBody = gson.toJson(map);
        String result = mockMvc.perform(MockMvcRequestBuilders
                .post("/v1/appver/apps/add")
                .content(newRequestBody)
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andReturn()
                .getResponse().getContentAsString();|-----|-----|-----| 
        //assumeTrue    true       ,       
        assumeTrue(!gson.fromJson(result, Map.class).get("msg").toString().contains("The channel not exist"));
        assertEquals(Math.round(Double.valueOf(gson.fromJson(result, Map.class).get("code").toString())),0);
        log.info("test testAddAppsSuccess finished");
    }

몇 가지 방법에 대한 간단한 설명:
방법
역할
예를 들다.
param
요청된 매개 변수 설정 방법
.param(“channelId”, channelId)
post
요청 방법
.post("/v1/appver/apps/add")
content
요청 매개 변수
.content(newRequestBody)
contentType
매개변수 유형
.contentType(MediaType.APPLICATION_JSON)
accept
수신 반환 값 유형
.accept(MediaType.APPLICATION_JSON)
andExpect
실행 완료 후의 단언 추가
.andExpect(status().isOk())
andReturn
에서
.andReturn()
마지막으로 참고: 테스트는 데이터베이스의 데이터에 영향을 줄 수 없기 때문에 테스트 클래스에 다음과 같은 사무 스크롤을 추가해야 한다.
@Slf4j
@SpringBootTest
@ExtendWith(SpringExtension.class)
@Rollback
@Transactional
public class AppverAppsControllerTest {


테스트 용례에서 나온 몇 가지 문제: 1. 데이터를 추가할 때 중명 판단을 고려하고 assumeTrue 판단으로 되돌아오는 검사 제시어를 사용해야 한다.2. 데이터를 수정할 때 매개 변수 Id가 테이블에 존재하는지 고려해야 한다. 저장하지 않을 때 mybatis-plus는 이를 삽입 데이터 처리로 하고 데이터를 삽입할 때 일부 데이터가 비어 있지 않도록 해야 하기 때문에 사용자 정의 검사를 추가하고 assumeTrue로 되돌아오는 검사 제시어를 판단하여 Junit나postMan의 요청을 전문적으로 처리하는 것을 권장한다.데이터를 추가하는 것과 마찬가지로 각종 검사 문제를 고려해야 한다.

좋은 웹페이지 즐겨찾기