как заставить нос логировать вывод дел в отдельные файлы?

Я использую нос для запуска нескольких тестов. Я хотел бы записывать вывод каждого случая в отдельные файлы и знать результат [успех/неудача] каждого случая. к сожалению, я не могу понять, как это сделать с носом. может ли кто-нибудь дать некоторые подсказки? Спасибо


person zx_wing    schedule 28.12.2012    source источник


Ответы (1)


Во-первых, это звучит как необычное использование и может означать, что вам следует пересмотреть схему тестирования.

Я могу придумать пару способов решить эту проблему. Проще всего было бы иметь каждый тестовый журнал сам по себе, вместо того, чтобы нос делал это за вас. Если у вас есть только несколько тестов или вы хотите зарегистрировать только результаты нескольких тестов, это, безусловно, способ сделать это.

Более сложный и общий подход заключается в написании подключаемого модуля для носа., который записывает результат каждого теста по мере его завершения. Для этого вам нужно написать подключаемый модуль, реализующий метод afterTest().

from nose.plugins import Plugin
import datetime

class SeparateReports(Plugin):
  "Log the results of each test into a separate file."
  def afterTest(self, test):
    logname = test.id() + '.log'
    success = test.passed
    date = datetime.datetime.now()
    # print logname, datetime.datetime.now(), success
    with open(logname, 'a') as log:
        log.write("%s: %s\n" % (date, success))

Это добавит к файлу журнала, названному в честь вашего конкретного теста, отметку даты и True для успеха/False для неудачи. Пара замечаний:

  • См. закомментированную строку для примера результатов, которые печатаются.
  • Этот подключаемый модуль должен быть зарегистрирован нос; см. документы.
  • После регистрации плагин должен быть включен; используйте параметр командной строки --with-separatereports (создается автоматически на основе имени подключаемого модуля).
  • Это будет довольно медленно, так как при каждом тесте затрагиваются файлы. Вам может понадобиться открытая БД sqlite или что-то в этом роде.
person dbn    schedule 03.01.2013
comment
Могу я спросить, почему вы использовали success = test.passed != False? может ли test.passed быть чем-то другим, кроме логического значения? (Вместо этого можно было бы использовать success = test.passed) - person Alex L; 03.01.2013
comment
@AlexL Я немного переформулировал это, дайте мне знать, чтобы это было более понятно. - person dbn; 03.01.2013
comment
Я читаю плагин testid, afterTest( ) с комментариями # None означает, что тест никогда не выполнялся, False означает сбой/ошибку - person Alex L; 03.01.2013
comment
возможно, вы могли бы использовать что-то вроде status = {False: 'Failed', None: 'Not run', True: 'Passed'}, затем status.get(test.passed)? - person Alex L; 03.01.2013
comment
Моя проблема заключалась в том, что я провел успешный тест, и у него было test.passed = None. Я проверю это еще раз и изменю описание, если это сработает. - person dbn; 03.01.2013
comment
спасибо за подробное объяснение. Я перейду к плагину, так как нос, естественно, его не поддерживает. - person zx_wing; 13.01.2013
comment
@AlexL - я изменил его, как вы предложили. Я не знаю, что происходило с моим первым тестовым случаем. - person dbn; 05.02.2013