2009-03-26 9 views
6

estoy usando el siguiente código en mi marco de pruebas:PyUnit: ¿se detiene después de la primera prueba de falla?

testModules = ["test_foo", "test_bar"] 

suite = unittest.TestLoader().loadTestsFromNames(testModules) 
runner = unittest.TextTestRunner(sys.stdout, verbosity=2) 
results = runner.run(suite) 
return results.wasSuccessful() 

¿Hay una manera de hacer la notificación abortar después de la primera falta de prevención de la verbosidad excesiva (runner.run?)?

Respuesta

5

Es una característica. Si desea sobrescribir esto, deberá subclasificar las clases TestCase y/o TestSuite y anular la lógica en el método run().

P.S .: yo creo que hay una subclase unittest.TestCase y reemplazar el método run() en su clase:

def run(self, result=None): 
    if result is None: result = self.defaultTestResult() 
    result.startTest(self) 
    testMethod = getattr(self, self._testMethodName) 
    try: 
     try: 
      self.setUp() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      return 

     ok = False 
     try: 
      testMethod() 
      ok = True 
     except self.failureException: 
      result.addFailure(self, self._exc_info()) 
      result.stop() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      result.stop() 

     try: 
      self.tearDown() 
     except KeyboardInterrupt: 
      raise 
     except: 
      result.addError(self, self._exc_info()) 
      ok = False 
     if ok: result.addSuccess(self) 
    finally: 
     result.stopTest(self) 

(He añadido dos result.stop() llamadas a la definición por defecto run).

A continuación, deberá modificar todas las casillas de verificación para convertirlas en subclases de esta nueva clase, en lugar de unittest.TestCase.

ADVERTENCIA: No he probado este código. :)

+1

No estoy seguro de ser capaz de eso (o más bien, no quiero poner demasiado esfuerzo en esto ...). Tenía la esperanza de que hubiera un equivalente de py.test's --exitfirst option. – AnC

+0

Bueno, no hay otra manera. En realidad, el código unittest.py es bastante simple, fácil de leer y extender. –

+0

He investigado esto y he intentado anular unittest.TextTestRunner.test para abortar si se configuró un indicador, pero ese es todo el conjunto de pruebas, por lo que no me sirve ... Cualquier puntero sería más ¡Bienvenido! – AnC

5

partir de la indicación Eugene, yo he llegado con lo siguiente:

class TestCase(unittest.TestCase): 
    def run(self, result=None): 
     if result.failures or result.errors: 
      print "aborted" 
     else: 
      super(TestCase, self).run(result) 

Aunque esto funciona bastante bien, es un poco molesto que cada módulo de ensayo individual tiene que definir si se quiere usar esta clase personalizada o el defecto (un modificador de línea de comandos, similar a py.test 's --exitfirst, sería ideal) ...

0

sobre la base de la respuesta de ANC, esto es lo que estoy usando ...

def aborting_run(self, result=None): 
    if result.failures or result.errors: 
     print "aborted" 
    else: 
     original_run(self, result) 
original_run = unittest.TestCase.run 
unittest.TestCase.run = aborting_run 
Cuestiones relacionadas