2015-06-29 38 views
1

我使用pytest最近做软件测试,但在动态参数化测试装置时遇到问题。测试时,我想能够提供可以选择:通过在安装根目录Pytest的addoptions问题和动态参数化测试装置

下面是指定其文件名

B)测试中的所有文件

A)测试一个特定的文件我目前的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

你在找这样的吗?

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') 

不需要定义file_name功能。

+0

这是部分工作......这真的很怪异,但它看起来像我的一些测试通过,有些不。对于失败,我最终得到一个AttributeError:'list'对象没有属性'endswith'。看起来有时候我得到一个无参数化的夹具,因为我可以在测试日志输出中看到整个文件列表,而不是只有1个条目。 – t88

+0

@ t88这可能是因为parser.addoption(“ - file_name”,...)中的'default = []'是错误的。为了一致性,你应该做'default ='''。如果它没有帮助,然后给我们看看测试。你删除了'file_name'函数吗? – freakish

+0

你是对的!另外,事实证明files.append(fn)正在返回一个列表,如果我指定了一个file_name,它将返回一个列表,而不是使用指定的字符串作为参数化测试夹具。谢谢! – t88