2016-10-25 129 views
-2
import unittest 

class TestTemplate(unittest.TestCase): 

    @classmethod 
    def setUpClass(self): 
     self.result = 'error' 
     print "setUpClass" 

    @classmethod 
    def tearDownClass(self): 
     print "The value of result is, ",self.result 
     if self.result == 'ok': 
      print "it is working" 
     print "The value of cls result is : ", self.result 
     print "TearDownClass" 


class MyTest(TestTemplate): 

    def test_method_one(self): 
     self.result = 'ok' 
     print self.result 


if __name__ == '__main__': 
    unittest.main() 

tearDownClass self.result的值是error变量的值,而是应该okay,因为我的方法改变了吗?有没有解决这个问题?变化的单元测试蟒蛇

回答

3

您在setUp方法改变类属性,并在tearDown再次读它,因为两者都是类方法。但是,在您的测试中,您正在设置一个实例属性。

你不得不把它放在类,而不是直接:

type(self).result = 'ok' 

MyTest.result = 'ok' 

它后者关系到当前的测试类,第一个选项让它即使是在工作子类。

演示:

>>> import unittest 
>>> class TestTemplate(unittest.TestCase): 
...  @classmethod 
...  def setUpClass(self): 
...   self.result = 'error' 
...   print "setUpClass" 
...  @classmethod 
...  def tearDownClass(self): 
...   print "The value of result is, ",self.result 
...   if self.result == 'ok': 
...    print "it is working" 
...   print "The value of cls result is : ", self.result 
...   print "TearDownClass" 
... 
>>> class MyTest(TestTemplate): 
...  def test_method_one(self): 
...   type(self).result = 'ok' 
...   print self.result 
... 
>>> unittest.main(exit=False) 
setUpClass 
ok 
.The value of result is, ok 
it is working 
The value of cls result is : ok 
TearDownClass 

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 
<unittest.main.TestProgram object at 0x103945090> 

但是,你一般要避免在各个测试更改测试类的状态。使用现有的test runner facilities来追踪测试结果;所有

setUpClasstearDownClass方法可以应用到多个测试(取决于如何测试运行),所以状态是共享的。

+0

具有很多意义。但是在python中改变测试类的状态是否是一个好习惯?我试图存储每个测试的结果,无论它通过了还是失败。@ Martjin Pieters –

+0

@HarshdeepSingh:类的状态与实例状态一样动态;如果你需要在实例之间共享状态,那么在课堂上这样做很好。为什么你需要将每个测试的结果存储在测试类中呢?测试运动员已经为你跟踪状态。 –

+0

@HarshdeepSingh你应该检查https://docs.python.org/2/library/unittest.html#unittest.TestResult,正如Martijn所说的,而不是试图自己收集结果。 – ElmoVanKielmo

0

尝试使用self.__class__.result = "ok"

它不工作的原因是setUpClass()是(因为@classmethod装饰的)一个方法,所以self参数实际上是存在的一类。因此self.result = 'error'更改类属性。

+0

通常,'type(self)'比'self____ class__'更可取。只能将'self .__ class__'用于旧式的Python类。 –