51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3817|回复: 1

[转贴] OAuth 2.0 单元测试解决方案

[复制链接]
  • TA的每日心情
    无聊
    17 分钟前
  • 签到天数: 919 天

    连续签到: 1 天

    [LV.10]测试总司令

    发表于 2020-10-15 09:51:58 | 显示全部楼层 |阅读模式
     为什么需要单元测试
      单元测试拥有保证代码质量、尽早发现软件Bug、简化调试过程、促进变化并简化集成、使流程更灵活等优势。单元测试是针对代码单元的独立测试,核心是“独立”,优势来源也是这种独立性,而所面临的不足也正是因为其独立性:既然是“独立”,就难以测试与其他代码和依赖环境的相互关系。单元测试与[url=]系统测试[/url]是互补而非代替关系。单元测试的优势,正是系统测试的不足,单元测试的不足,又恰是系统测试的优势。不能将单元测试当做解决所有问题的万金油,而需理解其优势与不足,扬长避短,与系统测试相辅相成,实现测试的最大效益。
      OAuth2 系统单元测试困难
      接口测试依赖于 UPMS (用户权限管理),无法做到解耦独立
      spring-security-test 模块未提供相关标准实现
      场景复杂既要包含无状态 token 调用,又要保证上线文传递业务
      解决方案
      参考 @WithMockUser ,在 Mock 拦截器中自动执行相关的增强(token 获取),并通过扩展 WithSecurityContextFactory 实现上下文 token 的传递。具体可以参考源码 pig-common-test[1]
      引入依赖

    1. <dependency>
    2.   <groupId>com.pig4cloud</groupId>
    3.   <artifactId>pig-common-test</artifactId>
    4.   <version>${last.version}</version>
    5.   <scope>test</scope>
    6. </dependency>
    复制代码
    单元测试 Controller 接口
      指定认证中心接口


    1. 配置在 test/resources/application.yml
    2. security:
    3.   oauth2:
    4.     client:
    5.       access-token-uri: http://pig-gateway:3000/oauth/token
    复制代码
    模拟测试 controller 接口

    1. @RunWith(SpringRunner.class)
    2. @SpringBootTest
    3. public class SysLogControllerTest {
    4. private MockMvc mvc;
    5. @Autowired
    6. private WebApplicationContext applicationContext; // 注入WebApplicationContext
    7. @Before
    8. public void setUp() {
    9.   this.mvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
    10. }
    11. @Test
    12. @SneakyThrows
    13. @WithMockOAuth2User
    14. public void testMvcToken() {
    15.   mvc.perform(delete("/log/1").with(token())).andExpect(status().isOk());

    16. }

    17. }
    复制代码
    模拟测试 FeignClient 传递 token
      直接注入 FeignClient 实现即可 使用 @WithMockOAuth2User 注解测试类即可
      WithMockOAuth2User 属性说明
      当前用例获取 token 使用的用户名

    1. String username() default "admin";
    复制代码
    当前用例获取 token 使用的密码
    1. String password() default "123456";
    复制代码
    写在最后 源码参考 pig-common-test[1] 模块
      目前仅在 pig 2.10 做了实现,理论支持低版本,直接 install 此模块即可。



    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-3-29 09:39 , Processed in 0.065202 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表