2013-03-11 8 views
12

私のアプリケーションのファイルを/ Filesの下に置いておきたいのですが、/ UnitTestsのテストユニットを使って、アプリケーションとテストをはっきりと分けるようにします。Python unittesting:別のモジュールでテストを実行

mainApp.pyと同じモジュールルートを使用できるように、ルートフォルダにtestController.pyを作成しました。だから、

mainApp.py 
testController.py 
Files 
    |__init__.py 
    |Controllers 
    | blabla.py 
    | ... 
UnitTests 
    |__init__.py 
    |test_something.py 

test_something.pyに私が/Files/Controllers/blabla.pyにある一つの機能をテストしたい場合は、私は次のことを試してください。

ファイルから
import unittest 
import Files.Controllers.blabla as blabla 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(blabla.some_function()) 


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


そして、 testController.pyは、私は次のコードを実行します。何の障害を出力しない

import TestUnits.test_something as my_test 
my_test.unittest.main() 

を、ないテストが

を実行していません

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(tested_unit()) 


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

質問:「メイン」は動作しますが、外部から呼び出されたときに、同じ出力として、私は何の依存性を持っていないテストを試みたが、あれば実行されている

---------------------------------------------------------------------- Ran 0 tests in 0.000s OK [Finished in 0.3s] 


これをどのように機能させるには?

答えて

4

test_something.pyでは、次の操作を行います。

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(TestMyUnit, 'test')) 
    return suite 

をtestController.pyでは、次の操作を行います。

from TestUnits import test_something 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(test_something.suite()) 
    return suite 

if __name__ == '__main__': 
    unittest.main(defaultTest='suite') 
+0

これは少しあります少し冗長ですが、動作します、ありがとう。 – bgusach

15

メソッドunittest.mainは()すべてからunittest.TestCaseクラスを見て文脈に存在する。 testController.pyファイルにテストクラスをインポートし、このファイルのコンテキストでunittest.main()を呼び出すだけで済みます。

だからあなたのファイルtestController.pyは、単に次のようになります。

import unittest  
from UnitTests.test_something import * 
unittest.main() 
+0

ありがとうございますが、動作しません。結果は同じです。テストは実行されません。 – bgusach

+0

わかりました。 test_somethingファイルからすべてのテストケースをインポートする必要があります。 UnitTests.test_somethingからTestMyUnit(または*)をインポートしてみてください。うまくいくはずです! – rparent

+0

これは動作します、ありがとうございます。 – bgusach

0

(subprocess.callを使用しての回避策はあり)テストを実行するために、のような:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
関連する問題