4

Python のunittestモジュールを使用して記述された単体テストのセットがあります。彼らは setUpModule() 関数を使用して、テスト (一部の HTTP セッションを含む) を実行するために必要な共有の「もの」をグローバル変数にロードしています。

でテストを実行するとunittest、正常に実行されます。py.test彼らは失敗しています。

少しパッチを当てて、古いpytestフィクスチャ関数 (たまたまunittestと同じ名前ではない) を使用して実行できるようにしました。それは機能しましたが、複数のスレッドで実行されていない場合のみでした。これは私が使用したい機能です。

私の場合、各クラス内に 10 個のテストを持つ 20 個のクラス (unittest.TestCase) があるため、ドキュメントの例は役に立ちません。明らかに、各テストに新しいパラメーターを追加したくありません。

これまでは、クラスの setUp() メソッドを使用して共有ディクショナリを自己内にロードし、そこから各テスト内で使用していました。

#!/usr/bin/env python
# conftest.py
@pytest.fixture(scope="session")
def manager():
    return { "a": "b"}

そして今、テスト:

#!/usr/bin/env python
# tests.py

class VersionTests(unittest.TestCase):

    def setUp(self):
        self.manager = manager

    def test_create_version(self):
        # do something with self.manager
        pass

複数のスレッドで機能し、フィクスチャを 1 回呼び出すソリューションが必要であることを覚えておいてください。

4

1 に答える 1

5

pytestUnittest.TestCase のサポート / フィクスチャの統合 にunittest記載されているように、確実にテストを実行できます。注意が必要なのは、funcargs フィクスチャを直接使用することは推奨されないことです。pytest

pytest は、非 unittest テスト メソッドのテスト関数引数を介してフィクスチャを受け取ることをサポートしていますが、 unittest.TestCase メソッドは、一般的な unittest.TestCase テスト スイートを実行する機能に影響を与える可能性がある実装として、フィクスチャ関数引数を直接受け取ることはできません。

標準のunittest初期化機能を使用して、次のようなテスト モジュールがあるとします。

# test_unittest_tests.py (for the sake of clarity!)
import unittest

manager = None

def setUpModule():
    global manager
    manager = {1: 2}

class UnittestTests(unittest.TestCase):
    def setUp(self):
        self.manager = manager

    def test_1_in_manager(self):
        assert 1 in self.manager

    def test_a_in_manager(self):
        assert 'a' in self.manager

で実行すると、次の出力が生成されますunittest

$ python -m unittest -v test_unittest_tests
...
test_1_in_manager (test_unittest_tests.UnittestTests) ... ok
test_a_in_manager (test_unittest_tests.UnittestTests) ... FAIL
...

期待どおりにtest_a_in_manager失敗します。ディレクトリ'a'にキーがありません。manager

conftest.py をセットアップして、pytestこれらのテスト用のスコープ付きフィクスチャを提供します。たとえば、次のように、標準のunittest動作を壊さず、pytestautouseを使用してテストにまったく触れる必要はありません。

# conftest.py
import pytest

@pytest.fixture(scope='session', autouse=True)
def manager_session(request):
    # create a session-scoped manager
    request.session.manager = {'a': 'b'}

@pytest.fixture(scope='module', autouse=True)
def manager_module(request):
    # set the sessions-scoped manager to the tests module at hand
    request.module.manager = request.session.manager

pytest並列化のために(を使用して)テストを実行するpytest-xdistと、次の出力が得られます。

$ py.test -v -n2
...
[gw1] PASSED test_unittest_tests.py:17: UnittestTests.test_a_in_manager
[gw0] FAILED test_unittest_tests.py:14: UnittestTests.test_1_in_manager
...

代わりにtest_1_in_manager失敗します。が提供するマネージャー ディクショナリ1にはキーがありません。pytest

于 2014-07-19T14:08:57.080 に答える