2015-06-29 2 views
1

Я использую 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

Вы ищете что-то в этом роде?

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». Кажется, что иногда я получаю unparametrized fixture, потому что я могу видеть в тестовом журнале вывод всего списка файлов, а не только 1 запись. – t88

+0

@ t88 Вероятно, это потому, что 'default = []' в 'parser.addoption (" - имя_файла ", ...)' неверно. Для согласованности вы должны выполнить 'default = '''. Если это не поможет, покажите нам тест. Вы удалили функцию 'file_name'? – freakish

+0

Вы правы! Также выясняется, что files.append (fn) возвращал список, и если бы я указал имя_файла, он вернул бы список и не использовал указанную строку в качестве параметризованного тестового прибора. Благодаря! – t88

Смежные вопросы