TEP自动化测试工具
tep测试工具简介
tep的定位是工具也是一种理念而不是框架,因为它是基于pytest框架,tep的作用:
1.使目录更加规范化
files: 存放脚本依赖的图片,数据,音频之类的文件
fixture: 存放用例所需要的一些公共方法
reports: 存放allure测试报告
tests:存放测试用例
conf.yaml: 配置文件,一般应用当前运行用例环境的区分
conftest.py: 把fixture, 在conftest文件中进行封装,conftest 会遍历 fixtures 目录下面所有以fixture_ 开头 .py 结尾的文件.,把里面的 fixture进行自动导入
pytest.ini: pytest配置
2. 搭建方便
tep已经收录到了pypi,使得tep拥有了可以快速的项目的能力,也就是脚手架,命令行 执行 pip install tep 进行安装
执行 tep startproject project_name
,就可以创建项目结构
3. 公共方法存储简洁
fixtures公用方法详情:
fixture_admin.py: 管理员所需要维护的一些公用方法
fixture_env_var.py: 存放全局环境变量,根据conf.yaml 内填写的环境 来进行判断拼接 需要请求的url,或用于其他的环境变量
fixture_login.py: 登录接口
fixture_your_name.py: 项目成员共享的一些fixture
简洁的接口自动化运行示例:
在tests目录下进行编写用例文件,接口用例运用的yaml进行存储,好处就是在于yaml文件支持数组,配置有序,简洁
yaml 一个接口的用例结构:
-
name: 当前的用例名称
case_id: 1
request:
method: post # 接口请求方法
url: /*****/****/ # 接口名
headers: # 请求头
Content-Type: application/json
authorization: Bearer 7209b501-0680-4a3e-be70-c20f0b64c941
Cache-Control: no-cache
User-AgentL: PostmanRuntime/7.26.8
params: # 请求参数
type: P
department_id: []
approve_start_date: "2021-06-10"
check: # 需要校验的数据
expected_result: test_all_examine_check.json # 由于需要校验接口响应的数据过大 可以单独创建一个json文件进行存储
用例完成后,可以再写一个文件的取的公共方法
# 查询yaml文件 并返回
def read_yaml(yaml_name):
'''
读取yaml,将yaml反序列化,就是把yaml格式转换成dict格式
:return:
'''
try:
yaml_file = "../tests/test_case/" + yaml_name
with open(yaml_file, encoding="utf-8") as f:
value = yaml.load(f, Loader=yaml.FullLoader) # 文件流,加载方式
return value
except Exception as e:
yaml_file = "./tests/test_case/" + yaml_name
with open(yaml_file, encoding="utf-8") as f:
value = yaml.load(f, Loader=yaml.FullLoader) # 文件流,加载方式
return value
接口用例编写:
(用例支持日志存储,失败重跑,响应字段的键/值校验,报告定期删除)
import pytest
from fixtures.fixture_your_name import read_yaml, ys, cmp
from tep.client import request
from loguru import logger
import time
import decimal
import json
import allure
@allure.description("""简介:此执行集只做调试使用""")
class Test_Examine(object):
yaml_data = read_yaml("test_all_examine.yaml") # 获取测试集文件内容
@allure.description_html("""
<h1>调试版本</h1>
""")
@pytest.mark.flaky(reruns=3, reruns_delay=3) # 失败重试 每3秒重试一次,共重试3次
@pytest.mark.parametrize('yaml_case', yaml_data) # 数据驱动,读取用例执行集yaml文件中的列表,
@allure.title('审核模块')
def test_examine(self, yaml_case, env_vars, config):
api = ys(yaml_case, "url")[0] # ys 只是封装了一个 jsonpath 查询的公共方法
method = ys(yaml_case, "method")[0]
params = ys(yaml_case, "params")[0]
apinam = ys(yaml_case, "name")[0] # 接口名称
headers = ys(yaml_case, "headers")[0]
url = env_vars.domain + api # 完整url
logger.info("当前请求用例:%s,URL:%s,请求方法:%s,params:%s,headers:%s"%(apinam, url, method, params, headers))
# 起始时间
start = time.process_time()
# 接口请求
response = request(method, url=url, headers=headers, json=params)
# 请求结束时间
end = time.process_time()
# 接口耗时
elapsed = str(decimal.Decimal("%.3f" % float(end - start))) + "s"
logger.info(' 接口:%s,*************** 执行耗时:%s ***************' % (url, elapsed))
ret = response.json() # 获取接口json 类型响应:ret
case_id = str(ys(yaml_case, 'case_id')[0]) # 用例唯一c ase ID
check_field = read_yaml(ys(yaml_case, "expected_result")[0]) # yaml用例需要校验id
# 取出 当前用例需要校验的json响应:chek_data
chek_data = None
for check in check_field:
if check.get(case_id):
chek_data = check.get(case_id)
break
# 开始校验
for r in ret:
print('-'*50 )
check_response = cmp(json.dumps(chek_data), json.dumps(r))
if check_response == 0:
print('当前校验json包含在响应列表中。'*10)
if __name__ == '__main__':
pytest.main(["-s", "-v", "examine_test.py"])
# pytest --tep-reports 生成测试报告
用例运行 pytest --tep-reports运行所有用例 或 pytest -文件名--tep-reports 运行一个执行集
运行过后可在根目录生成测试报告目录 reports 以及allure测试报告