java--测试小结

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等

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值