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字段),但不会覆盖测试伙伴的修改,详细步骤如下:

  1. $json -> $new_config是根据接口文档生成的新用例配置
  2. $db_config是db中旧配置
  3. 合并新旧配置,但不会覆盖测试伙伴的修改
  4. 最后将合并后的配置存到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字段
    }

 

posted @ 2022-03-23 16:18  ranh  阅读(94)  评论(0编辑  收藏  举报