pytest详细教程
pytest详细教程
-
安装pytest
pip install pytest
-
创建pytest配置文件
pytest.ini
-
编写用例
- test_开头的文件
- test_开头的函数
- 使用断言
例如:
# test_api.py from session import MySessionsession = MySession("http://127.0.0.1:8000")def test_api():user_info = {"username": "test", "password": "123456"}response = session.request("post", "/login/with_json", json=user_info)assert response.status_code == 200
-
执行测试命令
# 方法1 pytest # 方法2 -vs显示代码中打印的详细信息 pytest -vs # 方法3 指定文件 pytest test_api.py # 方法4 通过代码启动pytest测试框架 import pytest pytest.main() # 方法5 pytest.ini配置文件可以添加配置选项,这样的话在执行pytest命令时就不需要指定-vs了 [pytest] addopts = -vs
-
pytest进阶用法
- mark
- fixture
- hook
- 各种插件
-
mark, 自定义标记的用途的是筛选用例,只执行部分用例
-
在pytest.ini注册标记
[pytest] addopts = -vs -m "login or db"markers =login: 登录相关db: 数据库相关upload: 上传相关
-
再用例中通过装饰器添加标记
@pytest.mark.db def test_a():print("使用数据库")@pytest.mark.login def test_b():pass@pytest.mark.upload def test_c():passdef test_d():pass
-
在命令行参数中加-m使用标记
pytest -m "login or db"
-
内置标记:由pytest自己注册的,目的不是为筛选用例,而是对用例进行特殊处理。
无需注册,直接使用:
-
skip: 无条件跳过用例
-
skipif: 有条件跳过
-
xfail: 预期失败
-
parametrize: 参数化测试 + 数据文件 = 数据驱动测试
参数化测试:通过添加、编辑数据,实现添加、编辑测试用例的效果。
-
-
-
fixture夹具,在测试用例执行之前、执行之后,自动的运行代码
@pytest.fixture() def jia_ju():print("我是前置代码,在用例执行之前,自动运行")yieldprint("我是后置代码,在用例执行之后,自动运行")@pytest.mark.maya def test_jia_ju(jia_ju):print("我是测试用例")
-
fixture夹具的作用域
python中的作用域有4种:LEGB
- Local: 函数内部
- Enclosing: 嵌套函数的外部函数,闭包中的外部变量
- Global: 模块级别,模块顶级的变量
- Built-in: python内置,print len等等
fixture夹具作用域:5种
- function: 每个用例
- class: 每个类
- model: 每个文件
- package: 每个目录包
- session: 所有的用例
接口自动化测试中,通过fixture提供全局的session,实现TCP复用、参数共享、cookies关联、日志记录、BaseURL。
-
hook钩子
钩子:被pytest自动调用的函数
- 写在conftest.py中
- 符合hook规范定义: 规则定义的方法名在这个文件里面
import _pytest.hookspec
- pytest中有52个hook,分类、顺序、用法。
-
自动化测试项目实战
-
创建fixture
-
创建用例
import pytest@pytest.mark.parametrize("data, code",[({}, 422),({"email": "1341935532@qq.com", "password": "123456"}, 422),({"username": "admin", "password": "123456"}, 200),({"username": "admin", "password": "wrongpassword"}, 401),] ) def test_login(session, data, code):resp = session.post("/login/get_token", json=data)assert resp.status_code == code
-
-
pytest插件生成日志记录和测试报告
-
安装插件
pip install allure-pytest pytest-result-log pytest-base-url
-
配置插件
[pytest] addopts = -vs --alluredir=./allure_results --clean-alluredirlog_file = pytest.log log_file_level = debug log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s log_file_date_format = %Y-%m-%d %H:%M:%S result_log_level_verbose = infomarkers =login: 登录相关db: 数据库相关upload: 上传相关maya: maya相关
-
生成报告
(1)下载安装allure
https://github.com/allure-framework/allure2/releases
(2)执行allure命令,生成测试报告:
allure generate -o report ./allure_results
-
-
总结:
- requests是手,pytest是脑
- pytest+requests可以实现基本的接口自动化
- 测试框架+持续集成,形成企业级的落地方案