Как можно использовать модуль регистрации в python с модулем unittest? - PullRequest
8 голосов
/ 27 июля 2010

Я хотел бы использовать модуль журналирования python для регистрации всего вывода от unittest, чтобы я мог включить его в среду тестирования, которую я пытаюсь написать. Цель этого состоит в том, чтобы запустить тесты с 2 наборами выходных данных, один с простым выводом, который сообщает шаги тестового примера, и более выходной уровень отладки, чтобы, когда что-то идет не так, у нас было как можно больше информации. Вывод будет помещен в два файла, один из которых я могу разослать по электронной почте людям, а другой сохранится на случай сбоев. Я заметил, что TextTestRunner может использовать поток, это можно использовать с модулем регистрации? Я планирую использовать некоторые из новых функций в Python 2.7.

1 Ответ

1 голос
/ 28 июля 2010

Вы могли бы, но я не уверен, что это ваш лучший подход.

Для этого подхода вы бы:

  1. Создание потока в памяти, который можетиспользоваться TextTestRunner.Для такого типа вещей io.StringIO будет почти идеальным, за исключением того, что он работает только с вводом Unicode, и я не уверен, что TextTestRunner правильно записывает Unicode в поток.Другим вариантом может быть кодирование вашего собственного потока в памяти, который соответствует вашим целям, возможно, упаковка StringIO с помощью кодера.

  2. Создайте свой собственный TextTestRunner и инициализируйте его следующим образом:-память памяти.

  3. Создать класс, который читает из потока и записывает его в журнал.

Это может быть так просто:

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)

Проблемы с этим подходом:

  • У вас нет особой гибкости при направлении различных частей вывода TextTestRunner на разные уровни журнала.
  • TextTestRunner, если он неправильно настроен, напишет кучу вещей, которые вы, вероятно, не хотите.Детализация по умолчанию - 1, которая будет записывать точки прогресса во время тестирования ... что, вероятно, только помешает выводу в журнале.
  • Если вы сделаете это наивно, вы вызовете stream_logger.run() только после того, как вы записали весь свой вывод в поток.Таким образом, вы не получите свои результаты регистрации в реальном времени, и ваши временные метки будут бесполезны.Вы можете решить эту проблему, например, создав отдельный поток для чтения, но тогда вам нужно будет выбрать / свернуть поток, который может обрабатывать поток чтения и записи, работающий одновременно, или разветвить процесс и отключить поток в памяти,или что-то относительно сложное.

Подход, который я предлагаю вместо этого, состоит в том, чтобы отказаться от потоков и просто запустить собственный тестовый прогон - называемый, скажем, LoggingTestRunner - который записывает результаты теста в регистратор точнотак, как вы хотите, чтобы это вывод.Это позволит вам избежать всех трех проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...