YMock宜人贷测试框架

联合创作 · 2023-10-01 17:18

ymock是一种针对单元测试与集成测试的辅助框架,其目的是解决测试过程中遇到的一些技术问题,方便测试进行,提高测试效率。它解决的问题主要为以下3个方面:1,隔离对第三方dubbo服务的依赖问题; 2,数据库数据准备问题; 3,按照一定规则创建测试数据的辅助功能。(仅于jdk1.8 +)

模块说明

ymock-core对应代码实现,其MockJSTest对应着MockJS的使用
模仿;ymock-demo主要是使用替换,其dubbo目录对应着mock dubbo的使用。测试资源是由测试时数据库配置的参考样例。

使用说明

依赖约会

<dependency>
    <groupId>com.yirendai.infra</groupId>
    <artifactId>ymock-core</artifactId>
    <version>1.0.0</version>
</dependency

模拟Dubbo接口

  • 添加配置文件处理bean,当改配置为true时,spring容器在启动时不会去检查dubbo登录中心是否连接正确,所有在采用mock时我们完全不依赖于第三方,包括zookeeper,dubbo提供程序。

<bean class="com.yirendai.infra.ymock.dubbo.DubboMockPostProcessor" >
       <!-- 是否开启Mock功能,true:开启,false:关闭 -->
       <constructor-arg index="0" value="true"/>
</bean>
  • 对目标dubbo接口设定期望

采用Jmockit语法

MockUp<PointFacade> pointService = new MockUp<PointFacade>() {
    @Mock
    public CommonResult<PointResponse> execSubPoint(PointRequest PointRequest)
    {
        CommonResult<PointResponse> pointResponseCommonResult = new CommonResult<>();
        pointResponseCommonResult.setCode("2009");
        return pointResponseCommonResult;
    }
};

DubboMock.set(pointService);

采用Mockito语法

PointRequest pointRequest = ...;
CommonResult<PointResponse> pointResponseCommonResult = new CommonResult<>();
pointResponseCommonResult.setCode("2008");

PointFacade pointFacade = mock(PointFacade.class);
when(pointFacade.execSubPoint(pointRequest)).thenReturn(pointResponseCommonResult);

DubboMock.set(pointFacade);

数据库数据准备

  • 原则:
    1.使用真实的数据库,可以保证测试的有效性;
    2.测试时构建最小的测试数据集,方便数据管理,同时兼顾性能;
  • 方案:
    数据库分为开发数据库和测试数据库,开发数据库仅用于开发,测试用于单元测试和集成测试
  • 实现原理:
    1. 将Dev数据库的表或数据(仅同步必须的)同步到测试数据库;
    2. 利用项目中现有的API对数据进行补充设置。
  • 使用说明
  1. 配置
	<bean class="com.yirendai.infra.ymock.util.MysqlManager">
		<!-- 源地址 -->
		<constructor-arg index="0" ref="dataSource1" />
		<!-- 目标地址 -->
		<constructor-arg index="1" ref="dataSourceTest" />		
	</bean>
  1. 根据需要同步指定的表和数据
    mysqlManager.syncTableSchema("table1"); // 设置需要同步表结构的表
    mysqlManager.syncTableData("table2");   // 设置需要同步表数据的表

    mysqlManager.syncCase();     //同步指定表的结构和数据.
    //mysqlManager.syncSuit();   //同步所有的表结构,同步指定表的数据.

测试数据准备(仅限JDK1.8 +)

  • 支持mockjs语法
  • 使用体现
    System.err.println(MockJS.mock("{\"string|1-10\":\"*\"}"));

    String exp = " {\"string|2-9\":\"*\"}";
    System.err.println(MockJS.mock(exp));

某次运行结果如下:

{"string":"****"}
{"string":"*****"}
浏览 4
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报