spring boot(24)-test測試
阿新 • • 發佈:2019-02-20
如果直接用junit去測試一個方法,即使測試成功,這個方法在spring中執行時也可能會有不同的結果,因為spring是一個整合環境,會載入很多東西,從而影響最終結果。本篇將介紹spring boot的整合測試,需要首先理解maven測試
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
spring測試
//Spring整合測試
@RunWith(SpringRunner.class)
//Run就是@SpringBootApplication註解的類,從這裡載入配置
@SpringBootTest(classes = Run.class)
public class HelloTest {
@Autowired
MybatisDao mybatisDao;
@Test
public void test() {
Assert.assertEquals("hello world", mybatisDao.test());
}
}
這段程式碼就是在spring環境中測試mybatisDao.test()的返回值是否是"hello world",只需要理解類上面的兩個註解即可。mvc測試
上面是測試方法程式碼,而mvc測試則可以模擬瀏覽器請求url
//自動配置mvc測試環境 @AutoConfigureMockMvc @RunWith(SpringRunner.class) @SpringBootTest(classes = Run.class) public class HelloTest { @Autowired private MockMvc mockMvc; @Test public void test() throws UnsupportedEncodingException, Exception { //用post方式請求localhost:8080/test,post方法後面緊跟param方法可以傳參 mockMvc.perform(MockMvcRequestBuilders.post("/test"))// .param(name, values) //測試響應碼是不是200,即請求成功 .andExpect(MockMvcResultMatchers.status().isOk()) //測試請求結果是不是"hello world" .andExpect(MockMvcResultMatchers.content().string("hello world")); //以下程式碼可以直接得到localhost:8080/test的結果 System.out.println(mockMvc.perform(MockMvcRequestBuilders.post("/test")) .andReturn().getResponse().getContentAsString()); } }
開頭多了一個註解,springboot就會自動配置好mvc測試環境,就可以注入MockMvc進行mvc測試。
測試json介面
上面測試的url返回值是一個字串,如果返回的是json介面,可將test方法換成以下程式碼,和上面類似。
//使用jackson將物件序列化為json字串
Map map=new HashMap();
map.put("key", "value");
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(map);
//將mvc測試中的string方法改成json方法,比對json字串值是否相等
mockMvc.perform(MockMvcRequestBuilders.post("/test"))
.andExpect(MockMvcResultMatchers.content().json(jsonString));
string方法是比對字串。而json方法是比對json的近似值,對格式要求不嚴格,只要內容一樣,其中的符號差別都可以接受。比如json格式中的單引號和雙引號,json方法認為他們是一樣的。
如果url請求返回的json集很大,而只想測試其中一行結果的一個值,可以先取到請求的json結果,再用jackson反序列化成物件,就可以直接取到某一引數進行比對。
測試回滾
@Transactional在spring boot程式中是事務註解。如果在測試中使用,它的作用是回滾,無論測試成功或失敗,都會回滾對資料庫操作。以免測試資料影響到正式資料。這個註解放在類上面或方法上面都可以。
surefire測試
spring boot重寫了maven的surefire測試外掛,修改了規則,如果不理解先看一下maven測試
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
</configuration>
</plugin>
測試場景
並不建議每個功能都寫一個測試用例,這樣測試效率是很低的。有很多專門的測試工具如soapUI等,都不需要寫程式碼,直接輸入url請求就能測試,各種功能都比junit程式碼測試強大,而且更於管理。不過在有些場景下只能寫程式碼測試,如maven測試中說到的場景等。所以,只有真正需要的時候,才去寫junit程式碼測試,而不必每個功能都去寫測試用例,只要達到效果,同等情況下應選擇更高效的測試方法。