pytest的addoptions和动态参数化测试夹具的问题

时间:2015-06-29 20:38:21

标签: python python-2.7 pytest

我最近使用pytest进行软件测试,但在动态参数化测试夹具时遇到了问题。在测试时,我希望能够提供以下选项:

A)通过指定文件名

来测试特定文件

B)测试已安装的根目录中的所有文件

以下是我目前的conftest.py。我想要它做的是如果你选择选项A(--file_name),使用指定的文件名创建一个参数化的测试夹具。如果选择选项B(--all_files),请提供所有文件的列表作为参数化测试夹具。

import os
import pytest

def pytest_addoption(parser):
    parser.addoption("--file_name", action="store", default=[], help="Specify file-under-test")
    parser.addoption("--all_files", action="store_true", help="Option to test all files root directory")

@pytest.fixture(scope='module')
def file_name(request):
    return request.config.getoption('--file_name')

def pytest_generate_tests(metafunc):
    if 'file_name' in metafunc.fixturenames:
        if metafunc.config.option.all_files:
            all_files = list_all_files()
        else:
            all_files = "?"
        metafunc.parametrize("file_name", all_files)


def list_all_files():
    root_directory = '/opt/'
    if os.listdir(root_directory):
        # files have .cool extension that need to be split out
        return [name.split(".cool")[0] for name in os.listdir(root_directory)
                if os.path.isdir(os.path.join(root_directory, name))]
    else:
        print "No .cool files found in {}".format(root_directory)

我越是摆弄这个,我只能让其中一个选项起作用而不是另一个......我需要做些什么才能让两个选项(以及可能更多)动态创建参数化测试装置?

1 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

var items = ['.item-1','.item-2'...];
$(items[1]).click(function(){
    // ... function
    items = ['.item-3', '.item-1' ...];
});

无需定义def pytest_generate_tests(metafunc): if 'file_name' in metafunc.fixturenames: files = [] if metafunc.config.option.all_files: files = list_all_files() fn = metafunc.config.option.file_name if fn: files.append(fn) metafunc.parametrize('file_name', all_files, scope='module') 功能。