Python';单元测试逻辑

Python';单元测试逻辑,python,unit-testing,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.as

有人能给我解释一下这个结果吗。第一个测试成功,但第二个测试失败,尽管测试的变量在第一个测试中发生了更改

>>> 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
>类MyTest(unittest.TestCase):
def设置(自):
self.i=1
def testA(自我):
self.i=3
self.assertEqual(self.i,3)
def测试B(自身):
self.assertEqual(self.i,3)
>>>unittest.main()
F
======================================================================
失败:testB(\uuuuu main\uuuuuu.MyTest)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
testB中第8行的文件“”
断言错误:1!=3.
----------------------------------------------------------------------
在0.016秒内运行了2次测试

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

来自:

定义setUp()方法时 测试运行程序将在之前运行该方法 每一次测试的结果


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

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


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

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


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

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