Pon*_*nds 3 python unit-testing python-3.x python-unittest
我想在测试方法中为类属性设置一个值,并在另一个测试方法中使用具有相同类属性的值.当我通过run方法执行测试用例以正常方式尝试时,得到错误AttributeError: 'Unit' object has no attribute 'b'.无论如何,我通过使用global变量和通过将类分配给变量来找到其他解决方案.我可以知道为什么我无法检索我使用其他方法设置相同的类属性的原因吗?另外,你能帮我用run方法解释实际过程......提前谢谢.
这是我尝试的示例代码:
import unittest
class Unit(unittest.TestCase):
def test_i(self):
self.b=20
def test_j(self):
print self.b
suite=unittest.TestLoader().loadTestsFromTestCase(Unit)
unittest.TextTestRunner(verbosity=2).run(suite)
test_i (__main__.Unit) ... ok
test_j (__main__.Unit) ... ERROR
======================================================================
ERROR: test_j (__main__.Unit)
----------------------------------------------------------------------
Traceback (most recent call last):
File "<pyshell#52>", line 5, in test_j
AttributeError: 'Unit' object has no attribute 'b'
----------------------------------------------------------------------
Ran 2 tests in 0.078s
FAILED (errors=1)
<unittest.runner.TextTestResult run=2 errors=1 failures=0>
#The two ways which I solved...
#1.By Assinging class to a variable
import unittest
class Unit(unittest.TestCase):
def test_i(self):
Class=Unit
Class.b=20
def test_j(self):
print self.b
suite=unittest.TestLoader().loadTestsFromTestCase(Unit)
unittest.TextTestRunner(verbosity=2).run(suite)
test_i (__main__.Unit) ... ok
test_j (__main__.Unit) ... 20
ok
----------------------------------------------------------------------
Ran 2 tests in 0.094s
OK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
#2.By using global attribute,but I need the class attribute value to be set and retrieved
import unittest
class Unit(unittest.TestCase):
def test_i(self):
global b,
b=20
def test_j(self):
print b
suite=unittest.TestLoader().loadTestsFromTestCase(Unit)
unittest.TextTestRunner(verbosity=2).run(suite)
test_i (__main__.Unit) ... ok
test_j (__main__.Unit) ... 20
ok
----------------------------------------------------------------------
Ran 2 tests in 0.063s
OK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
Run Code Online (Sandbox Code Playgroud)
该属性不会出现在实例中,因为每个测试都在自己的实例中执行,您可以在此代码中看到:
import unittest
class Unit(unittest.TestCase):
def __init__(self, *args, **kwargs):
print('init!')
super(Unit, self).__init__(*args, **kwargs)
def test_i(self):
self.b = 20
def test_j(self):
print(self.b)
suite = unittest.TestLoader().loadTestsFromTestCase(Unit)
unittest.TextTestRunner(verbosity=2).run(suite)
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
init!
init!
test_i (__main__.Unit) ... ok
test_j (__main__.Unit) ... ERROR
======================================================================
ERROR: test_j (__main__.Unit)
----------------------------------------------------------------------
Traceback (most recent call last):
File "prova.py", line 10, in test_j
print(self.b)
AttributeError: 'Unit' object has no attribute 'b'
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)
注意两个"init!" 在开始.
这样做是因为每个测试不应该依赖于其他测试.有一种特定的设置方法,您应该使用它来为您的测试设置正确的环境.
如果你想要不同的设置,那么你应该考虑在不同的测试用例中拆分这些测试.
使用类变量或全局变量显然有效,因为不删除类,并且不会为每个测试清除全局变量.
注意事项:在文档中,类被实例化的次数更加清晰.如您所见,当他们创建时,TestSuite他们添加每个新的测试实例化类并将测试名称作为参数传递.这只loadTestsFromTestCase是以这种方式创建的快捷TestSuite方式.
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |