单元测试中变量值的变化 python
Change of value of variable in unittest python
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
,因为我在方法中改变了它?有解决办法吗?
您正在 setUp
方法中更改 class 属性 ,并在 tearDown
中再次读取它,因为两者都是 class 方法。但是,在您的测试中,您正在设置 instance 属性。
您必须直接在 class 上设置它:
type(self).result = 'ok'
或
MyTest.result = 'ok'
后者将它与当前测试联系起来 class,第一个选项让它甚至在 subclasses 中也能工作。
演示:
>>> 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>
但是,您通常希望避免在单个测试期间更改测试 class 状态。使用现有的 test runner facilities 来跟踪测试结果;全部
setUpClass
和tearDownClass
方法可以应用于多个测试(取决于测试的方式运行),所以状态已分享。
尝试使用 self.__class__.result = "ok"
。
它不起作用的原因是 setUpClass()
是一个 class 方法(因为 @classmethod
装饰器),所以self
参数实际上有一个class。因此 self.result = 'error'
更改了 class 属性。
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
,因为我在方法中改变了它?有解决办法吗?
您正在 setUp
方法中更改 class 属性 ,并在 tearDown
中再次读取它,因为两者都是 class 方法。但是,在您的测试中,您正在设置 instance 属性。
您必须直接在 class 上设置它:
type(self).result = 'ok'
或
MyTest.result = 'ok'
后者将它与当前测试联系起来 class,第一个选项让它甚至在 subclasses 中也能工作。
演示:
>>> 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>
但是,您通常希望避免在单个测试期间更改测试 class 状态。使用现有的 test runner facilities 来跟踪测试结果;全部
setUpClass
和tearDownClass
方法可以应用于多个测试(取决于测试的方式运行),所以状态已分享。
尝试使用 self.__class__.result = "ok"
。
它不起作用的原因是 setUpClass()
是一个 class 方法(因为 @classmethod
装饰器),所以self
参数实际上有一个class。因此 self.result = 'error'
更改了 class 属性。