Python的单元测试逻辑

时间:2008-09-16 13:50:25

标签: python unit-testing

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

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

5 个答案:

答案 0 :(得分:11)

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

  

定义setUp()方法时,   测试运行器将先运行该方法   每次测试。

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

答案 1 :(得分:9)

每个测试都使用MyTest类的新实例运行。这意味着如果你在一次测试中改变self,那么更改不会转移到其他测试,因为self会引用不同的实例。

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

答案 2 :(得分:0)

如果我在该测试框架中正确回忆,setUp方法在每次测试之前运行

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

您还可以使用在每种测试方法之后运行的tearDown方法。但是,如果您的某个测试崩溃,则您的tearDown方法将永远无法运行。