3

我想在测试方法中为类属性设置一个值,并在另一个测试方法中使用具有相同类属性的值。当我通过使用方法执行测试用例以正常方式尝试时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>
4

1 回答 1

6

该属性不会出现在实例中,因为每个测试都在其自己的实例中执行,如您在此代码中所见:

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)

哪个打印:

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)

注意两个“init!” 一开始。

这样做是因为每个测试不应该依赖于其他测试。有一个特定的设置方法,您应该使用它来为您的测试设置正确的环境。

如果您想要不同的设置,那么也许您应该考虑将这些测试拆分为单独的测试用例。

使用类变量或全局变量显然是有效的,因为类没有被删除,并且全局变量不会为每个测试清除。

附带说明:类被实例化更多次的事实在文档中非常清楚。正如您所看到的,当他们创建时,TestSuite他们会添加每个新的测试来实例化类并将测试名称作为参数传递。这只loadTestsFromTestCase是以这种方式创建的捷径TestSuite

于 2012-09-17T18:38:10.547 回答