本文主要讨论接口测试中数据准备我的一些感悟。
1. 接口测试的背景
目前我们的用例通过CSV脚本进行维护的,因此我们测试基类里编写了一个DataProvider。具体定义如下:
@DataProvider(name = "CsvDataProvider") public Iterator<?> getDataProvider(Method method) {}
测试类继承测试基类,测试类示例如下
@Test(dataProvider = "CsvDataProvider", description = "InsertWhiteListItem正常场景测试") public void insertWhiteListItem(final String caseid, final String description, final String type, final String content, final String riskType, ) { WhiteListItem white =JsonHelper.jsonToObject(whiteItem, WhiteListItem.class); boolean result = whiteListService.insertWhiteListItem(white); }
caseid description type content riskType 001 插入不存在记录 MAC 00247E036940 ACCOUNT_RISK 002 插入已存在的记录 MAC 00247E036941 ACCOUNT_RISK 003 插入无效记录 MAC 00247E036942 ACCOUNT_RISK 004 插入过期记录 MAC 00247E036943 ACCOUNT_RISK
在真正的测试执行时,每次会读取一条CSV记录,每个字段做为一个参数(String类型)传给@Test下面的测试方法insertWhiteListItem。
2.参数构造方法
a. 简单对象直接传入
接口定义如下:
WhiteListItem queryWhiteItem(String type, String content, String riskType);
测试代码:
WhiteListItem white = whiteListService.queryWhiteItem(type, content, riskType);
适用范围:内置类型或java.lang下相关的类。
b. 复杂对象使用Json 类型转化
接口定义如下:
boolean insertWhiteListItem(WhiteListItem whiteListItem)转换代码:
WhiteListItem white =JsonHelper.jsonToObject(whiteItem, WhiteListItem.class);适用方法:构造JSON串比较麻烦,要先通过JsonHelper.objectToString拿到一个复杂对象的基本对象信息,再根据这个基本对象信息改为我们需要的类。适用于复杂查询对象。
boolean insertWhiteListItem(WhiteListItem whiteListItem)测试脚本:
WhiteListItem white = WhiteListHelper.factory(type, content, riskType);
适用范围:如果一个对象大部分属性都可以是相同的,只有部分属性起关键作用,建议使用这个方法。
d.通过反射构建对象。
3.数据准备a. 关系型存储的准备,包括DB及MILE。
对于单一表的数据,目前能够做到只需要指定一个CSV文件(通常是DB查询结果导出为CSV文件),实现自动导入功能。
对于多表关联的数据,可以做到多个指到的CSV文件自动导入。
根据数据类型区分,
配置类数据,我们不能直接删除,否则会影响系统运行,建立直接采用DB中的数据,可以插入新记录。
业务类数据,我们可以采用先删除后插入的操作,保证数据的正确性。
b. K-V型的存储,包括Tair及Hbase。
目前也是通过CSV来构造所需要的Key及Value,然后存储入对应的存储中。
c.多份存储的准备。
一份数据既存储在DB中,又存储在Hbase中,此时需要同时调用上面讲到的两种数据准备方案。
d. 关于事务控制
一直对此块有个幻想,就是支持事务控制,比如说在用例执行前设置一个SavePoint,然后执行数据准备,测试执行,结果校验过程,测试完成后执行下CallBack,数据库中的数据自动清除,实现到框架当中。接口测试就做到了悄悄的走,不带走一片云彩的状态。这就是极致的追求。
4. 环境准备
a. 缓存数据的推送。
b. DRM开关的设置。