Pytest测试实战
一、使用约束
在执行pytest命令时,会自动从当前目录及子目录中寻找符合以下约束的测试函数来执行。可以在pytest.ini中修改测试目录、测试模块、测试类、测试方法扫描进行默认修改。
-
在单测文件中,所有测试类以Test开头,并且不能带’init’方法
-
在单测类中,可以包含一个或者多个以’test_'开头的函数
二、常用命令
- pytest -v test_xxx.py —> -v参数可以得到更完整的前后对比信息。
- pytest -collect-only test_xxx.py —> 用来显示给定配置下会有哪些测试用例被运行。也可以用**’–co’**参数。
- pytest -k “add or passing” --co —> 使表达式指定特定的测试用例运行。
- pytest -m test_xxx.py —> 该选项用于运行做过标记的用例。标记使用装饰器:@pytest.mark。
- pytest -x test_xxx.py —> 用于断言失败或者触发了异常时立即停止整个会话。方便调试。
- pytest –maxfail=1 test_xxx.py —> 指定失败几次后停止,num等于1时相当于-x。
- pytest -s test_xxx.py —> 允许测试时输出任何符合标准的输出流信息,例如print。
- pytest -lf test_xxx.py —> 用于重新运行之前失败的用例,如果没有任何失败,则全部重跑。
- pytest -ff test_xxx.py —> 先运行失败的用例再运行其他的。
- pytest -q test_xxx.py —> 与 -v 相反,安静模式,只显示关键的信息。
- pytest -l test_xxx.py —> 用来失败时显示局部变量。
- pytest –duration test_xxx.py —> 用来显示哪个阶段占用时间最长。
- pytest --setup-show test_xxx.py —> 用来查看fixture的执行过程。
三、标记操作
-
@pytest.mark.skip(reason=’’) —> 跳过一些不想执行的测试用例。
-
@pytest.mark.skipif(version==5, reason=’’) —> 满足某个条件时跳过一些不想执行的测试用例。
-
@pytest.mark.xfail() —> 用来标记一些预计原本就不会执行通过的测试用例,如果预计失败运行失败,显示x,预计失败运行成功,显示X。
-
@pytest.mark.parametrize(“name”, [“Jone”, “Mark”]) —> 用来参数化测试
@pytest.mark.parametrize("name, age", [("Mark", 18), ("Joe", 20)]) def test_user_name(name, age): assert name == "Joe" and age == 20
-
@pytest.mark.usefixtures(‘fixture1’, ‘fixture2’) 标记测试函数或者类。使用usefixtures需要在参数列表中指定一个或者多个fixture字符串。非常适合测试类。
四、组织测试用例合集
- 执行某个目录下的单元测试:cd path && pytest
- 执行单个文件:pytest test_xx.py
- 执行单个测试类:pytest test_xx.py::TestClass
- 执行某个测试类中的某个用例:pytest test_xx.py::TestClass::test_class_01
五、fixture
fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等。
**@pytest.fixture()**用于指定函数是一个fixture。如果测试函数的参数列表中包含fixture名,那么会被pytest检测到,并在函数运行之前运行该fixture。fixture可以完成任务,也可以返回数据给测试函数。
"""使用fixture执行配置及销毁逻辑"""
import pytest
@pytest.fixture()
def some_data():
"""Return answer to ultimate question"""
return 42
def test_some_data(some_data):
"""User fixture return value i