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
,因为我在方法中更改了它?这有什么决心吗?
答案 0 :(得分:4)
您正在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来跟踪测试结果;所有
setUpClass
和tearDownClass
方法可以应用于多个测试(取决于测试的运行方式),因此状态是共享的。
答案 1 :(得分:0)
尝试使用self.__class__.result = "ok"
。
它不起作用的原因是setUpClass()
是类方法(因为@classmethod
装饰器),所以self
参数是实际上是一堂课。因此self.result = 'error'
会更改类属性。