参考博文地址:https://www.cnblogs.com/yoyoketang/tag/pytest/
官方文档地址:https://docs.pytest.org/en/latest/
命名规则
文件名以test_*.py
文件和*_test.py
以 test_ 开头的函数
以 Test 开头的类
以 test_ 开头的方法
所有的包 package 必须要有__init__.py
文件
pytest常用执行命令
pytest -s
:执行并展示print信息
pytest -k "Class and not method"
:执行命名为包含Class的测试类,不执行命名包含method的测试方法(注意双引号)
pytest test_01.py::TestClass::test_method
:执行test_01.py文件下的TestClass类下的test_method方法
pytest -m hahaha
:执行@ pytest.mark.hahaha
装饰器修饰的测试
pytest -x
:遇到错误时停止测试
pytest --maxfail=1
:用例错误个数达到指定数量时停止测试(注意双短横线)
用例运行级别
- 模块级(setup_module/teardown_module)开始于模块始末,全局的
- 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
- 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
- 方法级(setup_method/teardown_method)开始于方法始末(在类中)
- 类里面的(setup/teardown)运行在调用方法的前后(setup_method和teardown_method的功能和setup/teardown功能是一样的,一般二者用其中一个即可)
setup_module/teardown_module的优先级是最大的,然后函数里面用到的setup_function/teardown_function与类里面的setup_class/teardown_class互不干涉
fixture
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
使用装饰器标记fixture的功能
可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用
引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
:arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".
:arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
:arg autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
:arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
:arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')”。
- scope=“function”,针对函数
- scope=“class”,针对class
- scope=“module”,针对一个 .py 文件
- scope=“session”,针对一次运行
另:
- fixture里面的teardown用yield来唤醒teardown的执行
- 除了yield可以实现teardown,在request-context对象中注册addfinalizer方法也可以实现终结函数。
- yield和addfinalizer方法都是在测试完成后呼叫相应的代码。但是addfinalizer不同的是:
- 他可以注册多个终结函数。
- 这些终结方法总是会被执行,无论在之前的setup code有没有抛出错误。这个方法对于正确关闭所有的fixture创建的资源非常便利,即使其一在创建或获取时失败
conftest.py配置
pytest里面默认读取conftest.py里面的配置,conftest.py配置需要注意以下点:
- conftest.py配置脚本名称是固定的,不能改名称
- conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
- 不需要import导入conftest.py的,pytest用例会自动查找
测试报告(pytest-html)
安装
$ pip install pytest-html
执行(生成的报告有多个文件)
$ pytest --html=report.html
$ pytest --html=./report/report.html
执行(生成单个文件的报告)
$ pytest --html=report.html --self-contained-html