美文网首页
OAuth 2.0 单元测试解决方案

OAuth 2.0 单元测试解决方案

作者: 冷冷zz | 来源:发表于2020-10-12 10:49 被阅读0次

    为什么需要单元测试

    单元测试拥有保证代码质量、尽早发现软件 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 模块
    目前仅在 pig 2.10 做了实现,理论支持低版本,直接 install 此模块即可

    相关文章

      网友评论

          本文标题:OAuth 2.0 单元测试解决方案

          本文链接:https://www.haomeiwen.com/subject/twsupktx.html