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?
Nose ya tiene un decorador incorporado para esto:
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
También echa un vistazo a las otras golosinas que ofrece nariz: https://nose.readthedocs.org/en/latest/testing_tools.html
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.