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)

2 つの「init!」に注目してください。最初に。

これは、各テストが他のテストに依存してはならないためです。特定のセットアップ方法があります。それを使用して、テストに適した環境をセットアップする必要があります。

異なるセットアップが必要な場合は、それらのテストを別々のテスト ケースに分割することを検討する必要があります。

クラス変数またはグローバル変数を使用すると、クラスが削除されず、すべてのテストでグローバルがクリアされないため、明らかに機能します。

補足: クラスがより多くの回数インスタンス化されるという事実は、ドキュメントで非常に明確です。ご覧のとおり、クラスを作成するときにTestSuite、クラスをインスタンス化し、テスト名をパラメーターとして渡す新しいテストをそれぞれ追加します。は、その方法で を作成するためのloadTestsFromTestCase単純なショートカットですTestSuite

于 2012-09-17T18:38:10.547 に答える