对于一组自动化测试,仅运行setUp一次

Kes*_*dal 68 python unit-testing

我的Python版本是2.6.

我想只执行一次测试setUp方法,因为我在那里做所有测试都需要的东西.

我的想法是创建一个布尔变量,在第一次执行后将设置为'true',然后禁用多次调用setup方法.

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)
Run Code Online (Sandbox Code Playgroud)

输出:

False

True

--- Test 1 ---

False

True

--- Test 2 ---
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我错过了什么吗?

Dan*_*man 97

您可以使用它setUpClass来定义每个testsuite只运行一次的方法.

  • @JohnM.:您可以下载unittest2 backport包并获取旧版python-dist上的所有新内容. (2认同)

Che*_*ary 56

Daniel的回答是正确的,但是这里有一个例子可以避免我发现的一些常见错误,例如super()在是(如in 或)的子类setUpClass()时不调用.TestCaseunittest.TestCasedjango.testfalcon.testing

该文档setUpClass()没有提到您需要super()在这种情况下调用.如果不这样做,您将收到错误,如相关问题所示.

class SomeTest(TestCase):
    def setUp(self):
        self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)

    @classmethod
    def setUpClass(cls):
        """ get_some_resource() is slow, to avoid calling it for each test use setUpClass()
            and store the result as class variable
        """
        super(SomeTest, cls).setUpClass()
        cls.the_resource = get_some_resource()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅在 `TestCase` 是 `unittest.TestCase` 的子类时才相关。 (2认同)

Gre*_*oss 6

我正在使用 Python 3,发现该cls参考也可以在该setup方法中使用,因此以下方法有效:

class TestThing(unittest.TestCase):

  @classmethod
  def setUpClass(cls):
    cls.thing = Thing() # the `thing` is only instantiated once

  def setup(self):
    self.thing = TestThing.thing # ...but set on each test case instance

  def test_the_thing(self):
    self.assertTrue(self.thing is not None)
Run Code Online (Sandbox Code Playgroud)