Haga que Python unittest muestre AssertionError pero no Traceback

He mirado las otras preguntas relacionadas aquí pero no he encontrado mi respuesta. Me gustaría simplificar la salida de mis pruebas de unidad de Python (2.7). Probar sys.tracebacklimit = 0 no funcionó.

Aquí está mi fragmento de código (el código real genera muchas pruebas similares):

 #!/usr/bin/python -E import unittest import os import sys class TestSequense(unittest.TestCase): pass def test_dir_exists(dir): def test(self): self.assertTrue(os.path.isdir(dir),"ERROR: " + dir + " is not a directory") return test if __name__ == '__main__': test = test_dir_exists("/something/not/set/correctly") setattr(TestSequense, "test_path", test) #TODO trying remove unnecessary traceback info... still not working sys.tracebacklimit = 0 unittest.main() 

La salida es actualmente:

 F ====================================================================== FAIL: test_path (__main__.TestSequense) ---------------------------------------------------------------------- Traceback (most recent call last): File "./simple_unittest.py", line 11, in test self.assertTrue(os.path.isdir(dir),"ERROR: " + dir + " is not a directory") AssertionError: ERROR: /something/not/set/correctly is not a directory ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1) 

Me gustaría que se vea así:

 F ====================================================================== FAIL: test_path (__main__.TestSequense) ---------------------------------------------------------------------- AssertionError: ERROR: /something/not/set/correctly is not a directory ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1) 

¿Es esto posible sin analizar la salida? El Traceback no me da información útil y estoy ejecutando miles de pruebas.

¡Gracias por adelantado!

No estoy seguro si es posible con el módulo de prueba de unidad de vainilla. Pero debería echar un vistazo a py.test , con él puede configurar la cantidad de información que se muestra en un rastreo con el interruptor --tb .

Probablemente te interese

 py.test --tb=line # only one line per failure 

Vea esta página para una lista completa de opciones.

El truco es atrapar la excepción, quitar los bits que no son necesarios y tirarlos nuevamente …

Basado en esta respuesta, el siguiente código funciona …

 #!/usr/bin/python -E import unittest import os import sys class TestSequense(unittest.TestCase): pass def test_dir_exists(dir): def test(self): try: self.assertTrue(os.path.isdir(dir),"ERROR: " + dir + " is not a directory") except: # Remove traceback info as we don't need it unittest_exception = sys.exc_info() raise unittest_exception[0], unittest_exception[1], unittest_exception[2].tb_next return test if __name__ == '__main__': test = test_dir_exists("/something/not/set/correctly") setattr(TestSequense, "test_path", test) unittest.main() 

Y genera lo siguiente …

 ./simple_unittest.py F ====================================================================== FAIL: test_path (__main__.TestSequense) ---------------------------------------------------------------------- AssertionError: ERROR: /something/not/set/correctly is not a directory ---------------------------------------------------------------------- Ran 1 test in 0.000s 

unittest tiene un mecanismo para ocultar el contenido de los métodos TestCase.assert* en el rastreo, ya que realmente no contienen ninguna información útil para las fallas. Busca __unittest en los __unittest globales del marco. Puede ocultar un módulo completo de las __unittest = True colocando __unittest = True en la parte superior del módulo.