En pytest, ¿cómo omitir o xfail ciertos accesorios?

Tengo una función de prueba fuertemente arreglada que falla (como debería) con ciertas entradas de aparatos. ¿Cómo puedo indicar esto? Esto es lo que estoy haciendo ahora, y tal vez hay una mejor manera. Soy bastante nuevo en py.test así que agradecería cualquier consejo.

La siguiente parte es todos los accesorios de entrada. Para su información, example_datapackage_path se define en 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) 

Y aquí está la prueba en sí.

 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 

Lo que me gustaría hacer es en metadata_key , digamos que cuando el parámetro sea pooled_col o phenotype_col , fallará. Busqué en pytest: Skip y xfail: lidiar con pruebas que no pueden ser exitosas , pero solo hablaba de skip y xfail para pruebas parametrizadas, pero no de arreglos.

En su datapackage o accesorios de expression_key , puede usar pytest.xfail y pytest.skip como se describe aquí . Por ejemplo:

 @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"') ... 

También puede usar pytest.mark.xfail en los parámetros del dispositivo como en este ejemplo:

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

Si prefieres omitir estas pruebas, esto parece funcionar:

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