目录
前言
接口自动化测试框架
Jenkins自动执行测试命令
前言
前些天学了一下python自定义接口自动化测试框架及Jenkins实现无人值守进行自动测试的操作,内容不是很多,但是需要一些逻辑和理解才能上手。
接口自动化测试框架
下面介绍python构建接口自动化测试的自定义框架,主要通过读取excel文件进行自动化操作,对执行测试的脚本进行封装。
读取excel文件中数据并输出
测试数据 = xfile.read("模拟测试用例.xls").excel_to_dict(sheet=1)
print(测试数据) # == 【{},{}】
执行该代码返回列表字典嵌套格式的数据
[{'描述': '用户登录', '用例编号': 'hc_shop_api_001', '接口URL': 'http://shop-xo.hctestedu.com/index.php?s=api/user/login', '请求方式': 'post', 'URL参数': '{ "application":"app", "application_client_type": "weixin",\n}', '表单参数': '', 'JSON参数': ' {\n "accounts":"huace_xm",\n"pwd": 123456,\n "type":"username"\n}', '预期状态码': '', '预期返回内容': '', '备注': '', '提取参数': 'token', '需要参数': ''}, {'描述': '添加购物车', '用例编号': 'hc_shop_api_001', '接口URL': 'http://shop-xo.hctestedu.com/index.php?s=api/cart/save&token=${token}', '请求方式': 'post', 'URL参数': '{ "application":"app", "application_client_type": "weixin",\n}', '表单参数': '', 'JSON参数': '{\n "goods_id": "2",\n "spec": [\n {\n "type": "套餐",\n "value": "套餐二"\n },\n {\n "type": "颜色",\n "value": "银色"\n },\n {\n "type": "容量",\n "value": "64G"\n }\n ],\n "stock": 2\n}', '预期状态码': '', '预期返回内容': '', '备注': '', '提取参数': '', '需要参数': 'token'}]
引用pytest装饰器自动执行
@pytest.mark.parametrize("case_info",测试数据) # 传入一个列表,自动解析,自动执行
def test_case_exec(case_info):
url = case_info["接口URL"]
if "$" in url:
url = Template(url).substitute(g_var().show_dict())
rs = requests.request(url=url,
params=eval(case_info["URL参数"]),
data=eval(case_info["JSON参数"]),
method=case_info["请求方式"])
if case_info["提取参数"]:
ltoken = jsonpath.jsonpath(rs.json(),"$.."+case_info["提取参数"])
g_var().set_dict(case_info["提取参数"],ltoken[0])
其中,参数传递问题由下面判断语句解决,优先执行需要传参的用例
if "$" in url:
url = Template(url).substitute(g_var().show_dict())
执行用例
rs = requests.request(url=url,
params=eval(case_info["URL参数"]),
data=eval(case_info["JSON参数"]),
method=case_info["请求方式"])
检查执行的用例中是否存在需要传递的参数,若有则提取存放在g_var()中
if case_info["提取参数"]:
ltoken = jsonpath.jsonpath(rs.json(),"$.."+case_info["提取参数"])
g_var().set_dict(case_info["提取参数"],ltoken[0])
# 作用: 在不同的python文件之间保存数据,传递数据
class g_var(object):
# 存放一个可以无限放变量的容器? -- 好找--不重复 有唯一标识
_global_dict ={} # 空字典 内置变量 -- 数据结构 变量的污染 name name
def set_dict(self,key,value): # 函数 -- PI*r*r
self._global_dict[key] = value
def get_dict(self,key):
return self._global_dict[key]
def show_dict(self):
return self._global_dict
执行完上述代码后,我们可以发现,并不能判断所有用例是否被正常执行,那么需要引入断言机制
预期状态码设置为201,返回的真实状态码为200,则显示异常
通过以上操作,测试工作基本完成,可使用allure命令生成测试报告
if __name__ == '__main__':
pytest.main(["-vs",
"--capture=sys",
"Test_apiframwork.py",
"--clean-alluredir",
"--alluredir=allure-results"])
#系统帮我们生成一个页面文件
os.system("allure generate allure-results -o report_allure --clean")
通过命令窗口输入
生成类似下面的allure报告界面(本次实验缺少完整的项目测试数据)
值得一提的是,使用allure要先下载解压allure并进行环境配置否则无法正常生成allure报告
Jenkins自动执行测试命令
使用Jenkins工具实现测试命令的自动执行,可减去人工执行测试的操作,且能自动发送结果到目标地址。