6.pytest强大的fixture(上)
测试fixture的目的是提供一个测试的基线,在此基线基础上,可以更可靠的进行重复测试。Pytest的 fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:
-
测试fixture有明确的名称,通过在函数/模块/类或者整个项目中激活来使用 。
-
测试fixture是模块化的实现,使用fixture名即可触发特定的fixture,fixture可以在其他fixture中 进行使用 。
-
测试fixture不仅可以进行简单的单元测试,也可以进行复杂的功能测试。可以根据配置和组件的 选项进行参数化定制测试,或者跨函数/类/模块或者整个测试过程进行测试。
作为函数入参的fixture
测试函数可以通过接受一个已经命名的fixture对象来使用他们。对于每个参数名,如果fixture已经声明定义,会自动创建一个实例并传入该测试函数。fixture函数通过装饰器标志@pytest.fixture来注册。下面是一个简单的独立的测试模块,包含一个fixture及使用它的测试函数
1 # test_fixture.py 2 import pytest 3 4 5 @pytest.fixture 6 def smtp_connection(): 7 import smtplib 8 return smtplib.SMTP("smtp.qq.com", 587, timeout=5) 9 10 def test_ehlo(smtp_connection): 11 response, msg = smtp_connection.ehlo() 12 assert response == 250 13 assert 0 # 用于调试
这里,test_ehlo需要smtp_connection这个fixture的返回。pytest会在@pytest.fixture的fixture中查找并调用名为smtp_connection的fixture。运行这个测试结果如下:
(pytest) D:\study\auto-pytest>pytest test_fixture.py =============================== test session starts =============================== platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1 rootdir: D:\study\auto-pytest collected 1 item test_fixture.py F[100%] =============================== FAILURES =============================== _______________________________ test_ehlo _______________________________ smtp_connection = <smtplib.SMTP object at 0x0000014FA26653C8> def test_ehlo(smtp_connection): response, msg = smtp_connection.ehlo() assert response == 250 > assert 0 # 用于调试 E assert 0 test_fixture.py:11: AssertionError =============================== short test summary info =============================== FAILED test_fixture.py::test_ehlo - assert 0 =============================== 1 failed in 0.31s ===============================
测试的回显中可以看出测试函数调用了smtp_connection,这是由fixture函数创建的smtplib.SMTP() 的一个实例。该函数在我们故意添加的assert 0处失败。以下是pytest的在调用该函数的时候的详细规则:
-
pytest找到以test_作为前缀的测试用例test_ehlo。该测试函数有一个名为smtp_connection的 入参。而在fixture函数中存在一个名为smtp_connection的fixture。
-
smtp_connection()被调用来创建一个实例。
-
test_ehlo(<smtp_connection实例>)被调用并在最后一行因为断言失败。注意,如果拼错了函数参数,或者使用了一个不可用的参数,你会看到一个包含可用函数参数列表的错误信息
注意:你可以使用 pytest --fixtures test_fixture.py 来查看可用的fixture(如果想查看以_开头的fixture,请添加-v参数)
conftest.py:共享fixture函数
实现测试用例的过程中,当你发现需要使用来自多个文件的fixture函数的时候,可以将这些fixture函数放到conftest.py中。
你不需要导入这些fixture函数,它会由pytest自动检索。
fixture函数的检索顺序是从测试类开始,然后测试的模块,然后就是conftest.py文件,最后是内置的插件和第三方插件。
你还可以使用conftest.py来为本地每个目录实现插件 。

浙公网安备 33010602011771号