Deshabilita las pruebas unitarias individuales de Python temporalmente

128

¿Cómo se pueden deshabilitar temporalmente las pruebas unitarias individuales cuando se usa el unittestmódulo en Python?

Coelhudo
fuente

Respuestas:

229

Los métodos o clases de prueba individuales se pueden deshabilitar usando el unittest.skipdecorador.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Para otras opciones, consulte los documentos para las pruebas de omisión y las fallas esperadas .

yoni
fuente
9
En Python 3, la respuesta de Akif a continuación @unittest.SkipTestfunciona y no@unittest.skip
lifebalance
77
Estoy usando Python 3.6.1 y @unittest.skiptambién funciona bien.
Pete
2
@Pete, en Python 3.4.0, @unittest.skipno funciona.
Lifebalance
¿Cómo evitar que se salten las clases infantiles?
Reubenjohn
La anotación solo se aplicaría a un único método de prueba. ¿Tiene la intención de tener una clase principal con métodos de prueba, y solo algunas clases secundarias tienen el método desactivado? Me imagino que es posible, aunque es posible que deba diseñar las clases padre / hijo de manera adecuada. ¿Puedes explicar el escenario que estás tratando de resolver con un ejemplo de juguete?
yoni
26

Puede usar decoradores para deshabilitar la prueba que puede ajustar la función y evitar que la prueba de unidad googletest o python ejecute el caso de prueba.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Salida:

testFoo has been disabled
GTM
fuente
11

La última versión (2.7 - inédita) admite la omisión / desactivación de pruebas de esta manera . Puede obtener este módulo y usarlo en su instalación existente de Python. Probablemente funcionará.

Antes de esto, solía cambiar el nombre de las pruebas que quería salté a xtest_testnamepartir test_testname.


Aquí hay un script rápido de elisp para hacer esto. Mi elisp está un poco oxidado, así que me disculpo de antemano por cualquier problema que tenga. No probado

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))
Noufal Ibrahim
fuente
1, pero en todo el proyecto que estoy trabajando cada uno está utilizando v2.6.2 pitón, y no creo que esto va a cambiar: /, pero es una solución, gracias
coelhudo
Podría ajustar un poco su editor para darle una macro para habilitar / deshabilitar un caso de prueba, pero hablo como usuario de Emacs, así que ... :)
Noufal Ibrahim
Yo también soy usuario de Emacs, ¿hiciste una macro?
coelhudo
No Solo dejé que fallaran, pero no es tan difícil. Aunque he actualizado la respuesta con un rapidito.
Noufal Ibrahim
Esta respuesta aceptada no es una respuesta, solo un enlace. La respuesta real y actual tampoco es la más votada. De acuerdo, tiene 4 años. El elisp gratuito simplemente se ofusca.
jwd630
10

Simplemente colocar @unittest.SkipTestdecorador encima de la prueba es suficiente.

Akif
fuente
No sé quien lo hizo. Pero, estaba leyendo la documentación y dice que SkipTest es una excepción. De todos modos, es diferente de unittest.skip en el sentido de que skip nunca ejecuta la prueba (haciéndola deshabilitada), mientras que el propósito de SkipTest se debe plantear si algo no se espera mientras se ejecuta la prueba. Estoy en lo cierto? Interesante duro.
coelhudo
unittest.skip(sin razón) me da un error en Python 2 pero no en Python 3.
Akif
5

Acabo de cambiar el nombre de un método de caso de prueba con un guión bajo: test_myfunc se convierte en _test_myfunc.

MattK
fuente
3

Los documentos para 2.1 no especifican un método de ignorar u omitir.

Por lo general, bloqueo el comentario cuando es necesario.

Finglas
fuente
1

Centrándose en la parte "temporalmente deshabilitada" de la pregunta, la mejor respuesta depende un poco del caso de uso. El caso de uso que me trajo aquí es que estoy haciendo un desarrollo basado en pruebas en una función. En este proceso, escribo sucesivamente pruebas y a menudo uso puntos de interrupción en la función para la depuración. Si solo ejecuto todas las pruebas cada vez que ejecuto el corredor de prueba, termino deteniéndome en los puntos de interrupción para las pruebas que ya funcionan. Agregar "omitir" o mezclar el nombre de la prueba o algo así no es lo que quiero porque cuando termine de escribir la función, quiero que se ejecuten todas las pruebas. Si usara "skip", tendría que regresar y "unskip".

Para mi caso de uso, la solución se encuentra en el corredor de prueba, no en el código de prueba. Yo uso pytest . Con pytest, es fácil especificar una sola prueba desde la línea de comando:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(reemplace las tapas con sus valores).

Entiendo que esa pregunta era para python-unitest. No lo he usado en mucho tiempo. No me sorprendería si tuviera algo similar a Pytest. Si no, puede cambiar fácilmente a pytest. No necesita modificar su código. Simplemente instálelo y cambie su comando de corredor de prueba.

Además, uso PyCharm Pro. En la página que muestra mi código de prueba, hay un pequeño icono al lado de la definición para cada prueba. Puedo hacer clic en ese icono y ejecutar esa prueba individualmente.

Arrojar
fuente