Pytest - pytest_generate_tests中的tmpdir_factory

时间:2017-06-19 19:36:58

标签: python pytest fixtures

所以我有两个主要部分的代码:

  1. 在目录中生成大量配置文件。
  2. 运行上一个生成的单个配置文件。
  3. 我想运行一个测试,首先我执行code1并生成所有文件,然后为每个配置文件运行code2并验证结果是否正常。 到目前为止我的尝试是:

    .content

    但是,@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方法。我的问题是如何通过生成所有测试来实现我的目标?

1 个答案:

答案 0 :(得分:3)

首先,最重要的是, pytest_generate_tests意味着是pytest中的钩子而不是夹具函数的名称。摆脱它之前的@pytest.fixture并再看its docs。钩子应该写在conftest.py文件或插件文件中,并根据pytest_前缀自动收集。

现在你的问题: 只需使用以下方法手动使用临时目录:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()

pytest_generate_tests内。将dirpath保存在全局中, 并使用

pytest_sessionfinish中删除
# ... do stuff with dirpath
shutil.rmtree(dirpath)

来源:https://stackoverflow.com/a/3223615/3858507

请记住,如果您有多个测试用例,则会为每个测试用例调用pytest_generate_tests。因此,您最好将所有tempdir保存在某个列表中,最后删除所有这些tempdir。相比之下,如果你只需要一个tempdir而不是考虑使用钩子pytest_sesssionstart在那里创建它并在以后使用它。