2010-07-27 21 views
8

Me gustaría usar el módulo de registro de Python para registrar todos los resultados de unittest para poder incorporarlo a un marco de prueba que estoy tratando de escribir. El objetivo de esto es ejecutar las pruebas con 2 conjuntos de resultados, uno con resultados simples que indiquen los pasos del caso de prueba y un nivel de depuración más alto para que cuando las cosas vayan mal tengamos la mayor cantidad de información posible. La salida se colocaría en dos archivos, uno que podría enviar por correo electrónico a las personas y otro en caso de fallas. Me di cuenta de que TextTestRunner puede usar una secuencia, ¿podría usarse con el módulo de registro? Estoy planeando usar algunas de las nuevas características en Python 2.7.¿Cómo se puede usar el módulo de registro en python con el módulo unittest?

Respuesta

1

Podría, pero no estoy seguro de que sea su mejor enfoque.

Para este enfoque, lo haría:

  1. una instancia de una corriente en memoria que puede ser utilizado por TextTestRunner. Este es el tipo de cosa que io.StringIO sería casi perfecto, excepto que funciona solo con entrada Unicode, y no estoy seguro de que TextTestRunner escriba Unicode correctamente en la transmisión. Su otra opción sería codificar su propia transmisión en la memoria que sirva a su propósito, tal vez envolviendo StringIO con un codificador.

  2. Crear su propio TextTestRunner e inicializar con esta corriente en memoria.

  3. crear una clase que se lee de la corriente y lo escribe en el registro.

Esto podría ser tan simple como:

class StreamLogger(object): 
    def __init__(self, input_stream, output_logger): 
     self.input_stream = input_stream 
     self.output_logger 
    def run(self): 
     while True: 
      line = input_stream.readline() 
      if not line: 
       break 
      output_logger.error(line) 

problemas con este enfoque:

  • Usted no tiene mucho si cualquier flexibilidad en la dirección de las diferentes partes de la producción TextTestRunner a diferentes niveles de registro.
  • TextTestRunner, si está mal configurado, escribirá un montón de cosas que probablemente no desee. La verbosidad predeterminada es 1, que escribirá puntos de progreso mientras está probando ... lo que probablemente solo se interpondrá en su salida de registro.
  • Si lo hace ingenuamente, llamará al stream_logger.run() solo después de haber escrito todos sus resultados en la transmisión. Por lo tanto, no obtendrá su salida de registro en tiempo real, y sus marcas de tiempo de registro serán inútiles. Podría resolver esto al generar un hilo separado para leer, por ejemplo, pero luego tendría que elegir/hacer rodar una secuencia que pueda manejar un hilo de lector y escritor que trabaje simultáneamente, o bifurcar un proceso y deshacerse de la corriente en la memoria, o algo relativamente complicado.

El enfoque me gustaría sugerir en cambio, es renunciar a los arroyos y simplemente rodar su propio corredor de prueba - llamada, por ejemplo, LoggingTestRunner - que escribe la salida de prueba al registrador exactamente de la forma que desee de salida. Esto le permitirá evitar estos tres problemas.

+0

Gracias. Eso suena a lo que necesito hacer de todos modos para el resto de las cosas que necesito hacer. – user197674

Cuestiones relacionadas