23

我有一堆使用 pytest 编写的测试。都在一个目录下dir。例如:

dir/test_base.py
dir/test_something.py
dir/test_something2.py
...

其中代码的简化版本如下:

test_base.py

import pytest

class TestBase:
   def setup_module(module):
      assert False

   def teardown_module(module):
      assert False

test_something.py

import pytest
from test_base import TestBase

class TestSomething(TestBase):
   def test_dummy():
       pass

test_something2.py

import pytest
from test_base import TestBase

class TestSomethingElse(TestBase):
   def test_dummy2():
       pass

我所有的test_something*.py文件都扩展了test_base.py. 现在setup_module(module)teardown_module(module)test_base.py. 我期望 setup_module 为所有测试调用一次,并teardown_module()在所有测试完成后在最后调用。

但是这些函数似乎没有被调用?我需要一些装饰器才能工作吗?

4

4 回答 4

16

OP 的要求是设置和拆卸每个只执行一次,而不是每个模块一次。这可以通过一个conftest.py文件的组合来完成,@pytest.fixture(scope="session")并将夹具名称传递给每个测试函数。

这些在Pytest 固定装置文档中进行了描述

这是一个例子:

conftest.py

import pytest

@pytest.fixture(scope="session")
    def my_setup(request):
        print '\nDoing setup'
        def fin():
            print ("\nDoing teardown")
        request.addfinalizer(fin)

test_something.py

def test_dummy(my_setup):
    print '\ntest_dummy'

test_something2.py

def test_dummy2(my_setup):
    print '\ntest_dummy2'

def test_dummy3(my_setup):
    print '\ntest_dummy3'

运行 py.test -s 时的输出:

collected 3 items 

test_something.py 
Doing setup

test_dummy
.
test_something2.py 
test_dummy2
.
test_dummy3
.
Doing teardown

名字conftest.py很重要:你不能给这个文件一个不同的名字,并期望 Pytest 找到它作为固定装置的来源。

设置scope="session"很重要。否则,将为每个测试模块重复设置和拆卸。

如果您不想将夹具名称my_setup作为参数传递给每个测试函数,您可以将测试函数放在一个类中并将pytest.mark.usefixtures装饰器应用于该类。

于 2015-09-14T20:09:55.330 回答
12

放在模块级别的setup_moduleteardown_module之外。然后在您的测试中添加您的课程。

def setup_module(module):
    """..."""

def teardown_module(module):
    """..."""

class TestSomething:

    def test_dummy(self):
        """do some tests"""

有关详细信息,请参阅这篇文章

于 2012-01-08T19:15:16.570 回答
1

为定义最终(派生)测试的模块调用 setup_module/teardown_module。这也允许自定义设置。如果你只有一个 setup_module,你可以把它放到 test_base.py 并从其他地方导入。HTH。

于 2011-10-18T18:18:11.593 回答
-1

首先,将所有测试放在一个名为“tests”的模块中是一个好习惯:

<product>
   ...
   tests/
      __init__.py
      test_something.py

其次,我认为您应该在基类中使用 setup_class/teardown_class 方法:

import unittest
class MyBase(unittest.TestCase):

   @classmethod
   def setup_class(cls):
       ...

   @classmethod
   def teardown_class(cls):
       ...

更多信息: http: //pytest.org/latest/xunit_setup.html

于 2011-10-16T20:22:37.127 回答