httprunnermanager 拓展,用例配置自动生成(实现篇)【下】
一、页面上的生成的内容样式
在原来API接口测试站点点击生成用例,即生成如下json格式,在生成成功后同时也插入了httprunnerManner 的db了。
二、后端代码实现
HttpRunnerManager的用例存储
HttpRunnerManager的用例是存储在db中的TestCaseInfo
表
1 .表结构
CREATE TABLE `TestCaseInfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `create_time` datetime(6) NOT NULL, `update_time` datetime(6) NOT NULL, `type` int(11) NOT NULL, `name` varchar(50) NOT NULL, `belong_project` varchar(50) NOT NULL, `include` varchar(1024) DEFAULT NULL, `author` varchar(20) NOT NULL, `request` longtext NOT NULL, -- httprunner测试用例的json `belong_module_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `TestCaseInfo_belong_module_id_040b8702_fk_ModuleInfo_id` (`belong_module_id`) USING BTREE, CONSTRAINT `TestCaseInfo_belong_module_id_040b8702_fk_ModuleInfo_id` FOREIGN KEY (`belong_module_id`) REFERENCES `ModuleInfo` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=610 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用例';
2.用例配置存在request
字段
{ "test": { "name": "选择XX列表", "request": { "data": { "uid": "1", "sign": "1", "goods_id": "1", "store_id": "", "client_type": "3", "unique_code": "XXXXXXX-XXXXXXX", "app_version": "1.0" }, "method": "post", "url": "/order/XXX_list" }, "extract": [ { "sign": "content.data.user.sign" }, { "uid": "content.data.user.uid" } ], "validate": [ { "comparator": "equals", "check": "content.code", "expected": 200 }, { "comparator": "contains", "check": "content.msg", "expected": "成功" } ], "variables": [], "parameters": [] } }
生成用例
后端生成用例,就是将用例配置(json)存到HttpRunnerManager 的db中TestCaseInfo
表(request
字段)
实现核心在于\Base_testcaseinfo_model::save_testcase()
,它是将生成的新配置(json)存到HttpRunnerManager 的db中TestCaseInfo
表(request
字段),但不会覆盖测试伙伴的修改,详细步骤如下:
$json
->$new_config
是根据接口文档生成的新用例配置$db_config
是db中旧配置- 合并新旧配置,但不会覆盖测试伙伴的修改
- 最后将合并后的配置存到
TestCaseInfo
表的request
字段
详细代码如下:
public function save_testcase($name, $json): void { $name = str_replace('/', '_', $name); // httprunnermanager中的用例名不能有/,否则生成的用例yaml路由有问题 // 准备用例 $case = $this->prepare_case($name); //对比: 将`生成的新配置` 与 `db中旧配置` 进行对比, 保留测试伙伴修改的配置, 合并后进行保存处理 if(!empty($case['request'])){ $new_config = json_decode($json, true); // 生成的新配置 $db_config = json_decode($case['request'], true); // db中旧配置 if($db_config == null) { $case['request'] = str_replace("'", '"', $case['request']); $db_config = json_decode($case['request'], true); // 再次解析 if($db_config == null) throw new Exception("无法解析用例[$name]在db中旧配置"); } // 保留测试伙伴修改的配置 $new_config['test']['extract']= $db_config['test']['extract'] ?? []; $new_config['test']['validate']= $db_config['test']['validate'] ?? []; $new_config['test']['variables']= $db_config['test']['variables'] ?? []; $new_config['test']['parameters']= $db_config['test']['parameters'] ?? []; if(!empty($db_config['test']['request']['data'])) { $db_data = &$db_config['test']['request']['data']; $new_data = &$new_config['test']['request']['data']; $keys = array_keys($new_data) + array_keys($db_data); foreach ($keys as $key) { if (isset($db_data[$key])) { $new_data[$key] = $db_data[$key]; } } } //重新生成json数据 $json = json_encode($new_config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } // 更新用例配置json $this->where('id', $case['id']) ->update(['request' => $json]); // 保存用例配置:更新TestCaseInfo表的request字段 }