pytest fixture-在带有usefixture的类和模块中使用fixture

2022-03-18 14:23 更新

有时测试函数不需要直接访问​​fixture​​对象。例如,测试可能需要使用空目录作为当前工作目录进行操作,但不关心具体目录。下面介绍如何使用标准的​​tempfile​​和pytest ​​fixture​​来实现它。我们将​​fixture​​的创建分离到一个​​conftest.py​​文件中:

# content of conftest.py

import os
import tempfile

import pytest


@pytest.fixture
def cleandir():
    with tempfile.TemporaryDirectory() as newpath:
        old_cwd = os.getcwd()
        os.chdir(newpath)
        yield
        os.chdir(old_cwd)

并通过​​usefixtures​​标记在测试模块中声明它的使用:

# content of test_setenv.py
import os
import pytest


@pytest.mark.usefixtures("cleandir")
class TestDirectoryInit:
    def test_cwd_starts_empty(self):
        assert os.listdir(os.getcwd()) == []
        with open("myfile", "w") as f:
            f.write("hello")

    def test_cwd_again_starts_empty(self):
        assert os.listdir(os.getcwd()) == []

对于​​usefixture​​标记,在执行每个测试方法时需要​​cleandir fixture​​,就像为每个测试方法指定了一个​​cleandir​​函数参数一样。让我们运行它来验证我们的​​fixture​​被激活,并且测试通过:

$ pytest -q
..                                                                   [100%]
2 passed in 0.12s

你可以像这样指定多个​​fixture​​:

@pytest.mark.usefixtures("cleandir", "anotherfixture")
def test():
    ...

你可以在测试模块级别使用​​pytestmark​​来指定​​fixture​​的使用:

pytestmark = pytest.mark.usefixtures("cleandir")

也可以将项目中所有测试所需的​​fixture​​放入一个​ini​文件中:

# content of pytest.ini
[pytest]
usefixtures = cleandir


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号