2012-06-12 12 views
11

Con el módulo unittest, me gusta el feature to skip tests, pero solo está disponible en Python 2.7+.Usando `@ unittest.skipIf` con versiones anteriores de Python

Por ejemplo, considere test.py:

import unittest 
try: 
    import proprietary_module 
except ImportError: 
    proprietary_module = None 

class TestProprietary(unittest.TestCase): 
    @unittest.skipIf(proprietary_module is None, "requries proprietary module") 
    def test_something_proprietary(self): 
     self.assertTrue(proprietary_module is not None) 

if __name__ == '__main__': 
    unittest.main() 

Si trato de realizar una prueba con una versión anterior de Python, me sale un error:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    class TestProprietary(unittest.TestCase): 
    File "test.py", line 8, in TestProprietary 
    @unittest.skipIf(proprietary_module is None, "requries proprietary module") 
AttributeError: 'module' object has no attribute 'skipIf' 

¿Hay una manera de "engañar "versiones anteriores de Python para ignorar el decorador unittest y omitir la prueba?

Respuesta

6

unittest2 es un backport de las nuevas características añadidas al marco de pruebas unittest en Python 2.7. Está probado para ejecutarse en Python 2.4 - 2.7.

Para utilizar unittest2 en lugar de simplemente sustituir unittest importación unittest con importación unittest2

Ref: http://pypi.python.org/pypi/unittest2

+0

unittest2 no fue satisfactorio en mi extremo, aunque funcionó, escupe una advertencia de deprecation como: 'DeprecationWarning: El uso de un TestResult sin un método addSkip está en desuso self._addSkip (resultado, skip_why)' No pude para que desaparezca rápidamente –

1

¿Qué le parece usar la declaración if?

if proprietary_module is None: 
    print "Skipping test since it requires proprietary module" 
else: 
    def test_something_proprietary(self): 
     self.assertTrue(proprietary_module is not None) 
+0

soluciones integradas con '' unittest' o nose' avisará al usuario de que se ha omitido una prueba. Por ejemplo, 'Ran 14 pruebas en 1.325s. OK (SKIP = 1) '. La instrucción de impresión puede no satisfacer muchas situaciones. Por ejemplo, al usar 'nosetests', tendrías que usar el indicador' -s' para ver la declaración de impresión. – Aman

4

En general, recomendaría no usar unittest porque no tiene realmente un API Pythonic.

Un buen marco para las pruebas en Python es nose. Puede omitir las pruebas, elevando una excepción SkipTest, por ejemplo:

if (sys.version_info < (2, 6, 0)): 
    from nose.plugins.skip import SkipTest 
    raise SkipTest 

Esto funciona para Python 2.3 +

Hay muchas más características en la nariz:

  • No es necesario clases . Una función también podría ser una prueba.
  • Decorador para accesorios (configuración, funciones de desmontaje).
  • Accesorios de nivel de módulo.
  • Decorador para esperar una excepción.
  • ...
Cuestiones relacionadas