是否为每个方法或在TestCase的开头和结尾处运行setUp和tearDown方法

时间:2018-07-16 14:17:18

标签: python python-unittest

属于同一TestCase成员的测试方法会相互影响吗?

在python unittest中,我尝试了解如果我在测试方法中更改了变量,那么该变量在其他测试方法中也会更改吗?还是为每个方法运行setUp和tearDown方法,然后为每个方法再次设置变量?

我的意思是

AsdfTestCase(unittest.TestCase):
    def setUp(self):
        self.dict = {
                     'str': 'asdf',
                     'int': 10
                    }
    def tearDown(self):
        del self.dict

    def test_asdf_1(self):
        self.dict['str'] = 'test string'

    def test_asdf_2(self):
        print(self.dict)

所以我要问哪个输出 test_asdf_2() 'asdf''test_string'

2 个答案:

答案 0 :(得分:2)

每个测试用例都是独立存在的。设置方法在每个测试用例之前运行,而拆解在每个测试用例之后运行。

所以要回答您的问题,如果您在测试用例中更改了变量,则不会影响其他测试用例。

编写测试代码可以使您走上正确的道路。当您自己做时,总是一种更好的学习体验。但是,这是您的答案。

示例代码:

import unittest

class AsdfTest(unittest.TestCase):
  def setUp(self):
    print "Set Up"
    self.dict = {
      'str': 'asdf',
      'int': 10
    }

  def tearDown(self):
    print "Tear Down"
    self.dict = {}

  def test_asdf_1(self):
    print "Test 1"
    self.dict['str'] = 'test string'
    print self.dict

  def test_asdf_2(self):
    print "Test 2"
    print self.dict

if __name__ == '__main__':
  unittest.main()

输出:

Set Up
Test 1
{'str': 'test string'}
Tear Down
.Set Up
Test 2
{}
Tear Down
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

您可以看到设置方法是在每次测试之前运行的。然后在每次测试后运行拆卸方法。

答案 1 :(得分:2)

是的,setUp和tearDown在测试用例类中的每次测试(即名称中以“ test”开头的函数)之前运行。考虑以下示例:

# in file testmodule
import unittest

class AsdfTestCase(unittest.TestCase):
    def setUp(self)      : print('setUp called')
    def tearDown(self)   : print('tearDown called')
    def test_asdf_1(self): print( 'test1 called' )
    def test_asdf_2(self): print( 'test2 called' )

从命令行调用它:

 $ python3 -m unittest -v testmodule
test_asdf_1 (testmodule.AsdfTestCase) ... setUp called
test1 called
tearDown called
ok
test_asdf_2 (testmodule.AsdfTestCase) ... setUp called
test2 called
tearDown called
ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

(因此,是的,在您的示例中,由于将重新执行setUp并覆盖由测试2引起的更改,因此它将弹出'asdf')