jueves, septiembre 29, 2011

Python unittest: Eliminar información redundante en los informes

En la actualizacion a Python 2.7, el módulo unittest ha modificado la forma que tiene de presentar los resultados. Antes te mostraba una única línea de texto por test, con la primera línea de las descripción del test, si lo hubiera, o el nombre de la clase y función del test, si no lo hubiera. Por ejemplo, el siguiente código:


import unittest

class A(unittest.TestCase):

    def test_A(self):
        pass

    def test_B(self):
        '''este es el test B.
        '''
        pass

Nos daba este limpio resultado:


test_A (__main__.A) ... ok
este es el test B. ... ok

Pero en la 2.7 han cambiado este comportamiento, y ahora imprime el nombre de la clase y el método del test siempre, y si hay una descripción, la incluye como segunda línea. Es decir, produce este resultado:


test_A (__main__.A) ... ok
test_B (__main__.A)
este es el test B. ... ok

Si preferimos la manera antigua, la forma más sencilla de conseguirlo, por ahora, es incluir el siguiente código al principio de tus test (visto en esta respuesta a una pregunta en Stack Overflow: how to change the test description of python (2.7) untitest).


from unittest.runner import TextTestResult
TextTestResult.getDescription = lambda _, test: str(test.shortDescription())

Un hack un poco feo. pero funciona. Es una tontería, pero me tenía de los nervios. Suelo (o intento) documentar casi todos mis tests, con lo que, para mi, el añadido era solo ruido.