23

私はpytestを使って書かれたたくさんのテストを持っています。ディレクトリの下にすべてありますdir。例えば:

dir/test_base.py
dir/test_something.py
dir/test_something2.py
...

それらのコードの簡略化されたバージョンは次のとおりです。

test_base.py

import pytest

class TestBase:
   def setup_module(module):
      assert False

   def teardown_module(module):
      assert False

test_something.py

import pytest
from test_base import TestBase

class TestSomething(TestBase):
   def test_dummy():
       pass

test_something2.py

import pytest
from test_base import TestBase

class TestSomethingElse(TestBase):
   def test_dummy2():
       pass

私のすべてのtest_something*.pyファイルは、 の基本クラスを拡張しますtest_base.py。今、私はsetup_module(module)teardown_module(module)メソッドを に書きましたtest_base.py。setup_module はすべてのテストでteardown_module()1 回呼び出され、すべてのテストが終了したら最後に呼び出されることを期待していました。

しかし、関数が呼び出されていないようですか? これを機能させるにはデコレータが必要ですか?

4

4 に答える 4

16

OP の要件は、モジュールごとに 1回ではなく、セットアップとティアダウンをそれぞれ 1 回だけ実行することでした。conftest.pyこれは、ファイルを組み合わせ@pytest.fixture(scope="session")てフィクスチャ名を各テスト関数に渡すことで実現できます。

これらはPytest フィクスチャのドキュメントで説明されています

次に例を示します。

conftest.py

import pytest

@pytest.fixture(scope="session")
    def my_setup(request):
        print '\nDoing setup'
        def fin():
            print ("\nDoing teardown")
        request.addfinalizer(fin)

test_something.py

def test_dummy(my_setup):
    print '\ntest_dummy'

test_something2.py

def test_dummy2(my_setup):
    print '\ntest_dummy2'

def test_dummy3(my_setup):
    print '\ntest_dummy3'

py.test -s を実行したときの出力:

collected 3 items 

test_something.py 
Doing setup

test_dummy
.
test_something2.py 
test_dummy2
.
test_dummy3
.
Doing teardown

名前conftest.pyは重要です。このファイルに別の名前を付けて、Pytest がそれをフィクスチャのソースとして検出することを期待することはできません。

設定scope="session"は重要です。そうしないと、テスト モジュールごとにセットアップとティアダウンが繰り返されます。

フィクスチャ名my_setupを引数として各テスト関数に渡したくない場合は、クラス内にテスト関数を配置pytest.mark.usefixturesし、クラスにデコレータを適用できます。

于 2015-09-14T20:09:55.330 に答える
12

モジュールレベルでクラスの外にsetup_module置きます。teardown_module次に、テストでクラスを追加します。

def setup_module(module):
    """..."""

def teardown_module(module):
    """..."""

class TestSomething:

    def test_dummy(self):
        """do some tests"""

詳細については、この記事を参照してください。

于 2012-01-08T19:15:16.570 に答える
1

setup_module/teardown_module は、最終的な (派生した) テストが定義されているモジュールに対して呼び出されます。これにより、セットアップをカスタマイズすることもできます。setup_module が 1 つしかない場合は、それを test_base.py に置き、他の場所からインポートできます。HTH。

于 2011-10-18T18:18:11.593 に答える
-1

まず、すべてのテストを「tests」というモジュールに入れることをお勧めします。

<product>
   ...
   tests/
      __init__.py
      test_something.py

次に、基本クラスで setup_class/teardown_class メソッドを使用する必要があると思います。

import unittest
class MyBase(unittest.TestCase):

   @classmethod
   def setup_class(cls):
       ...

   @classmethod
   def teardown_class(cls):
       ...

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

于 2011-10-16T20:22:37.127 に答える