HttpRunner 基于 HttpRunner 的接口测试平台--HttpRunnerManager

尹全旺 · 2018年01月03日 · 最后由 兔子1987 回复于 2018年01月29日 · 最后更新自管理员 思寒_seveniruby · 6406 次阅读
本帖已被设为精华帖!

诞生背景:一直以来想做一个接口测试平台,恰巧偶然发现@debugtalk的HttpRunner系列文章(非常感觉debugtalk,如有冒犯,还请多多包涵),觉得很适用于大部分的接口测试,也在自己公司中慢慢适用,其带来的时间效益不言而喻,但是深感多人协调的不便,所以这段时间也自己学了下django和bootstrap和一些简单的html入门教程,得益于HttpRunner的强大后台支撑,现在HttpRunnerManager第一版已经初见雏形,在此和大家一起分享,待成熟之后一定在群里开源,功能比较low,还望大家勿喷。😄

基本组成:第一期还没有加入mock等服务(主要因为公司自己mock没用)主要由5大模块组成,项目管理、模块管理、接口管理、用例管理以及系统设置等,采用bootstrap+django+ajax技术栈,前后端交互都是通过ajax进行交互,沿用HttpRunner思想,用例管理有添加配置(对应config),添加用例(test),注意:和HttpRunner本身区别(一条用例只支持1个Test)但是可以通过include以 config>casename1>casename2 形式组装业务用例。

效果图:
1、首页:

2、添加模块页面:

3、添加配置:



4、添加用例(和添加config类似,只是增加几个编辑栏
):

HttpRunner调用:当然我们还是得熟悉HttpRunner的实现思路,不然我们也找不到合适的切入点修改代码,其中最核心的是把前端提交数据组装成yaml格式:

def load_case(path):
parsed_request = {}
request = {}
testcase_lists = []

for value in path:
if value is not {}:
key_name = str(value.keys())
if 'keyvariables' in key_name:
parsed_request.setdefault('variables', key_value_list(**value))
elif 'keyheader' in key_name:
parsed_request.setdefault('headers', key_value_dict(**value))
elif 'keydata' in key_name:
parsed_request.setdefault('data', key_value_dict(**value))
elif 'keyextract' in key_name:
parsed_request.setdefault('extract', key_value_list(**value))
elif 'keyvalidate' in key_name:
parsed_request.setdefault('validate', key_value_list(name='true', **value))
elif 'case_name' in key_name:
parsed_request['name'] = value.pop('case_name')
elif 'DataType' in key_name:
parsed_request['data_type'] = value.pop('DataType')
elif 'method' in key_name:
request['method'] = value.pop('method')
elif 'url' in key_name:
request['url'] = value.pop('url')

if 'data' in parsed_request.keys():
data_type = parsed_request.pop('data_type')
request.setdefault(data_type, parsed_request.pop('data'))

parsed_request.setdefault('request', request)
testcase_lists.append({'test': parsed_request})
return testcase_lists

有了此转换方法,我们只需要调用即可:

def load_test_file(file_path):
""" load testset file, get testset data structure.
@param file_path: absolute valid testset file path
@return testset dict
{
"
name": "desc1",
"
config": {},
"
api": {},
"
testcases": [testcase11, testcase12]
}
"""

testset = {
"name": "",
"config": {
"path": ''
},
"api": {},
"testcases": []
}
tests_list = load_case(file_path)#将此处加载yml函数替换为刚才load_case函数即可

for item in tests_list:
for key in item:
if key == "config":
testset["config"].update(item["config"])
testset["name"] = item["config"].get("name", "")

elif key == "test":
test_block_dict = item["test"]
if "api" in test_block_dict:
ref_name = test_block_dict["api"]
test_info = get_testinfo_by_reference(ref_name, "api")
test_block_dict.update(test_info)
testset["testcases"].append(test_block_dict)
elif "suite" in test_block_dict:
ref_name = test_block_dict["suite"]
test_info = get_testinfo_by_reference(ref_name, "suite")
testset["testcases"].extend(test_info["testcases"])
else:
testset["testcases"].append(test_block_dict)

elif key == "api":
api_def = item["api"].pop("def")
function_meta = parse_function(api_def)
func_name = function_meta["func_name"]

api_info = {}
api_info["function_meta"] = function_meta
api_info.update(item["api"])
testset["api"][func_name] = api_info

return testset

##结束语:第一次发这种技术帖子,文笔比较low,因为功能还不完善,现在任务比较重,待空闲之时一定抓紧时间开发,争取早点开源,希望大家多多提出建议,在论坛上学习到很多,感谢大家的无私奉献精神,同时再次感谢@debugtalk,由于引用到HttpRunner代码,希望能得到谅解😇

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 19 条回复 时间 点赞

@yinquanwang 大写的赞!!!我一直想做的,居然帮忙先做了,给力!

如果可以的话,是否可以将项目开源到HttpRunner的项目组:https://github.com/HttpRunner

偷偷在2楼说一句,刚才@debugtalk 看到这个帖子笑得嘴角都裂到眼角了,楼主有没有兴趣来大疆一起工作啊👏

不错不错。。继续加油前行😀 😀

嗯,这个前端真及时。

九毫 回复

支持 请尽快开源

大赞~希望早日开源,让菜鸟们欣赏下优雅的实现方式😁 😁

九毫 回复

能得到大佬的赞赏真是倍感荣幸😄 目前任务比较重,平台也很多地方没完善,过段时间限电,代码好好调整下,感觉差不多了一定贴上地址

Vincent 回复

只可惜在上海😂 DJI是我大学就向往的地方

蓝寅 回复

谢谢支持😇

小马 回复

😂 最近一个月工作太忙了,,,都没时间写,估计要到年后才能开源了

Ningxw 回复

嗯嗯

测试报告呢

bauul 回复

报告功能还在开发,目前这个还没完全开发完

思寒_seveniruby 将本帖设为了精华贴 01月03日 21:43

这个也可以兼容其他的测试框架,各家统一接口调用规范就可以都适配了。

我也在做这个,不过我不是更改load yaml这个模块,这个模块我是直接舍弃了,然后通过前端传的数据,在后台存入数据库,从数据库取的时候,组成testsets,然后传给运行模块

最近在看httpRunner的源代码,从项目新建开始看,一边看一边研究。看到楼主的帖子,简直了。赞一个!

期待楼主开源更新☺ ☺ ☺ ☺

大赞,期待开源学习学习

赞赞赞,跟我之前设计的接口自动化好像,我系统设置这边的功能是加了邮件配置发送。
不过我只设计了功能,还没具体实现,没想到楼主先行一步

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册