pocket edition dinnerbone anlyticsed python nosetests

python - edition - minecraft wiki



Deshabilitar pruebas en la nariz de Python (5)

Creo que también tendrá que cambiar el nombre de su decorador a algo que no haya probado. Lo siguiente solo falla en la segunda prueba y la primera no aparece en el banco de pruebas.

def unit_disabled(func): def wrapper(func): func.__test__ = False return func return wrapper @unit_disabled def test_my_sample_test(): assert 1 <> 1 def test2_my_sample_test(): assert 1 <> 1

Cuando se usan pruebas de nariz para Python, es posible desactivar una prueba unitaria estableciendo el atributo __test__ la función de __test__ en falso. Lo he implementado usando el siguiente decorador:

def unit_test_disabled(): def wrapper(func): func.__test__ = False return func return wrapper @unit_test_disabled def test_my_sample_test() #code here ...

Sin embargo, esto tiene el efecto secundario de llamar al contenedor como la prueba unitaria. Wrapper siempre pasará, pero está incluido en la salida de nosetests. ¿Hay alguna otra forma de estructurar el decorador para que la prueba no se ejecute y no aparezca en la salida de las pruebas de nariz?



También hay un complemento skiptest para nosetest, que provocará que el espectáculo de prueba en la salida de prueba se omita. Aquí hay un decorador para eso:

def skipped(func): from nose.plugins.skip import SkipTest def _(): raise SkipTest("Test %s is skipped" % func.__name__) _.__name__ = func.__name__ return _

Ejemplo de salida:

$ nosetests tests .......................................................................... ..................................S............. ---------------------------------------------------------------------- Ran 122 tests in 2.160s OK (SKIP=1)


También puede usar el decorador unittest.skip :

import unittest @unittest.skip("temporarily disabled") class MyTestCase(unittest.TestCase): ...


Puede simplemente comenzar la clase, el método o el nombre de la función con un guión bajo y la nariz lo ignorará.

@nottest tiene sus usos, pero me parece que no funciona bien cuando las clases se derivan unas de otras y algunas clases de base deben ser ignoradas por la nariz. Esto sucede a menudo cuando tengo una serie de vistas similares de Django para probar. A menudo comparten características que necesitan pruebas. Por ejemplo, solo son accesibles para usuarios con ciertos permisos. En lugar de escribir el mismo permiso de verificación para todos ellos, puse dicha prueba compartida en una clase inicial de la que derivan las otras clases. El problema, sin embargo, es que la clase base está ahí para ser derivada solo por las clases posteriores y no debe ejecutarse por sí misma. Aquí hay un ejemplo del problema:

from unittest import TestCase class Base(TestCase): def test_something(self): print "Testing something in " + self.__class__.__name__ class Derived(Base): def test_something_else(self): print "Testing something else in " + self.__class__.__name__

Y la salida de ejecutar nariz en él:

$ nosetests test.py -s Testing something in Base .Testing something in Derived .Testing something else in Derived . ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK

La clase Base está incluida en las pruebas.

No puedo simplemente golpear @nottest en Base porque marcará toda la jerarquía. De hecho, si solo agregas @nottest al código de arriba en frente de la class Base , entonces nose no ejecutará ninguna prueba.

Lo que hago es agregar un guión bajo al frente de la clase base:

from unittest import TestCase class _Base(TestCase): def test_something(self): print "Testing something in " + self.__class__.__name__ class Derived(_Base): def test_something_else(self): print "Testing something else in " + self.__class__.__name__

Y cuando lo ejecuta _Base se ignora:

$ nosetests test3.py -s Testing something in Derived .Testing something else in Derived . ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK

Este comportamiento no está bien documentado, pero el código que selecciona las pruebas verifica explícitamente un guión bajo al comienzo de los nombres de las clases .

Una prueba similar se realiza por la nariz en la función y los nombres de los métodos, por lo que es posible excluirlos añadiendo un guión bajo al comienzo del nombre.