1. 程式人生 > >spring boot(24)-test測試

spring boot(24)-test測試

如果直接用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程式碼測試,而不必每個功能都去寫測試用例,只要達到效果,同等情況下應選擇更高效的測試方法。