¿Cómo desactivo una prueba usando pytest?

86

Digamos que tengo un montón de pruebas:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

¿Hay un decorador o algo similar que pueda agregar a las funciones para evitar pytestejecutar solo esa prueba? El resultado podría parecerse a ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
ericmjl
fuente

Respuestas:

133

Pytest tiene los decoradores skip y skipif, similar al módulo de prueba de unidad de Python (que usa skipy skipIf), que se puede encontrar en la documentación aquí .

Aquí se pueden encontrar ejemplos del enlace:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

El primer ejemplo siempre omite la prueba, el segundo ejemplo le permite omitir pruebas condicionalmente (excelente cuando las pruebas dependen de la plataforma, la versión ejecutable o las bibliotecas opcionales).

Por ejemplo, si quiero comprobar si alguien tiene la biblioteca pandas instalada para una prueba.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...
Alexander Huszagh
fuente
¿Hay algo parecido al elegante .skipque tiene Mocha (Node.js)? it('tests something'...)-> it.skip('tests something'...)que deshabilitaría esa prueba en particular. También tiene lo opuesto útil: .onlyque solo ejecutará esa prueba y nada más.
Juha Untinen
Quiero decir, por el onlylado, puede hacerlo a través de la línea de comando o lo que sea que use para inicializar el corredor de prueba: stackoverflow.com/a/36539692/4131059 En cuanto a ity it.skip, creo que la funcionalidad aquí lo cubre completamente.
Alexander Huszagh
21

El skipdecorador haría el trabajo:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(el reasonargumento es opcional, pero siempre es una buena idea especificar por qué se omite una prueba).

También existe skipif()que permite deshabilitar una prueba si se cumple alguna condición específica.


Estos decoradores se pueden aplicar a métodos, funciones o clases.

Para omitir todas las pruebas en un módulo , defina una pytestmarkvariable global :

# test_module.py
pytestmark = pytest.mark.skipif(...)
Alecxe
fuente
10

No estoy seguro de si está obsoleto, pero también puede usar la pytest.skipfunción dentro de una prueba:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
Wayne Werner
fuente
2
vino por la ayuda de Pytest, me quedé por la referencia
Uzebeckatrente
a qué hace referencia. Tengo que saberlo
XChikuX
@XChikuX youtube.com/watch?v=xOrgLj9lOwk
Wayne Werner
Me temo que esto fue mucho antes de mi tiempo. Pero me alegro de saberlo ahora.
XChikuX
6

También puede querer ejecutar la prueba incluso si sospecha que la prueba fallará. Para tal escenario, https://docs.pytest.org/en/latest/skipping.html sugiere usar decorator @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

En este caso, Pytest seguirá ejecutando su prueba y le hará saber si pasa o no, pero no se quejará ni romperá la compilación.

Ruben Gasparian
fuente
2

Si desea omitir la prueba pero no codificar un marcador, es mejor usar la expresión de palabra clave para escapar.

pytest test/test_script.py -k 'not test_func_one'
Arindam Roychowdhury
fuente
1

Puede marcar una prueba con los decoradores skipy skipifcuando desee omitir una prueba pytest.

Saltarse una prueba

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

La forma más sencilla de omitir una prueba es marcarla con el skipdecorador, que puede pasar como opcional reason.

También es posible omitir imperativamente durante la ejecución o configuración de la prueba llamando a la pytest.skip(reason)función. Esto es útil cuando no es posible evaluar la condición de omisión durante el tiempo de importación.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Saltarse una prueba basada en una condición

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Si desea omitir en función de un condicional, puede usar skipif en lugar. En el ejemplo anterior, la función de prueba se omite cuando se ejecuta en un intérprete anterior a Python3.6.

Finalmente, si desea omitir una prueba porque está seguro de que está fallando, también puede considerar usar el xfailmarcador para indicar que espera que una prueba falle.

lmiguelvargasf
fuente