python-3.x 在conftest中定义类作用域fixture之后运行setup_class()类

f8rj6qna  于 2022-11-19  发布在  Python
关注(0)|答案(3)|浏览(295)

因此,我在conftest.py文件中定义了fixture,scope=“class”,因为我希望在调用每个测试类之前运行它们。conftest文件放在项目根目录中,以便每个测试模块都能看到它。
现在在一个测试模块中,我有另一个setup函数,我只想为那个模块运行一次。但问题是setup_class()方法在运行conftest.py中定义的fixture之前被调用。这是预期的吗?我希望它是相反的,因为我想使用conftest中定义的fixture中完成的一些事情。如何做到这一点?
代码-
conftest.py:

@pytest.fixture(scope="class")
def fixture1(request):
    #set a

@pytest.fixture(scope="class")
    def fixture1(request):

测试_1.py:

@pytest.mark.usefixtures("fixture_1", "fixture_2")
   class Test1():

      #need this to run AFTER the fixture_1 & fixture_2 
      def setup_class():
          #setup
          #get a set in fixture_1
      
      def test_1()
      .....

我知道我可以简单地在测试文件中定义一个fixture而不是setup_class,但是我必须在每个测试方法的参数中指定它,这样它才能被pytest调用。

szqfcxe2

szqfcxe21#

我也遇到了同样的问题。直到现在我才意识到问题可能是setup_class在fixture之前被调用〉-/我认为这个问题类似于这个问题Pytest - How to pass an argument to setup_class?。问题是混合了unittest和pytest方法。我差不多做了他们建议的-我省略了setup_class并在特定的测试文件中创建了一个新的fixture。调用conftest.py中的fixture。到目前为止,它是有效的。

0mkxixxg

0mkxixxg2#

问题是你只能在pytest运行的测试函数(或方法)中使用fixture的结果。在这里我可以建议一个变通方法。但是当然我不确定它是否适合你的需要。
解决方法是从测试方法调用函数:
conftest.py

@pytest.fixture(scope='class')
def fixture1():
    yield 'MYTEXT'

测试_1.py

class Test1:
    def setup_class(self, some_var):
        print(some_var)

    def test_one(self, fixture1):
        self.setup_class(fixture1)
gz5pxeao

gz5pxeao3#

Fixtures和setup_class是初始化测试函数(和类)的两种不同的范例。类作用域的fixture单个测试函数(方法)运行时运行。另一方面,setup_class在它们之前运行。因此,不可能从setup_class访问fixture值(或fixture修改状态)。
其中一个解决方案是完全停止使用setup_class,坚持使用fixture-only解决方案,这是pytest现在的首选方法(参见开头的注解)。

# conftest.py or the test file:
@pytest.fixture(scope="class")
def fixture_1(request):
    print('fixture_1')

# the test file:
class Test1():
    @pytest.fixture(scope="class", autouse=True)
    def setup(self, fixture_1, request):
        print('Test1.setup')

    def test_a(self):
        print('Test1.test_a')

    def test_b(self):
        print('Test1.test_b')

请注意,setup fixture * 依赖于 * fixture_1,因此可以访问它。

相关问题