2012-04-27 40 views
8

私はPython2とPython3の両方で動作するパッケージ(http://github.com/anntzer/parsedcmd)を書いています。しかし、私はPython2とPython3のための別々の(py.test)単体テストを書く必要がありました(主にPython3の特別な機能、特にキーワードのみの引数をテストしたいので)test_py2.pytest_py3.pytestサブパッケージにあります。今、私が走ったら、py.test2 mypkgと言って、test_py2が合格しますが、test_py3SyntaxErrorで失敗します。同様に、py.test3 mypkgの場合はtest_py3が合格しますが、test_py2が失敗します(私はこれを行うこともできますが、それはちょうどioに移動したStringIOの問題です)。py.test Python2とPython3を実行中

import mypkg.testはテストだけの適切なバージョンをインポートし、どうやらpy.test気にしないように、私はtestサブパッケージを設計することができます - それはちょうどtest_*に一致する2つのファイルを見て、それらの両方ですべてのテストをつかみ、無視して何を__init__.pyは彼にインポートするように指示します。

だから私はpy.test2 mypkg/test/test_py2.pypy.test3 mypkg/test/test_py3.pyの両方を行う必要があります。 py.test2 mypkgpy.test3 mypkgが「うまくいく」ように全体を設定する方法はありますか?

ありがとうございました。

答えて

5

モジュールをすべてのインタプリタでインポート可能にし、適切なテストをスキップするのが一般的な解決策です。そうしないと、テストディレクトリに「conftest.py」として以下のものを置くことができます。これは、プロジェクト固有のプラグインを拾います

import sys 
py3 = sys.version_info[0] >= 3 

class DummyCollector(pytest.collect.File): 
    def collect(self): 
     return [] 

def pytest_pycollect_makemodule(path, parent): 
    bn = path.basename 
    if "py3" in bn and not py3 or ("py2" in bn and py3): 
    return DummyCollector(path, parent=parent) 

し、適切に「PY2」または "を含むファイル名を使用してテストモジュールを無視します誤ったインタプリタバージョンでは「py3」部分文字列を返します。もちろん、ファイル名を確認するのではなく、conftest.pyファイルに明示的なリストを直接入れることもできます。

HTH、holger

0

異なるパッケージにテストを入れ、適切なパッケージでテストのみを実行します。

import sys, unittest 

cur_version = sys.version_info() 

if cur_version[0] < 3 
    import myApp.test.test_py2 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run() 
else: 
    import myApp.test.test_py3 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run() 

またはあなたが

python setup.py test

を実行し、そこにバージョン管理ロジックを置くことができるようにsetup.pyファイルを使用します:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here 
setup(name='parsedcmd', 
     ... 
     test_suite=versionedTestSuite, 
    ) 
またはスクリプト内の適切なテストモジュールをロード
関連する問題