2013-03-28 23 views
5

py.testを使用して機能テストフレームワークを構築していますので、実行するテストを正確に指定する必要があります。私は動的テストコレクションの美しさを理解していますが、最初にテスト環境の健全性チェックを実行してから、その後に私の回帰テストを実行することができます。他の目的のために使用されているこれらのセットのテストを排除するものではありません。py.testでテストスイート(任意のテストコレクション)を実行

テストスイートは、Jenkinsのビルドプロジェクトに関連付けられます。私はosx、python 2.7.3、py.test 2.3.4を使用しています。

だから私は、次のようなテストケースがあります。

# sample_unittest.py 
import unittest, pytest 

class TestClass(unittest.TestCase): 

    def setUp(self): 
     self.testdata = ['apple', 'pear', 'berry'] 

    def test_first(self): 
     assert 'apple' in self.testdata 

    def test_second(self): 
     assert 'pear' in self.testdata 

    def tearDown(self): 
     self.testdata = [] 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(TestClass('test_first')) 
    return suite 

if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(suite()) 

をそして私はこのようなテストスイートがあります。私はスイートに対するコマンドラインから次を実行した場合

# suite_regression.py 
import unittest, pytest 
import functionaltests.sample_unittest as sample_unittest 

# set up the imported tests 
suite_sample_unittest = sample_unittest.suite() 

# create this test suite 
suite = unittest.TestSuite() 
suite.addTest(suite_sample_unittest) 

# run the suite 
unittest.TextTestRunner(verbosity=2).run(suite) 

を、 test_firstが実行されます(ただし、py.testが提供する追加情報はありません)。

python functionaltests/suite_regressi on.py -v

私はスイートに対して次のコマンドを実行した場合、0テストが収集されます:私が実行している場合は、次の

py.test functionaltests/suite_regression.py

py.test functionaltests/sample_unittest.py -v

:テストケース、test_firstとtest_second実行に対する

py.testキーワードを使用すると、テストをスイートに編成する方法がわかりません。テストケースをフォルダ構造に配置し、フォルダオプションを指定してpy.testを実行しても、機能領域別にテストを整理することはできません。

だから私の質問:

  1. は、再利用可能な形式でのテストの任意のグループを指定するためのpy.testメカニズムはありますか?
  2. py.testからunittest.TestSuiteを使用する方法はありますか?

EDIT: だから私は、任意のラベルで私にフラグテスト機能と試験方法をすることができますされ、py.testマーカーを試し、その後、実行時にそのラベルをフィルタリング。

# conftest.py 
import pytest 

# set up custom markers 
regression = pytest.mark.NAME 
health = pytest.mark.NAME 

そして、私の更新されたテストケース:

# sample_unittest.py 
import unittest, pytest 

class TestClass(unittest.TestCase): 

    def setUp(self): 
     self.testdata = ['apple', 'pear', 'berry'] 

    @pytest.mark.healthcheck 
    @pytest.mark.regression 
    def test_first(self): 
     assert 'apple' in self.testdata 

    @pytest.mark.regression 
    def test_second(self): 
     assert 'pear' in self.testdata 

    def tearDown(self): 
     self.testdata = [] 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(TestClass('test_first')) 
    return suite 

if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(suite()) 

だから、次のコマンドを実行すると、収集しtest_first実行します:

functionaltests/sample_unittest py.test。PY -v -mヘルス

そして、これが収集しtest_firstとtest_second実行します:

py.test functionaltests/sample_unittest.py -v -m回帰

だから、戻って私に質問:マーカーは部分的な解決策ですが、私はまだ収集されたマーク付きテストの実行を制御する方法がありません。

+0

*「収集されたマークされたテストの実行を制御する方法がない」とはどういう意味ですか?オーダー? –

+0

はい、任意の順序で実行を制御し、収集されたテストのデフォルトの順序には依存しません。 – sophe

答えて

2

現在、テストの実行順序を直接制御する方法はありません。 FWIWには、何かを実装するために使用できるプラグインフックpytest_collection_modifyitemsがあります。ランダム化を実装するプラグインについては、https://github.com/klrmn/pytest-random/blob/master/random_plugin.pyを参照してください。

+0

これは私に前進する方法を与える、ありがとう。 – sophe

+0

フォルダ内の@sopheテストは、アルファベット順に実行されています:) Holgerは「それに頼るな」と言っているかもしれませんが、 –

2

私は今少し遅れだが、私はちょうどここにドキュメントとの対話型の選択プラグインを終えた推測:

https://github.com/tgoodlet/pytest-interactive

私は実際にホルガーは、上記のフックを使用します。

IPythonを使用して収集フェーズの直後に選択したテストを選択できます。テストを注文するのは、スライス、サブスクリプト、またはタブ補完を使用して簡単に行うことができます。開発中に使用するためのインタラクティブなツールであり、自動回帰実行ではあまり意味がないことに注意してください。

私はpytest-orderingを使って永続的な注文をしていますが、特に長い回帰スイートのベースライン前提条件テストを行っている場合には非常に便利です。

関連する問題