本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。
回顾
tep 是基于 pytest 开发的接口测试框架,上个版本从小工具升级为了关键字驱动框架,通过 pystats 发现最近半年仍然有 4000+人次在安装使用 tep。时隔 1 年后,我对 tep 进行了一次大版本改造,抛弃 tep2 的 Java 代码风格,重新回归到 tep1 的纯粹 Python 风格。
纯粹 Python
所谓纯粹 Python,体现在两个方面,一个方面是 tep 源码进行了重写,更加 Pythonic,自动化用例写起来也更加简单易懂;另一方面是抛弃了依赖 Java 的 Allure 和依赖 C++的 loguru,分别使用 Python 技术栈的 pytest-html 和 logging 替代。
tep3 版本
简介
tep 是 Try Easy Pytest 的首字母缩写,帮你轻松上手 pytest。
框架特点:
- 基于 pytest 封装,成熟、稳定且扩展性强。
- 框架完全由 Python 构建,没有混杂其他语言。
- 原生 Python 语法,学习 Python,零成本使用框架。
- HAR 包转换 pytest 用例。
安装
支持 Python3.8 以上版本
创建虚拟环境:python -m venv venv
激活虚拟环境,Windows 用户:activate.bat Mac 用户:source venv/bin/activate
安装 tep:pip install tep
验证安装成功:tep -V
目录结构
data
file
fixture
report
scripts
tests
.gitignore
conftest.py
pytest.ini
run.py
tep new demo就能快速创建项目名称为demo的项目脚手架。
用例示范
简单的请求:
from tep import request
def test():
response = request("get", url="http://httpbin.org/status/200")
assert response.status_code == 200
复杂的场景:
from tep import request
from tep import v
from data.global_data import GlobalData
class Data:
v({
"domain": GlobalData.domain,
"skuNum": 2,
"payAmount": 0.2
})
body_add_cart = '{"skuId":"${skuId}","skuNum":${skuNum}}'
body_order = '{"skuId":"${skuId}","price":${skuPrice},"skuNum":${skuNum},"totalPrice":${totalPrice}}'
body_pay = '{"orderId":"${orderId}","payAmount":${payAmount}}'
def test():
url = v("${domain}/searchSku?skuName=book")
response = request("get", url=url, headers=GlobalData.headers)
assert response.status_code < 400
v("skuId", response.jsonpath("$.skuId")[0])
v("skuPrice", response.jsonpath("$.price")[0])
url = v("${domain}/addCart")
body = v(Data.body_add_cart)
response = request("post", url=url, headers=GlobalData.headers, json=body)
assert response.status_code < 400
v("skuNum", response.jsonpath("$.skuNum")[0])
v("totalPrice", response.jsonpath("$.totalPrice")[0])
url = v("${domain}/order")
body = v(Data.body_order)
response = request("post", url=url, headers=GlobalData.headers, json=body)
assert response.status_code < 400
v("orderId", response.jsonpath("$.orderId")[0])
url = v("${domain}/pay")
body = v(Data.body_pay)
response = request("post", url=url, headers=GlobalData.headers, json=body)
assert response.status_code < 400
assert response.jsonpath("$.success")[0] == "true"
用例和数据
数据怎么存放,这里给出了一个参考方案,在用例内定义class Data,然后通过类变量存放数据。不同的项目,不同的场景,不同的参数,可以考虑不一样的存放方式。
tep 函数
不同于以往的 fixture 封装,tep 内部没有再定义 fixture,而是对外暴露函数:
__all__ = [
"request",
"v",
"run",
"har2case"
]
在使用时 import 即可,更容易理解。
函数 v()
这是我认为 tep3 的最大亮点。函数 v()根据不同的入参,有不同的含义:
-
传入字典类型:初始化变量池
-
传入字符串:解析变量
-
传入 2 个参数:设置变量
变量值支持占位符写法${},参考 JMeter 或 HttpRunner。
通过函数 v()来管理变量,用例代码清爽了不少。
fixture
fixture 在创建脚手架时,自动生成了 3 个:
-
fixture_login -
fixture_login_xdist -
fixture_mysql
主要用于生成数据和执行 setup/teardown,更多用法可以深入学习 pytest fixture。
har2case
抓取 har 包后,可以快速转换为自动化用例:
import os
from tep import har2case
from tep.config import Config
def test():
har2case({
"har": os.path.join(Config().FILE_DIR, "har", "flow.har"),
"dir": os.path.join(Config().TESTS_DIR, "generated"),
"overwrite": 1
})
同时支持批量替换:
import os
from tep import har2case
from tep.config import Config
def test():
har2case({
"har": os.path.join(Config().FILE_DIR, "har", "flow.har"),
"dir": os.path.join(Config().TESTS_DIR, "generated"),
"overwrite": 1,
"var": {"domain": "http://127.0.0.1:5000"},
"url": {"http://127.0.0.1:5000": "${domain}"},
"headers": {"Content-Type": "application/json", "Cookie": "de2e3ffu29"}
})
测试报告
run.py入口执行,设置report后即可生成:
from tep import run
if __name__ == '__main__':
run({
"path": ["test_flow.py"], # Relative path to tests, file or directory
"report": 1 # Generate html report, 0: False, 1: True
})
更多内容请安装 tep 体验或查看源码阅读。
源码
tep3 https://github.com/dongfanger/tep
tep2 https://github.com/dongfanger/tep/tree/2.2.4
tep1 https://github.com/dongfanger/tep/tree/1.0.0
欢迎大家讨论,对于接口测试框架,你有什么想法呢。