117

テスト スイートの各テストの前後に、追加のセットアップ チェックとティアダウン チェックを実行したいと考えています。私はフィクスチャを見てきましたが、それらが正しいアプローチであるかどうかはわかりません。各テストの前にセットアップ コードを実行する必要があり、各テストの後に分解チェックを実行する必要があります。

私のユースケースは、正しくクリーンアップされていないコードをチェックしています。一時ファイルが残ります。私のセットアップではファイルをチェックし、ティアダウンでもファイルをチェックします。余分なファイルがある場合は、テストを失敗させます。

4

7 に答える 7

159

py.test フィクスチャは、目的を達成するための技術的に適切な方法です。

次のようなフィクスチャを定義するだけです。

@pytest.fixture(autouse=True)
def run_around_tests():
    # Code that will run before your test, for example:
    files_before = # ... do something to check the existing files
    # A test function will be run at this point
    yield
    # Code that will run after your test, for example:
    files_after = # ... do something to check the existing files
    assert files_before == files_after

でフィクスチャを宣言するとautouse=True、同じモジュールで定義された各テスト関数に対して自動的に呼び出されます。

とは言え、注意点が一つ。セットアップ/ティアダウンでアサートすることは、物議を醸す慣行です。私は py.test の主な作者がそれを好まないという印象を受けています (私も好きではないので、それが私の認識に影響を与える可能性があります)。

于 2014-03-25T15:12:39.200 に答える
33

fixturein order を使用して、目的を達成できます。

import pytest

@pytest.fixture(autouse=True)
def run_before_and_after_tests(tmpdir):
    """Fixture to execute asserts before and after a test is run"""
    # Setup: fill with any logic you want

    yield # this is where the testing happens

    # Teardown : fill with any logic you want

詳細な説明

  1. @pytest.fixture(autouse=True)ドキュメントから「場合によっては、関数引数を明示的に宣言したり、usefixtures デコレーターを宣言したりせずに、フィクスチャを自動的に呼び出す必要がある場合があります。」したがって、このフィクスチャはテストが実行されるたびに実行されます。

  2. # Setup: fill with any logic you want、このロジックは、すべてのテストが実際に実行される前に実行されます。あなたの場合、実際のテストの前に実行される assert ステートメントを追加できます。

  3. yield、コメントに示されているように、ここでテストが行​​われます

  4. # Teardown : fill with any logic you want、このロジックはすべてのテストの後に実行されます。このロジックは、テスト中に何が起こっても実行されることが保証されています。

注:テストの失敗とテスト実行中のエラーにはpytest違いがあります。Failure は、テストが何らかの形で失敗したことを示します。エラーは、適切なテストを実行するポイントに到達できなかったことを示します。

次の例を検討してください。

テストが実行される前にアサートが失敗する -> エラー

import pytest


@pytest.fixture(autouse=True)
def run_around_tests():
    assert False # This will generate an error when running tests
    yield
    assert True

def test():
    assert True

テストの実行後にアサートが失敗する -> ERROR

import pytest


@pytest.fixture(autouse=True)
def run_around_tests():
    assert True
    yield
    assert False

def test():
    assert True

テスト失敗 -> FAILED

import pytest


@pytest.fixture(autouse=True)
def run_around_tests():
    assert True
    yield
    assert True

def test():
    assert Fail

テスト合格 -> 合格

import pytest


@pytest.fixture(autouse=True)
def run_around_tests():
    assert True
    yield
    assert True

def test():
    assert True
于 2020-07-07T22:11:28.963 に答える
15

備品はまさにあなたが望むものです。それが彼らが設計されたものです。

pytest スタイルのフィクスチャを使用するか、セットアップティアダウン(モジュール、クラス、またはメソッド レベル) の xUnit スタイルのフィクスチャを使用するかは、状況と個人の好みによって異なります。

あなたが説明していることから、 pytest autouse Fixturesを使用できるようです。
または xUnit スタイルの関数レベルsetup_function()/teardown_function()

Pytest はあなたを完全にカバーします。おそらくそれは情報の消防ホースであるほどです。

于 2015-08-19T22:18:22.530 に答える
11

Pytest のモジュール レベルのセットアップ/ティアダウン フィクスチャを使用できます。

リンクはこちら

http://pytest.org/latest/xunit_setup.html

次のように機能します。

 def setup_module(module):
     """ setup any state specific to the execution of the given module."""

 def teardown_module(module):
     """ teardown any state that was previously setup with a setup_module
     method."""

 Test_Class():
        def test_01():
          #test 1 Code

setup_moduleこのテストの前とteardown_moduleテストの完了後に呼び出されます。

このフィクスチャを各テスト スクリプトに含めて、各テストで実行できます。

ディレクトリ内のすべてのテストに共通のものを使用したい場合は、パッケージ/ディレクトリレベルのフィクスチャノーズフレームワークを使用できます

http://pythontesting.net/framework/nose/nose-fixture-reference/#package

パッケージのファイルに__init__.py以下を含めることができます

     def setup_package():
       '''Set up your environment for test package'''

     def teardown_package():
        '''revert the state '''
于 2014-03-31T12:30:31.070 に答える