关于自动化测试
没有自动化测试的代码很容易出问题,特别是修改已有的代码,很容易产生BUG。没有自动化测试的项目,只要版本发布更新,总会让人很紧张。通过自动化测试,可以提升代码质量及稳定性。
发现BUG不可怕,可怕的是修复了这个BUG,另一个BUG出来了。因此修改BUG前,请先增加自动化测试用例。
本文是REST服务的测试入门篇。
实战
-
创建helloworld项目
使用sping boot创建一个新的helloworld的WEB项目。
-
新建HelloWorldController.java类
代码如下:
//HelloWorldController.java
package com.example.helloworld;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String sayHello() {
return "Hello World!";
}
}
-
手工测试
启动项目,在浏览器的访问REST服务,然后查看结果是否正确。
-
编写自动化测试代码
通过自动化测试,可以自动完成上述测试
在创建项目时,会自动创建一个测试类 HelloworldApplicationTests
image.png
代码如下:
//HelloworldApplicationTests.java
package com.example.helloworld;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloworldApplicationTests {
@Test
public void contextLoads() {
}
}
在该类中添加自动化测试代码
import org.junit.Before;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
//使用MockMvc对 Controller 层进行测试(即测试REST服务)
private MockMvc mvc;
//初始化执行
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
}
//验证controller是否正常响应并判断返回结果是否正确
@Test
public void testHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk()) //返回状态是否是200(isOK)
.andDo(MockMvcResultHandlers.print()) //是否打印返回结果
.andExpect(MockMvcResultMatchers.content().string("Hello World!")) //返回结果是否正确
.andReturn();
}
-
运行自动化测试
在测试类或测试方法上,右键点Run,即可运行自动化测试,可以看到测试成功。
image.png
-
模拟BUG
打开HelloWorldController类
将 return "Hello World!";
中的感叹号去掉,改为 return "Hello World";
再次运行测试,结果如下:
image.png
我们再来模拟另外一个错误,模拟访问URL错误:打开测试类HelloworldApplicationTests,将get("/hello")
中的url改为 get("/helloworld")
。
再次运行测试,结果如下:
image.png