3

conftetst.py に独自のコマンド ライン オプションを含めます。

def pytest_addoption(parser):
    parser.addoption("--backend" , default="test_backend",
        help="run testx for the given backend, default: test_backend")

def pytest_generate_tests(metafunc):
    if 'backend' in metafunc.funcargnames:
       if metafunc.config.option.backend:
          backend = metafunc.config.option.backend
          backend = backend.split(',')
          backend = map(lambda x: string.lower(x), backend)
        metafunc.parametrize("backend", backend)

モジュール内の通常の関数内でこのコマンド ライン オプションを使用すると、次のようになります。

module: test_this.py;  

def test_me(backend): 
  print backend

期待どおりに動作します。

ここで、setup_module 関数を含めて、いくつかのテストの前にいくつかのものを作成/コピーしたいと思います。

def setup_module(backend):
   import shutil
   shutil.copy(backend, 'use_here')
   ...

残念ながら、setup_module 関数内でこのコマンド ライン オプションにアクセスする方法がわかりました。私が試したことは何も機能しません。

助けてくれてありがとう、提案。

乾杯

4

1 に答える 1

2

セットアップ リソースで funcargs を使用できるようにする API 拡張が議論されており、ユース ケースはその良い例です。議論中の V2 ドラフトについては、こちらを参照してください: http://pytest.org/latest/resources.html

今日、次のように問題を解決できます::

# contest of conftest.py

import string

def pytest_addoption(parser):
    parser.addoption("--backend" , default="test_backend",
        help="run testx for the given backend, default: test_backend")

def pytest_generate_tests(metafunc):
    if 'backend' in metafunc.funcargnames:
        if metafunc.config.option.backend:
            backend = metafunc.config.option.backend
            backend = backend.split(',')
            backend = map(lambda x: string.lower(x), backend)
        metafunc.parametrize("backend", backend, indirect=True)

def setupmodule(backend):
    print "copying for", backend

def pytest_funcarg__backend(request):
    request.cached_setup(setup=lambda: setupmodule(request.param),
                         extrakey=request.param)
    return request.param

2 つのテストを含むテスト モジュールがあるとします。

def test_me(backend):
    print backend

def test_me2(backend):
    print backend

その後、実行して、期待どおりに動作することを確認できます。

$ py.test -q -s --backend=x,y

集めた 4 アイテム x x .copying for y y .x .y

0.02秒で4回通過

テスト対象のバックエンドが 2 つあるため、4 つのテストが行​​われますが、モジュールのセットアップは、モジュールで使用される各バックエンドごとに 1 回だけ行われます。

于 2012-07-06T08:55:20.583 に答える