4

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

>>> 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
4

5 回答 5

11

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

定义 setUp() 方法后,测试运行程序将在每次测试之前运行该方法。

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

于 2008-09-16T13:55:02.777 回答
9

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

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

于 2008-09-16T15:47:30.993 回答
0

如果我在那个测试框架中没记错的话,setUp 方法会在每次测试之前运行

于 2008-09-16T13:54:38.953 回答
0

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

于 2008-10-18T21:13:18.670 回答
-1

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

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

于 2008-09-16T14:12:08.913 回答