2017-06-19 7 views
0

pytest_generate_testsでtmpdir_factory:Pytest - だから私は、コードの二つの主要な部分を持って

  1. は、ディレクトリ内の設定ファイルの豊富なコレクションを生成します。
  2. 前のバージョンで生成された1つの設定ファイルを実行します。

私は最初にcode1を実行し、すべてのファイルを生成し、各設定ファイルに対してcode2を実行し、結果が良好であることを確認するテストを実行します。 私の試みはこれまでのところだった:

@pytest.fixture(scope='session') 
def pytest_generate_tests(metafunc, tmpdir_factory): 
    path = os.path.join(tmpdir_factory, "configs") 
    gc.main(path, 
      gc.VARIANTS, gc.MODELS, 
      default_curvature_avg=0.0, 
      curvature_avg_variation=0.9, 
      default_gradient_avg=0.0, 
      gradient_avg_variation=0.9, 
      default_inversion="approximate", 
      vary_inversion=False, 
      vary_projections=True) 
    params = [] 
    for model in os.listdir(path): 
     model_path = os.path.join(path, model) 
     for dataset in os.listdir(model_path): 
      dataset_path = os.path.join(model_path, dataset) 
      for file_name in os.listdir(dataset_path): 
       config_file = os.path.join(dataset_path, file_name) 
       folder = os.path.join(dataset_path, file_name[:-5]) 
       tmpdir_factory.mktemp(folder) 
       params.append(dict(config_file=config_file, output_folder=folder)) 
       metafunc.addcall(funcargs=dict(config_file=config_file, output_folder=folder)) 

def test_compile_and_error(config_file, output_folder): 
    final_error = main(config_file, output_folder) 
    assert final_error < 0.9 

しかし、tmpdir_factoryフィクスチャはpytest_generate_tests方法では動作しません。私の質問は、すべてのテストを生成して目標を達成する方法です。

答えて

1

最初の、そして最も重要なのは、 pytest_generate_testsはpytestでフックとフィクスチャ機能のためではない名前であることを意味します。その前に@pytest.fixtureを取り除き、its docsをもう一度見てください。フックはconftest.pyファイルまたはプラグインファイルに書き込まれ、pytest_接頭辞に従って自動的に収集されます。あなたの問題のために今

pytest_generate_tests内部

import tempfile 
import shutil 

dirpath = tempfile.mkdtemp() 

を: だけ使用して手動で一時ディレクトリを使用します。 、conftestで をグローバルでdirpathを保存し

# ... do stuff with dirpath 
shutil.rmtree(dirpath) 

ソースを使用してpytest_sessionfinishに削除します。https://stackoverflow.com/a/3223615/3858507

複数のテストケースを持っている場合、pytest_generate_testsがそれぞれ1のために呼び出されることに注意してください。だからあなたはいくつかのリストにすべてのあなたのtempdirを保存し、最後にすべてを削除してください。これとは対照的に、フックpytest_sesssionstartを使用してそこに作成し、後で使用することを考えるよりも、tempdirが1つだけ必要な場合。

+0

ありがとうございました。 –

関連する問題