一、需求
由于目前很多公司缺少相应的集成测试框架,对于场景的测试全部是黑盒测试,黑盒测试目前在公司测试有一个很大的缺点:每一次迭代都需要测试人员测试所有的功能,如果有一个场景没有测试到就有可能导致严重的bug,这样就带来了测试人员在每次迭代发布的时候重复劳动;为了解决这种重复劳动和迭代开发效率的问题,亟待需要一个测试框架,其能够很方便的编写测试用例,仅仅需要一些测试场景的编写(通过yaml文件),测试框架就能读取对应的测试用例文件进行测试,这样在每次迭代的时候只要能够保证原先的测试用例能够跑通,基本上就能够确定这次的迭代开发没有影响到原来的功能,只需要增加新场景的测试用例就可以,极大的提高测试的效率和迭代的快速上线。
二、设计
1. 涉及到技术
(1)yaml文件及其解析 测试框架使用yaml文件作为用例编写文件,测试框架通过解析yaml文件获得对应的测试用例场景数据,将解析到的数据传入对应的测试接口中进行测试,Yaml文件格式说明参考https://en.wikipedia.org/wiki/YAML,其中特别注意的是三个中划线---表示的不同结构,在框架中我们使用这个来确定对应的测试方法的测试个数。
![](https://i-blog.csdnimg.cn/blog_migrate/c7f171f3db18fc500cac568702800335.webp?x-image-process=image/format,png)
Yaml解析使用的是SnakeYaml,对应的文档可以参考http://www.cnblogs.com/felixzh/p/6003396.html,此yaml解析器是目前比较流行的一种解析器,而且还有团队在维护。
(2)TestNG TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便,具体使用介绍参考http://www.yiibai.com/testng/。特别注意的是TestNG中的数据驱动开发@DataProvider。
2. 整体设计思想
定义一个注解(这个注解主要是用来说明测试用例的地址,单独进行测试的文件名称以及相关用例描述),测试框架通过获得注解中的内容(用例地址和文件名称),遍历对应用例地址,得到所有的用例文件,通过制定的测试文件名字和用例地址下的所有用例名字进行正则表达式匹配,只有匹配的才进行执行,可以实现用例的批量执行。在用例执行之前可能需要准备一些数据,特别是数据库中,可以提供一个工具来讲测试用例文件中定义的准备数据插入到数据库中;用例执行完之后可能需要校验数据库中的值是否是自己期望的可以提供一个工具将用例文件中的期望的数据库结果和真正根据条件查询到的结果进行字段对比,实现快速的场景测试,提高迭代周期。
三、使用说明
1.引入说明
此自动测试框架已经打包上传到私仓中,可以指定对应的mvn坐标来引入
![](https://i-blog.csdnimg.cn/blog_migrate/b5ec0619f19d1bfd83cd2fae9821a3f3.webp?x-image-process=image/format,png)
2. 选择继承类
此测试框架提供了两个供测试用例继承的类AbstractAutoTestFramework和AbstractTestSpringContextFramework 这两个类区别是:类AbstractAutoTestFramework使用的场景是不需要加载Spring对应ApplicatContext上下文,而AbstractTestSpringContextFramework使用的场景是需要加载对应的Spring ApplicatContext;实现区别是AbstractAutoTestFramework没有继承任何类,而AbstractTestSpringContextFramework继承了AbstractTestNGSpringContextTests 类。
![](https://i-blog.csdnimg.cn/blog_migrate/d88e359c886a44907ba889d271edf0db.webp?x-image-process=image/format,png)
3. 类上增加注解
在自己定义的类上面增加@XTest注解,此注解就是为了指定对应的测试用例的路径和需要指定测试文件的名称(不需要扩展名),已经相应的描述信息,具体用法如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/1486678fa9d77765d0bfe4a9de89a4d6.webp?x-image-process=image/format,png)
4. 在测试方法中增加dataProvider
在定义的测试方法上增加@Test注解,在这个注解里面指定对应的dataProvider对应的值(数据驱动名称,目前这个值是固定的TestDataProvider),具体用法如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cbb8f9050e118324058d067d86a25dc5.webp?x-image-process=image/format,png)
5. 编写测试用例代码
在编写测试用例代码的时候,有一点需要注意的是测试方法的入参个数和类型,这个是和对应的测试用例yaml文件对应的,其中测试用例yaml文件中的有一个“---”就对应的测试方法中的一个参数,具体的参数类型要根据yaml文件中的内容的定义来定,比如下面情况:
![](https://i-blog.csdnimg.cn/blog_migrate/0f0e0c6191e71cc4b0b193036daf3b95.webp?x-image-process=image/format,png)
这个测试方法有6个参数,这6个参数分别对应的是测试用例文件中的6个“---”,下面是其对应的用例文件:并且测试方法中对应的参数也是根据测试用例yaml文件来定义的。
![](https://i-blog.csdnimg.cn/blog_migrate/af9ccd07069e811b2d021fbec4f815dc.webp?x-image-process=image/format,png)
6.特殊用法说明
(1)表字段对应值含有特殊值替换说明
目前只实现了一种表字段特殊值替换场景,这个特殊值就是”@now()#日期格式”,当框架在解析对应的表字段对应的值时候,如果发现其含有对应的特殊值@now()则会使用当前时间应用对应指定的日期格式进行转换获得对应的字段值;后续如果有其他特殊需要可以在框架中增加对应的解析。
![](https://i-blog.csdnimg.cn/blog_migrate/8d996624d8415c59778714884790146a.webp?x-image-process=image/format,png)
(2)表字段标记说明
在进行数据库中数据校验的时候,很可能我们只知道对应的表记录对应的部分信息,我们需要根据这些信息查询数据获得对应的完整信息,然后使用查询出来的结果信息与测试用例文件中的期望结果进行校验对比,以验证功能是否真的正确;其中表记录中的部分数据称为查询条件,在测试用例文件中使用“[C]”进行标记,对于有“[C]”标记的字段框架会其作为查询条件进行数据库查询,其其他使用如下:表示使用id作为查询条件。
![](https://i-blog.csdnimg.cn/blog_migrate/11709c6d2ec23e503bdb4e3730b1537c.webp?x-image-process=image/format,png)
在进行数据字段check的时候,我们会发现有些字段是代码中的自动生成(每次都不一样),这样的字段根本无法校验,对于这种情况我们可以使用标记“[N]”来表示这个字段对应的值不进行校验,其具体使用如下:说明对应的日期字段不需要进行校验。
![](https://i-blog.csdnimg.cn/blog_migrate/2243c5e2e2f20be487827532de481a7e.webp?x-image-process=image/format,png)
7. 版本1.0.1新增功能介绍
(1)注解@XTest已经支持在方法进行标记已经支持对每一个测试方法单独制定对应的测试用例文件。
![](https://i-blog.csdnimg.cn/blog_migrate/6a4e206a3cea88b4732f329e4ba1ff5a.webp?x-image-process=image/format,png)
(2)注解@AtsFrameworkBaseContextCfg支持注解@ComponentScan过滤功能。
(3)DBUtils方法prepare和dbCheck增加在准备数据前删除准备数据和在数据库对比之后删除数据库中的数据的功能,这样可以在开发测试代码时候不用再写删除准备数据和校验数据的逻辑,删除逻辑是根据字段标记[C]来进行删除的。
(4)多数据库的支持:只需要在配置文件中增加如下配置就可以单独制定对应表的数据库:
![](https://i-blog.csdnimg.cn/blog_migrate/cd7dacae31d41e139e4dcf3140b684f3.webp?x-image-process=image/format,png)
8. 版本1.0.2新增功能介绍
(1)增强类ObjectCompareUtils的功能,使其支持根据”.”来进行属性排除和包含来进行对比,如下面的形式:
![](https://i-blog.csdnimg.cn/blog_migrate/c9f18e5d3c4f676f283daa1bc915ec03.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/cff95eec0cd65620a96aa872d2913ccd.webp?x-image-process=image/format,png)
通过“.”可以实现排序car对象中属性carSeat中的name属性和color属性,也就是说这两个属性在进行CarSeat进行对比的时候排除这两个对象。
四、 源码地址
https://github.com/lwjaiyjk/ats
转载请说明出处