您的位置:首页 > 编程语言 > Java开发

spring boot(24)-test测试

2018-01-20 11:58 381 查看
如果直接用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代码测试,而不必每个功能都去写测试用例,只要达到效果,同等情况下应选择更高效的测试方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: