Python的单元测试逻辑

时间:2020-03-05 18:55:59  来源:igfitidea点击:

有人可以向我解释这个结果。第一个测试成功,但第二个失败,尽管在第一个测试中更改了测试的变量。

>>> class MyTest(unittest.TestCase):
    def setUp(self):
        self.i = 1
    def testA(self):
        self.i = 3
        self.assertEqual(self.i, 3)
    def testB(self):
        self.assertEqual(self.i, 3)

>>> unittest.main()
.F
======================================================================
FAIL: testB (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<pyshell#61>", line 8, in testB
AssertionError: 1 != 3

----------------------------------------------------------------------
Ran 2 tests in 0.016s

解决方案

回答

如果我在该测试框架中正确记得,则setUp方法将在每次测试之前运行

回答

从http://docs.python.org/lib/minimal-example.html:

When a setUp() method is defined, the
  test runner will run that method prior
  to each test.

因此,setUp()在testA和testB之前运行,每次将i设置为1. 在幕后,实际上每个测试都重新初始化了整个测试对象,在执行测试之前,setUp()在每个新实例上运行。

回答

正如其他所有人所说,setUp方法在我们编写的每个测试方法之前运行。因此,当testB运行时,i的值为1,而不是3.

我们还可以使用在每种测试方法之后运行的tearDown方法。但是,如果一项测试崩溃了,tearDown方法将永远不会运行。

回答

每个测试都使用MyTest类的新实例运行。这意味着,如果我们在一个测试中更改了self,则更改将不会延续到其他测试中,因为self将引用其他实例。

此外,正如其他人指出的那样,在每次测试之前都会调用setUp。

回答

从方法论的角度来看,单个测试应该是独立的,否则可能会产生更多难以发现的错误。例如,假设将以不同的顺序调用testA和testB。