2010-03-16 25 views
9

¿Hay alguna manera, dentro de espera, para ejecutar las pruebas unitarias (PyUnit módulo unittest) directamente?IDLE para ejecutar pruebas unitarias Python PyUnit

Lo pido porque tengo un breve módulo de prueba y cuando lo ejecuto con python mymodule.py desde el shell Cygwin me pasan todas las pruebas, pero cuando uso Run-> Run Module desde IDLE pasan las pruebas pero luego obtener una excepción (SystemExit: False).

Por ejemplo, aquí es un módulo de prueba de muestra para reproducir este:

#!/usr/bin/python 

import unittest 

class fooTests(unittest.TestCase): 

    def setUp(self): 
     self.foo = "bar" 

    def testDummyTest(self): 
     self.assertTrue(True) 

    def testDummyTestTwo(self): 
     self.assertEquals("foo", "foo") 


    def tearDown(self): 
     self.foo = None 

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

Cuando corro desde el shell de Cygwin con el pitón fooTests.py que produce:

$ python fooTests.py 
.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 

Pero cuando estoy editando fooTests.py dentro de IDLE y hago Ejecutar -> Ejecutar módulo, el nuevo Python Shell generado por IDLE produce:

>>> ================================ RESTART ================================ 
>>> 
.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.031s 

OK 

Traceback (most recent call last): 
    File "C:\Some\path\info\I\shortened\fooTests.py", line 20, in <module> 
    unittest.main() 
    File "C:\Python26\lib\unittest.py", line 817, in __init__ 
    self.runTests() 
    File "C:\Python26\lib\unittest.py", line 865, in runTests 
    sys.exit(not result.wasSuccessful()) 
SystemExit: False 
>>> 

¿Qué estoy haciendo mal, para producir este rastreo, y sobre todo cómo puedo solucionarlo de modo que pueda simplemente Run-> Ejecutar módulo (o F5) dentro de IDLE para ejecutar las pruebas unitarias de forma rápida?

(Esto sin duda debe ser una cuestión sencilla, pero mis intentos rápidos de averiguarlo han sido infructuosos.)

Respuesta

7

Nadie respondió (Me parece que si no hay respuestas en los primeros minutos, la probabilidad de una respuesta disminuye significativamente :), así que seguí investigando esto yo mismo.

No estoy seguro si esta es la solución más elegante o no, pero cambiando:

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

a

if __name__ == '__main__': 
    try: unittest.main() 
    except SystemExit: pass 

parecía hacer el truco.

Supongo que el problema es que (según http://coding.derkeiler.com/Archive/Python/comp.lang.python/2003-11/0239.html) los acabados del módulo unittest llamando sys.exit que al parecer es problemática para el ralentí, ya que quiere mantener el terminal de Python en ejecución, mientras que no es un problema cuando se ejecuta desde la línea de comando, que espera volcarlo a su línea de comando que ya se está ejecutando de todos modos.

No sé si esta solución, capturar el evento SystemExit e ignorarlo, es problemático en absoluto, pero parece funcionar para todos los casos de prueba y paso y algunos casos de prueba que fallaron.

Además, consulte esta publicación de StackOverFlow: What code can I use to check if Python is running in IDLE?, que proporciona una prueba para ver si el programa se está ejecutando desde IDLE o no.

+0

try/except puede consumir el código de retorno, por lo que puede causar problemas si el código se prueba en un entorno de CI. Sin embargo, la información es útil: el módulo unitest llama a sys.exit, cuando un shell interactivo quiere permanecer abierto (es decir, IDle, shell Python de Emacs, etc.), por lo que se muestra esta excepción. –

1

Algo como esto también debería funcionar:

suite = unittest.TestLoader().loadTestsFromTestCase(fooTests) 
unittest.TextTestRunner(verbosity=2).run(suite) 

me encontré con que here, y funcionó para mí.

9

También se puede hacer

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

si estás usando Python> = 2.7

Cuestiones relacionadas