OAuth 2.0 单元测试解决方案

发表于:2020-10-14 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:冷冷zz    来源:掘金

  为什么需要单元测试
  单元测试拥有保证代码质量、尽早发现软件 Bug、简化调试过程、促进变化并简化集成、使流程更灵活等优势。单元测试是针对代码单元的独立测试,核心是“独立”,优势来源也是这种独立性,而所面临的不足也正是因为其独立性:既然是“独立”,就难以测试与其他代码和依赖环境的相互关系。单元测试与系统测试是互补而非代替关系。单元测试的优势,正是系统测试的不足,单元测试的不足,又恰是系统测试的优势。不能将单元测试当做解决所有问题的万金油,而需理解其优势与不足,扬长避短,与系统测试相辅相成,实现测试的最大效益。
  OAuth2 系统单元测试困难
  接口测试依赖于 UPMS (用户权限管理),无法做到解耦独立
  spring-security-test 模块未提供相关标准实现
  场景复杂既要包含无状态 token 调用,又要保证上线文传递业务
  解决方案
  参考 @WithMockUser ,在 Mock 拦截器中自动执行相关的增强(token 获取),并通过扩展 WithSecurityContextFactory 实现上下文 token 的传递。具体可以参考源码 pig-common-test[1]
  引入依赖
<dependency>
  <groupId>com.pig4cloud</groupId>
  <artifactId>pig-common-test</artifactId>
  <version>${last.version}</version>
  <scope>test</scope>
</dependency>
  单元测试 Controller 接口
  指定认证中心接口
配置在 test/resources/application.yml
security:
  oauth2:
    client:
      access-token-uri: http://pig-gateway:3000/oauth/token
  模拟测试 controller 接口
@RunWith(SpringRunner.class)
@SpringBootTest
public class SysLogControllerTest {

 private MockMvc mvc;

 @Autowired
 private WebApplicationContext applicationContext; // 注入WebApplicationContext

 @Before
 public void setUp() {
  this.mvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
 }

 @Test
 @SneakyThrows
 @WithMockOAuth2User
 public void testMvcToken() {
  mvc.perform(delete("/log/1").with(token())).andExpect(status().isOk());
 }
}
  模拟测试 FeignClient 传递 token
  直接注入 FeignClient 实现即可 使用 @WithMockOAuth2User 注解测试类即可
  WithMockOAuth2User 属性说明
  当前用例获取 token 使用的用户名
String username() default "admin";
  当前用例获取 token 使用的密码
String password() default "123456";
  写在最后 源码参考 pig-common-test[1] 模块
  目前仅在 pig 2.10 做了实现,理论支持低版本,直接 install 此模块即可。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号