2009-05-15 7 views
2

私はunittest.TestCaseクラスを動的に定義する小さな関数を書いています(下の簡単なバージョン)。モジュールからunittest.main()を実行していますか?

同じソースファイルから自分のモジュールに移動したときに、unittestに新しいクラスを検出させる方法を理解できません。いずれのファイルからunittest.main()を呼び出しても、テストは実行されません。

factory.py

import unittest 

_testnum = 0 
def test_factory(a, b): 

    global _testnum 

    testname = 'dyntest' + str(_testnum) 

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 

    _testnum += 1 


def finish(): 
    unittest.main() 

someotherfile.py

from factory import test_factory, finish 


test_factory(1, 1) 
test_factory(1, 2) 


if __name__ == '__main__': 
    finish() 

出力:

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 

だから、任意のテストを実行しません。同じファイルにすべてを維持することを

注意が期待通りに動作します(予想通り)

import unittest 

_testnum = 0 
def test_factory(a, b): 

    global _testnum 

    testname = 'dyntest' + str(_testnum) 

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 

    _testnum += 1 


test_factory(1, 1) 
test_factory(1, 2) 

if __name__ == '__main__': 
    unittest.main() 

出力を:

私は実行することができるように、私のtest_factory()関数を使用する方法
.F 
====================================================================== 
FAIL: testme (__main__.dyntest1) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "partb.py", line 11, in <lambda> 
    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 
AssertionError: 1 != 2 

---------------------------------------------------------------------- 
Ran 2 tests in 0.008s 

FAILED (failures=1) 

それはそれが別のソースファイルから定義するすべてのTestCaseオブジェクトですか?

答えて

7

デフォルトでは、unittest.main()はメインモジュール内のUnit TestCaseオブジェクトを探します。 test_factoryは、独自のモジュールにTestCaseオブジェクトを作成します。そのため、メインモジュールの外に移動すると、あなたが見る動作が発生します。

試してみてください。

def finish(): 
    unittest.main(module=__name__) 
+1

-1:ドキュメントへの参照。 –

9

一般的な考え方は、(あなたのために何をするかunittest.main)です:http://docs.python.org/library/unittest.html?highlight=unittest#module-unittestあたりとして

suite = unittest.TestLoader().loadTestsFromTestCase(SomeTestCase) 
unittest.TextTestRunner(verbosity=2).run(suite) 

。あなたのテストケースはtest_factory関数でglobals()に隠されているので、のインスタンスを作成し、unittest.TestCaseのインスタンス(または'dyntest'などで始まる名前のインスタンス)を探し、その方法でスイートを構築して実行してください。