为什么unittest.TestCases看不到我的py.test装置?

问题描述 投票:0回答:4

我正在尝试将

py.test
fixtures 与我的单元测试结合使用
unittest
。我已将几个固定装置放入项目顶层的
conftest.py
文件中(如此处所述),用
@pytest.fixture
装饰它们,并将它们的名称作为需要它们的测试函数的参数。

灯具注册正确,如

py.test --fixtures test_stuff.py
所示,但是当我运行
py.test
时,我得到
NameError: global name 'my_fixture' is not defined
。这似乎只在我使用
unittest.TestCase
的子类时发生 - 但
py.test
文档似乎说它与
unittest
配合得很好。

为什么我使用

unittest.TestCase
时测试看不到灯具?


不起作用:

conftest.py

@pytest.fixture
def my_fixture():
    return 'This is some fixture data'

test_stuff.py

import unittest
import pytest

class TestWithFixtures(unittest.TestCase):

    def test_with_a_fixture(self, my_fixture):
         print(my_fixture)

作品:

conftest.py

@pytest.fixture()
def my_fixture():
    return 'This is some fixture data'

test_stuff.py

import pytest

class TestWithFixtures:

    def test_with_a_fixture(self, my_fixture):
         print(my_fixture)

我问这个问题更多是出于好奇;现在我只是完全放弃

unittest

python unit-testing fixtures pytest python-unittest
4个回答
25
投票

虽然 pytest 支持通过测试函数参数接收装置 对于非unittest测试方法,unittest.TestCase方法不能 直接接收固定功能参数作为实现 可能会影响运行一般unittest.TestCase测试的能力 套房。

来自底部的注释部分: https://pytest.org/en/latest/unittest.html

可以使用具有

unittest.TestCase
es 的灯具。请参阅该页面了解更多信息。


11
投票

您可以将

unittest.TestCase
中的 pytest 固定装置与 pytest 选项
autouse
一起使用。但是,如果您使用
test_
作为使用夹具的单位方法,则会出现以下错误:

Fixtures are not meant to be called directly,...

### conftest.py
@pytest.fixture
def my_fixture():
    return 'This is some fixture data'

一种解决方案是使用

prepare_fixture
方法将固定装置设置为
TestWithFixtures
类的属性,以便固定装置可用于所有单元测试方法。

### test_stuff.py
       
import unittest
import pytest
    
class TestWithFixtures(unittest.TestCase):
    

    @pytest.fixture(autouse=True)
    def prepare_fixture(self, my_fixture):
        self.myfixture = my_fixture

    def test_with_a_fixture(self):
        print(self.myfixture)

5
投票
  1. 将夹具定义为可访问变量(如以下示例中的

    input
    )。要定义它,请使用
    request.cls.VARIABLE_NAME_YOU_DEFINE = RETURN_VALUE

  2. 使用

    @pytest.mark.usefixtures("YOUR_FIXTURE")
    在单元测试类之外使用固定装置,在单元测试类内部,通过
    self.VARIABLE_NAME_YOU_DEFINE
    访问固定装置。

例如

import unittest
import pytest


@pytest.fixture(scope="class")
def test_input(request):
    request.cls.input = {"key": "value"}


@pytest.mark.usefixtures("test_input")
class MyTestCase(unittest.TestCase):

    def test_something(self):
        self.assertEqual(self.input["key"], "value")

0
投票

这对我有用。对 pytest 有更多了解的人可能能够解释它为什么有效。我无法在类上使用 @pytest.mark.usefixtures 的文档中找到为我工作的解决方案。

class MyTest(TestCase):

    @pytest.fixture(autouse=True)
    def inject_fixtures(self, request):
        self.db_session = request.getfixturevalue("db_session")

    def test_method1(self):
        assert hasattr(self, "db_session")
        # assert 0, self.db  # fail for demo purposes
© www.soinside.com 2019 - 2024. All rights reserved.