¿Cómo se puede suprimir las trazas para casos de prueba fallidos utilizando Nose?

Estoy escribiendo un traje de prueba con nariz, y me gustaría que los casos fallidos muestren una salida como

“FALLIDO: is_even (5): Ni siquiera”

en lugar de la salida por defecto:

====================================================================== FAIL: seed_db.test_generator(5,) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/nose/case.py", line 197, in runTest self.test(*self.arg) File "/home/apurcell/tests/prism/seed_db.py", line 59, in is_even nose.tools.eq_(x % 2, 0, msg="Not even") File "/usr/local/lib/python2.7/dist-packages/nose/tools.py", line 31, in eq_ assert a == b, msg or "%r != %r" % (a, b) AssertionError: Not even ---------------------------------------------------------------------- 

¿Hay una opción para la nariz que pueda hacer esto?

Si desea cambiar el comportamiento de la nariz, debe escribir un complemento ( consulte la documentación de la API aquí ). En su caso, parece que desea cambiar la forma en que se informan los errores, por lo que desearía proporcionar formatError() y formatFailure() . Probablemente desearía editar el mensaje de excepción (para incluir el número de línea) y limitar el tamaño del rastreo.

Una posible solución es redirigir la secuencia de error a una secuencia como un objeto y manejar la salida diferente allí. Esto podría parecerse al siguiente fragmento de código:

 import sys class MyErrorStream(): def write(self, txt): # Do something if # output contains # special exception altered_txt = 'My special exception is:\n' + txt sys.__stderr__.write(altered_txt) if(__name__ == '__main__'): error_stream = MyErrorStream() sys.stderr = error_stream assert(1 == 0) 

Pero esta solución no es la más bonita. Otra forma de alterar el seguimiento de la stack es modificar la clase interna de la nariz que maneja la salida. Podría crear una subclase y sobrescribir / extender los métodos que crean el texto de salida. Como no uso la nariz, no puedo dar un fragmento de código mínimo. Sin embargo espero poder ayudarte.

Lo siguiente tiene una salida similar pero no idéntica a lo que desea (y también cambia la salida de prueba exitosa, que puede no ser lo que desea). Utiliza tap.py para generar TAP (probar cualquier protocolo) en lugar de la salida habitual de unittest.

 nosetests --with-tap --tap-stream testcases-rsysflow.py 

La salida se ve como:

 bjb@rhino$ nosetests testcases-rrrr.py --with-tap --tap-stream # TAP results for TestThing ok 1 - test_create_and_get (testcases-rrrr.TestThing) ok 2 - test_del_one (testcases-rrrr.TestThing) ok 3 - test_get_all (testcases-rrrr.TestThing) not ok 4 - test_get_not_exist (testcases-rrrr.TestThing) ok 5 - test_get_wrong_indir (testcases-rrrr.TestThing) ok 6 - test_replace_and_get (testcases-rrrr.TestThing) ok 7 - test_set_should_fail (testcases-rrrr.TestThing) 1..7 

Con Test Anything Protocol (estoy hablando del protocolo, no de esta implementación específica) puede generar información de diagnóstico después del guión en caso de error, pero no sé cómo hacerlo con esta implementación.

Esta implementación fue útil porque solo tuve que instalar tap.py ( pip install tap.py ) y poner esos dos argumentos de línea de comandos en la invocación más reciente de mis pruebas de prueba de unidad, y poof – salida con formato TAP. Puedo enchufar esto a Jenkins ahora.