python web自动化测试设计构工具书
40.9元
包邮
(需用券)
去购买 >
错误
正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当我写代码时,我的伙伴已经写好后台的拦截器了,只有绑定了token的用户才能访问后台,所以当我单元测试c层模拟请求时就会报错,
因为我的模拟前台请求就像是一个没有登陆的用户请求,经过拦截器必然是被拦截了下来。
解决经过
一开始有点不知所错。我们的模拟请求失败是因为后台在没有绑定token的情况下请求了其他接口,而我们的拦截器也没有发token给模拟请求。我们正常要使用系统的话要先登录,第一次登录的话后台会发送一个token给前台并与用户绑定,以后就会带着后台发来的token去请求。
所以首先模拟一下正常的登录流程。创造一个方法loginUser(),在方法上添加注释@Before,用于在每个测试方法前执行。在这个先新建一个用户用来当我们的模拟用户,我们用这个用户的username和password来进行登录,然后在进行请求。
@Test
public void loginUser() throws Exception
{
String url = "/user/login";
String username = RandomString.make(6);
String password = RandomString.make(6);
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", username);
jsonObject.put("password", password);
// 当以参数username, password调用userService.login方法时,返回true
Mockito.when(this.userService.login(username, password)).thenReturn(true);
// 触发C层并断言返回值
this.mockMvc.perform(MockMvcRequestBuilders.post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(jsonObject.toJSONString()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("true"));
}
但是两次模拟请求并不是同一个用户,我们需要在第一次请求的时候获取token并保存用户,在后续请求携带token发出模拟请求。这就需要引入request类。
上述方法太麻烦了,在学长的建议下,研究拦截器原理,发现拦截器通过isLogin()函数里判断token来判断这个用户是否登陆过,如果把isLogin方法mock一下,让他永远返回true就无论传什么token就都可以不被拦截了。
@Before
public void loginUser() throws Exception {
Mockito.when(this.userService.isLogin(Mockito.any(String.class))).thenReturn(true);
}
但是只是在mock方法里规定传入string类型是不行的,我们模拟请求默认token是null,所以我们应该在模拟请求时加入header的token信息,随意一个字符串就好。
this.mockMvc.perform(
MockMvcRequestBuilders.get(url)
.header("auth-token", "key")
.param("page", "1")
.param("size", "2"))
.andExpect(MockMvcResultMatchers.status().isOk());
我们也可以在mock方法里设置传入任一参数都返回true,这样我们就不用在后续模拟请求中发送token了。
@Before
public void loginUser() throws Exception {
Mockito.when(this.userService.isLogin(Mockito.any())).thenReturn(true);
}
总结
不断改进自己的解决办法,从中学到更多解决问题的方法,同时加深了对拦截器和token的了解。
java 11官方入门(第8版)教材
79.84元
包邮
(需用券)
去购买 >