2009-12-03 60 views
25

Python unittestモジュールを使用して記述された単体テストのラッパーとして機能するスクリプトがあります。 、いくつかのファイルをクリーンアップする出力ストリームを作成し、いくつかのコードを生成することに加えて、それは私がすでに出力を決定するために使用されるいくつかのコマンドライン引数を引き出すためにoptparseを使用していますPython、unit test - unittest.TestCaseのsetUpにコマンドライン引数を渡します。

unittest.TestLoader().loadTestsFromTestCase() 

を使用してスイートにテストケースをロードしますコードを再生成するかどうか、クリーンアップを行うかどうかを指定します。また、テストケース内で使用するためのコンフィグレーション変数、つまりエンドポイントURIも渡したいと思っています。

私はOptionParserをTestCaseのsetUpメソッドに追加できますが、代わりにsetUpにオプションを渡したいと思います。これはloadTestsFromTestCase()を使用して可能ですか?返されたTestSuiteTestCasesを繰り返し処理できますが、手動でTestCasesのsetUpを呼び出せますか?

**私は、私がテストを反復処理と同様に、手動でsetUpを呼び出す場合、私はsetUpに引数を渡すことができていますことを指摘したかったEDIT ** :しかし、私はxmlrunnerを使用しています

(options, args) = op.parse_args() 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions) 
for test in suite: 
    test.setUp(options.soap_uri) 

これとその実行方法はTestSuiteを引数として取ります。私はそれがsetUpメソッド自体を実行することを前提としているので、XMLTestRunnerの中で利用可能なパラメータが必要になります。

これは意味があると思います。

答えて

43

私は同じことをしたいと思っていました。重複しているので、次のコードを改善したかったのです。それは私がしかし、テストケースをテストするために、引数に送らせん:あなたはinitメソッド内の属性を定義する場合

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.hs = helpspot.HelpSpot(path, user, pword) 

    def test_version(self): 
     a = self.hs.version() 
     b = self.hs.private_version() 
     self.assertEqual(a, b) 

    def test_get_with_param(self): 
     a = self.hs.filter_get(xFilter=1) 

    def test_unknown_method(self): 
     self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple) 

if __name__ == '__main__': 
    import sys 
    user = sys.argv[1] 
    pword = sys.argv[2] 
    path = sys.argv[3] 

    test_loader = unittest.TestLoader() 
    test_names = test_loader.getTestCaseNames(TestHelpSpot) 

    suite = unittest.TestSuite() 
    for test_name in test_names: 
     suite.addTest(TestHelpSpot(test_name, path, user, pword)) 

    result = unittest.TextTestRunner().run(suite) 
    sys.exit(not result.wasSuccessful()) 
+0

helpspotとは何ですか? – SIslam

+0

HelpSpotは、UserScapeのカスタマーサービスアプリケーションです。私はAPIのためのPythonインタフェースを書いています - https://github.com/JohnSpeno/python-helpspot – jps

+0

これは 'unittest.main()'と同様に働くために 'sys.exit(not result.wasSuccessful() ) '最後に。 – abergmeier

5

私は間違いなくこのようにsetUpに引数を渡すことをお勧めします。 setUpは、テストの実行中に暗黙的に呼び出されることを想定しているため、明示的に呼び出すべきではありません。

これに対処する方法の1つは、環境変数またはグローバルにアクセス可能な「コンテキスト」モジュールの値として設定する必要がある値を、テストケースが必要に応じてアクセスできるように設定することです。私は環境変数を使うことにします。テストを実行する上で柔軟性があります(あなたはもはやコマンドラインの引数に頼る必要はありません)。

+4

そして、他のいくつかのコードは同じ名前の環境変数に依存しています。 – GNUnit

0

は、その後、あなたは、単にこのようなコンストラクタでそれらをすべて渡すことができます。..

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.path = path 
     self.user = user 
     self.pword = pword 
.... 
.... 
.... 


if __name__ == '__main__': 
    True 

    suite = unittest.TestSuite() 
    suite.addTest(TestHelpSpot("test_version", path, user, pword))  

    unittest.TextTestRunner().run(suite) 
7
if __name__ == '__main__': 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option("-z", "--zebra", 
         action="store_true", dest="zebra", default=False, 
         help="run like a zebra")  


    (options, args) = parser.parse_args() 

    if options.zebra: 
     zebrafy() 


    # remove our args because we don't want to send them to unittest 
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]): 
     if x in sys.argv: 
      sys.argv.remove(x) 


    unittest.main() 
+0

非常に良い。まさに私が探していたもの。 –

+1

私は '-i'オプションを追加したいと思っていました。上のコードを使ってみました...' .. \ .. \ python \ python -m unittest -v "test_activation.test_activation" -i "input_file" ' 。なぜ、これは私に 'test_activation.py:error:no such-option'というエラーを出すのですか? – Danijel

+0

これは私には役に立たなかった。しかし、argsを削除する次の行が機能しました。 del sys.argv [1:] – Indrajeet

関連する問題