В pytest, как пропустить или сбросить определенные приборы?

У меня есть сильно настроенная тестовая функция, которая терпит неудачу (как и должно) с определенными входными данными прибора. Как я могу указать это? Это то, что я делаю сейчас, и, возможно, есть лучший способ. Я новичок в py.test, поэтому буду признателен за любые советы.

Следующая часть — это все входные приборы. К вашему сведению, example_datapackage_path определено в conf.test

@pytest.fixture(params=[None, 'pooled_col', 'phenotype_col'])
def metadata_key(self, request):
    return request.param

@pytest.fixture(params=[None, 'feature_rename_col'])
def expression_key(self, request):
    return request.param

@pytest.fixture(params=[None, 'feature_rename_col'])
def splicing_key(self, request):
    return request.param

@pytest.fixture
def datapackage(self, example_datapackage_path, metadata_key,
                expression_key, splicing_key):
    with open(example_datapackage_path) as f:
        datapackage = json.load(f)
    datatype_to_key = {'metadata': metadata_key,
                       'expression': expression_key,
                       'splicing': splicing_key}
    for datatype, key in datatype_to_key.iteritems():
        if key is not None:
            resource = name_to_resource(datapackage, datatype)
            if key in resource:
                resource.pop(key)
    return datapackage

@pytest.fixture
def datapackage_dir(self, example_datapackage_path):
    return os.path.dirname(example_datapackage_path)

А вот и сам тест.

def test_from_datapackage(self, datapackage, datapackage_dir):
    import flotilla
    from flotilla.external import get_resource_from_name

    study = flotilla.Study.from_datapackage(datapackage, datapackage_dir,
                                            load_species_data=False)

    metadata_resource = get_resource_from_name(datapackage, 'metadata')
    expression_resource = get_resource_from_name(datapackage,
                                                 'expression')
    splicing_resource = get_resource_from_name(datapackage, 'splicing')

    phenotype_col = 'phenotype' if 'phenotype_col' \
        not in metadata_resource else metadata_resource['phenotype_col']
    pooled_col = None if 'pooled_col' not in metadata_resource else \
        metadata_resource['pooled_col']
    expression_feature_rename_col = 'gene_name' if \
        'feature_rename_col' not in expression_resource \
        else expression_resource['feature_rename_col']
    splicing_feature_rename_col = 'gene_name' if \
        'feature_rename_col' not in splicing_resource \
        else splicing_resource['feature_rename_col']

    assert study.metadata.phenotype_col == phenotype_col
    assert study.metadata.pooled_col == pooled_col
    assert study.expression.feature_rename_col \
           == expression_feature_rename_col
    assert study.splicing.feature_rename_col == splicing_feature_rename_col

Что я хотел бы сделать, так это в metadata_key сказать, что когда параметр равен pooled_col или phenotype_col, это не удастся. Я просмотрел pytest: Skip and xfail: работа с тестами, которые не могут быть успешными, но там говорилось только о skip и xfail для параметризованный тест, но не фикстуры.


person Olga Botvinnik    schedule 30.09.2014    source источник


Ответы (1)


В ваших приборах datapackage или expression_key вы можете использовать pytest.xfail и pytest.skip, как описано здесь. Например:

@pytest.fixture
def datapackage(self, example_datapackage_path, metadata_key,
                expression_key, splicing_key):
    if metadata_key == 'pooled_col':
        pytest.skip('metadata key is "pooled_col"')
    ...

Вы также можете использовать pytest.mark.xfail в параметрах приборов, как в этом примере:

@pytest.fixture(params=['a', pytest.mark.xfail('b'), 'c'])
def fx1(request):
    return request.param


def test_spam(fx1):
    assert fx1

Если вы предпочитаете пропускать эти тесты, это работает:

@pytest.fixture(
    params=['a', pytest.mark.skipif(True, reason='reason')('b'), 'c'])
def fx1(request):
    return request.param


def test_spam(fx1):
    assert fx1
person jiffyclub    schedule 30.09.2014
comment
О, классно! Я не знал, что вы можете использовать те же аргументы для pytest.fixture, что и pytest.mark.parameterize. Благодарю вас! - person Olga Botvinnik; 01.10.2014