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来为本地每个目录实现插件 。

 

posted @ 2020-12-15 09:53  测试充电宝  阅读(131)  评论(0)    收藏  举报