springboot+idea+junit5 통합
8353 단어 springboot
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의 요청을 전문적으로 처리하는 것을 권장한다.데이터를 추가하는 것과 마찬가지로 각종 검사 문제를 고려해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.