java–测试小结
环境
idea2018,jdk1.8
后台开发中用到的一些测试方法和工具。
demo下载:https://github.com/2010yhh/springBoot-demos/tree/master/springboot-druid
1.unit单元测试(junit+mockito)
assert来判断测试的结果
verfiy来判断执行的次数和顺序
doAnswer用来判断执行的方法和方法的参数
Mock声明的对象,对函数的调用均执行mock(即虚假函数),不执行真正部分。见:https://blog.csdn.net/qq_30141957/article/details/81273829
Spy声明的对象,对函数的调用均执行真正部分。
增删查改service测试代码示例:
public class UserServiceImplTest {
@Mock
UserService userService;
/**
* 在需要Mock的属性上标记@Mock注解,然后@RunWith(MockitoJUnitRunner.class)
* 或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。
*/
@Before
public void setUp() throws Exception {
// 初始化测试用例类中由Mockito的注解标注的所有模拟对象
//或者:UserService userService= Mockito.mock(UserService.class);
// UserService userService2= Mockito.spy(UserService.class);
MockitoAnnotations.initMocks(this);
}
@Test
public void findByUserName() {
User user=new User();
user.setId(10);
user.setUserName("user10");
user.setPassWord("123456");
//测试输入和期望的输出:当使用 user10 查询数据库的时候,返回user
when(userService.findByUserName("user10")).thenReturn(user);
//测试调用
User user1=userService.findByUserName("user10");
assertNotNull(user1);
assertEquals(10, user1.getId().intValue());
//验证是否执行过1次
verify(userService, times(1)).findByUserName(eq("user10"));
}
@Test
public void findAll() {
List<User> users=new ArrayList<>();
when(userService.findAll()).thenReturn(users);
}
@Test
public void addUser() {
User user=new User();
user.setId(10);
user.setUserName("user10");
user.setPassWord("123456");
//测试
userService.addUser(user);
//抓取器
ArgumentCaptor<User> userCaptor = ArgumentCaptor.forClass(User.class);
//验证是否执行过1次
verify(userService, times(1)).addUser(userCaptor.capture());
// 获取抓取到的参数值
User user1 = userCaptor.getValue();
assertNotNull(user1);
assertEquals("user10", user1.getUserName());
}
@Test
public void updateUser() {
User user=new User();
user.setId(10);
user.setUserName("user10_update2");
user.setPassWord("123456");
//测试
userService.updateUser(user);
//抓取器
ArgumentCaptor<User> userCaptor = ArgumentCaptor.forClass(User.class);
//验证是否执行过1次
verify(userService, times(1)).updateUser(userCaptor.capture());
// 获取抓取到的参数值
User user1 = userCaptor.getValue();
assertNotNull(user1);
assertEquals("user10_update2", user1.getUserName());
}
@Test
public void deleteUser() {
//测试
userService.deleteUser(10);
//验证是否执行过1次
verify(userService, times(1)).deleteUser(10);
//测试调用
User user=userService.findByUserName("user10");
assertNull(user);
//方法没有返回值时可以用上面的验证是否执行过;或者下面的
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] args = invocationOnMock.getArguments();
return "called with arguments: " + args;
}
}).when(userService).findAll();
}
}
spy和mock的使用区别:
@Test
public void findByUserNameSpy() {
//spy下执行实际方法
UserServiceImpl userService2= Mockito.spy(UserServiceImpl.class);
userService2.findByUserName("user10");
}
@Test
public void findByUserNameMock() {
UserServiceImpl userService= Mockito.mock(UserServiceImpl.class);
//mock 下thenCallRealMethod执行实际方法
when(userService.findByUserName(anyString())).thenCallRealMethod();
userService.findByUserName("user10");
//正常情况mock不执行实际方法,无输出
User user=new User();
user.setId(10);
user.setUserName("user10");
user.setPassWord("123456");
//测试输入和期望的输出:当使用 user10 查询数据库的时候,返回user
when(userService.findByUserName("user10")).thenReturn(user);
//测试调用
User user1=userService.findByUserName("user10");
}
2.接口测试:spring中mockmvc测试接口
mockmvc增删查改接口示例:
//Spring 环境的上下文的支持
@RunWith(SpringRunner.class)
//获取启动类,加载配置,寻找主配置启动类(被@SpringBootApplication 注解的)
@SpringBootTest
public class UserControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mvc;
//private MockHttpSession session;
@Before
public void setupMockMvc() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象
//测试需要登录的接口
//session = new MockHttpSession();
//User user =new User("root","root");
// session.setAttribute("user",user);
}
@Test
public void addUser()throws Exception {
String user="{\"id\":5,\"userName\":\"yhh_addUser\",\"passWord\":\"111111\"}";
mvc.perform(MockMvcRequestBuilders.post("/user")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(user.getBytes()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
@Test
public void deleteUser() throws Exception{
mvc.perform(MockMvcRequestBuilders.delete("/user?id=1")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
@Test
public void getUser()throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/user?userName=yhh_addUser_updateUser")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
@Test
public void updateUser() throws Exception{
String user="{\"id\":5,\"userName\":\"yhh_addUser_updateUser\",\"passWord\":\"22222\"}";
mvc.perform(MockMvcRequestBuilders.put("/user")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(user.getBytes()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
}
3.代码覆盖率
1)
2)
3)查看代码覆盖率报告
4.接口测试
常用工具:
psotman 、Fiddler 、idea自带的Http client
RESTClient、jmeter、loadrunner、SoapUI等
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/18381.html