5

私は 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_regression.py -v

スイートに対して次を実行すると、0 個のテストが収集されます。

py.test Functionaltests/suite_regression.py

テストケースに対して次を実行すると、test_first と test_second が実行されます。

py.test Functionaltests/sample_unittest.py -v

キーワードを使用して py.test を実行すると、テストをスイートに整理するのにどのように役立つかわかりません。テストケースをフォルダー構造に配置し、フォルダー オプションを指定して py.test を実行すると、機能領域ごとにテストを整理できません。

だから私の質問:

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

編集: 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 が収集されて実行されます。

py.test Functionaltests/sample_unittest.py -v -m ヘルスチェック

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

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

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

4

4 に答える 4

4

今は少し遅いと思いますが、インタラクティブな選択プラグインをここにドキュメントで完成させました:

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

上記のホルガーフックを実際に使っています。

IPython を使用して、コレクション フェーズの直後に選択したテストを選択できます。テストの順序付けは、必要に応じてスライス、添字、またはタブ補完を使用すると非常に簡単です。これは開発中に使用するためのインタラクティブなツールであり、自動回帰の実行にはあまり適していないことに注意してください。

マークを使用した永続的な順序付けのために、特に長い回帰スイートでベースラインの前提条件テストがある場合に実際に非常に役立つpytest-orderingを使用しました。

于 2014-10-31T03:12:38.720 に答える
2

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

于 2013-04-02T08:25:05.090 に答える