2014-09-30 2 views
8

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

Следующая часть - все входные светильники. FYI, 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: dealing with tests that can not succeed, но он только говорил о skip и xfail для параметризованного теста, но не для светильников.

ответ

15

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

@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 
+0

О, хороший! Я не знал, что вы можете использовать те же аргументы для 'pytest.fixture' как' pytest.mark.parameterize'. Спасибо! –

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