缘由

之前已经完成:接口测试参数化方案
之后将 yaml 改成了 json,方便使用和展示,用例示例可参考:接口在线调试并缓存至 redis
现在的问题是一个用例只有一组数据,比如一个登录的用例,需要使用不同的帐号信息,
之前的做法是不同的测试目的就额外增加用例来做,也可以达成目的

新的问题

现在碰到这样的场景,一个用户一个小时只能下 24 单,
这时如果我们对下单接口做监控,使用同一个帐号就只能 1 小时跑一次,
但这明显达不到监控的目的 ==> 主要是看接口是不是挂掉了,无法下单了,所以我们目标是 3 分钟跑一次

如何解决

如果有一组用户数据,每次执行时从中取出一个不重复的数据来执行,这样就可以对下单接口监控了
另外,可以同时支持执行一次用例用完一组数据的功能,比如上面提到的使用不同的帐号登录的场景

如何实施

基于 testng 的 dataProvider

  1. 建表,将数据放到数据库中,增加 “测试数据表”,“测试数据内容表”,
DROP TABLE IF EXISTS `tb_api_test_data`;
CREATE TABLE `tb_api_test_data` (
    `data_id` int(11) NOT NULL AUTO_INCREMENT,
    `data_desc` varchar(512) NOT NULL DEFAULT '' COMMENT '数据描述',
    `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户id',

    PRIMARY KEY (`data_id`),
    KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试数据表';

DROP TABLE IF EXISTS `tb_api_test_data_values`;
CREATE TABLE `tb_api_test_data_values` (
    `value_id` int(11) NOT NULL AUTO_INCREMENT,
    `data_id` int(11) NOT NULL DEFAULT '0' COMMENT '数据id',
    `data_value` text NOT NULL COMMENT '数据内容',

    PRIMARY KEY (`value_id`),
    KEY `idx_data_id` (`data_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试数据内容表';

其他表,参见接口测试服务之建表

  1. 取值,一个是在编写用例的时候,一个是在执行用例的时候
"batchData":[{
  "dataId":2,
  "dataRelations":[{
    "localJsonPath": "$.terminalType",
    "remoteJsonPath": "$.terminalType"
  },{
    "localJsonPath": "$.appTimestamp",
    "remoteJsonPath": "$.appTimestamp"
  }]
}],
"batchDataUseOne": true

在执行用例的时候,通过 dataId 从服务端取出数据,然后返回给 dataProvider

过程中碰到的问题

  1. 是一批数据一起存一起取,放入 mongoDB 去呢,还是一条数据一条数据的放到 mysql 这样关系表中去?如何取舍?

  2. 因为之前的用例是没有批量数据的,所以注解是@Test就可以了,
    但现在在 test 方法上增加了@Test(dataProvider = "batchData") 注解,
    然而 dataProvider 中的数据不可以为 0 组,查了一下没什么好办法,
    所以我的做法是 new 一个空数据出来,在执行的时候判断一下数据长度是否为 1 且数据内容为空

  3. 因为是一批数据在执行,那么中间的一条用例失败了?是继续执行完剩下的数据呢,还是不再继续了?

参考

《Java 测试新技术 TestNG 和高级概念》


↙↙↙阅读原文可查看相关链接,并与作者交流