2011-09-15 6 views
2

問題私は引き続きテストを "ブートストラップ"しています。ブートストラップテストとPythonテストディスカバリの使用

私が持っている問題はちょうどwhat this guy hasです。

トップソリューションは、「ブーストラップ」スクリプトの作成について語ります。私は、実行するテストをすべて列挙したり、__all__キーワードを使って__init__.pyファイルのテストマニフェストを使用しなければならないと推測します。しかし、私はmost recent Python documentation on unittestはもう__all__について話していないことに気づいた。

は2.7で、私たちも、よりよい作品 "発見"

python -m unittest discover 

と呼ばれるPythonコマンドを持っています。なぜなら: 1)鼻 2は必要)テストが

を明示する。しかし、「ブートストラップ」する方法を持っていないようするために必要はありませんがありません

私は別のテストランナーを使用する必要がありますか?ブートストラッピングと検出を可能にするもの?

py.testが必要ですか?
http://pytest.org/

ブートストラップが必要な理由は、this guy hasです。基本的には、テストを直接実行するとインポート・ステートメントが正しく機能しません。私は、アプリケーションが正常に動作するように、私のプロジェクトの上からテストスイートを実行したいと思います。

結局のところ、import文は常にその物理的な場所からの相対パスです。 (BTW、これはPythonの妨げになると思います)

定義:ブートストラップとは何ですか? ブートストラップとは、プロジェクト全体でテストを実行する前にいくつかのセットアップを行いたいということです。これは、プロジェクト全体のレベルで「テスト設定」を求めているようなものです。

更新 Here is another posting about the same thingです。この2.7コマンドを使用すると、Noseを回避できます。しかし、どのようにしてブートストラップが追加されますか?

+0

だから、問題は、あなたがプロジェクトのトップにいないときに発見+ブートストラップを行うための何らかの方法が欲しいということですか?それは非常に限定されたユースケースのように思えますが、私は自分のプロジェクトの上からテストを実行します。 – djc

+0

私はタイプミスをしている可能性があります。私は私のプロジェクトの上からそれを始めたいと思う - ちょうど私が私のアプリを正常に動かしていたかのように。 – 010110110101

答えて

3

を実行して、コマンドラインから、これらのテストのすべてを実行しますわかった!

"runtests.py"と書いてプロジェクトのルートに配置したこのスクリプトを使用して、初期化コードを実行して検出を使用する "ブートストラップ"ができました。 Woot!

import sys 
sys.path.insert(0, 'lib.zip') 

ありがとう:私の場合は

、 "ブートストラップ" のコードでは、と言う2行です!

#!/usr/bin/python 

import unittest 
import sys 
sys.path.insert(0, 'lib.zip') 

if __name__ == "__main__": 
    all_tests = unittest.TestLoader().discover('.') 
    unittest.TextTestRunner().run(all_tests) 
0

ここに私がしていることがあり、それはかなりうまくいくと思います。これと同様のファイル/ディレクトリ構造について:

main_code.py 
run_tests.py 
    /Modules 
     __init__.py 
     some_module1.py 
     some_module2.py 
    /Tests 
     __init__.py 
     test_module1.py 
     test_module2.py 

これは、テストをブートストラップするためにあなたのrun_tests.pyファイルを整理するために、かなり簡単です。まず、テストを行うすべてのファイル(test_module1.pyなど)は、テストスイートを生成する関数を実装する必要があります。次のようなもの:

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(Test_Length)) 
    suite.addTest(unittest.makeSuite(Test_Sum)) 
    return suite 

テストコードの最後に。その後、run_tests.pyファイルには、追加のtest_suiteにこれらを集約し、それを実行します。

import unittest 
import Tests.test_module1 as test_module1 
import Tests.test_module2 as test_module2 

module1_test_suite = test_module1.suite() 
module2_test_suite = test_module2.suite() 

aggregate_suite = unittest.TestSuite() 
aggregate_suite.addTest(module1_test_suite) 
aggregate_suite.addTest(module2_test_suite) 

unittest.TextTestsRunner(verbosity = 2).run(aggregate_suite 

その後単に

python run_tests.py 
+0

あなたの答えは、 "すべての"キーワードを使用して "マニフェストを作成"のバリエーションについて説明しています。私はこの仕事のすべてを避けようとしています。 Python 2.7の新しい「発見」機能は、この余分な作業をすべて避けることを意味していると私は推測しています。 – 010110110101

+0

私はPython 2.7で自動検出機能を使用しようとしています。 – 010110110101

+0

それは公正です。あなたが問題を起こしたことを理解していなかったのは、それぞれのテストを別々に実行できるようにしたかったからです。参考のために、私はフラグをコマンドライン引数として渡し、それを 'sys.argv'から抜き取って、選択的にテストをインポートするようにします。これは、 "統合テストを実行しない"のようなより美しい動作を可能にします。 – Wilduck