关于python:为每个方法或在TestCase的开头和结尾运行setUp和tearDown方法

Do setUp and tearDown methods run for each method or at the beginning and at the end of TestCase

属于同一个测试用例的成员的测试方法是否相互影响?

在PythonUnitTest中,我试图理解,如果我在测试方法中更改了一个变量,那么其他测试方法中的变量是否会更改。还是为每个方法运行设置和拆卸方法,以便为每个方法重新设置变量?

我的意思是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

因此,我询问将打印哪个输出测试'asdf'或'test_string'


是的,在测试用例类中的每个测试(即名称中以"test"开头的函数)之前都会运行安装和拆卸。考虑这个例子:

1
2
3
4
5
6
7
8
# 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' )

从命令行调用它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 $ 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

(因此,是的,在您的示例中,由于重新执行安装程序,它将触发"asdf",覆盖由测试2引起的更改)


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

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

通过编写测试代码,您走上了正确的道路。当你自己动手的时候,这总是一种更好的学习体验。不过,这是你的答案。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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()

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
Set Up
Test 1
{'str': 'test string'}
Tear Down
.Set Up
Test 2
{}
Tear Down
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

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