Если я пишу модульные тесты на python (используя модуль unittest), можно ли вывести данные из неудавшегося теста, чтобы я мог изучить их, чтобы определить причину ошибки? Мне известно о возможности создания настраиваемого сообщения, которое может нести некоторую информацию, но иногда вы можете иметь дело с более сложными данными, которые не могут быть легко представлены в виде строки.
Например, предположим, что у вас есть класс Foo и вы тестируете панель методов, используя данные из списка под названием testdata:
class TestBar(unittest.TestCase):
def runTest(self):
for t1, t2 in testdata:
f = Foo(t1)
self.assertEqual(f.bar(t2), 2)
Если тест не удался, я мог бы захотеть вывести t1, t2 и / или f, чтобы понять, почему именно эти данные привели к сбою. Под выходными данными я подразумеваю, что переменные могут быть доступны, как и любые другие переменные, после того, как тест был запущен.
источник
msg
он используется, он заменит обычное сообщение об ошибке. Чтобыmsg
добавить к обычному сообщению об ошибке, вам также необходимо установить для TestCase.longMessage значение TrueTrue
.Мы используем для этого модуль логирования.
Например:
Это позволяет нам включать отладку для определенных тестов, которые, как мы знаем, терпят неудачу и для которых нам нужна дополнительная отладочная информация.
Однако я предпочитаю не тратить много времени на отладку, а тратить его на написание более детальных тестов, чтобы выявить проблему.
источник
foo
? Отдельная функция? Функция методаSomeTest
? В первом случае функция может иметь собственный логгер. Во втором случае у другой функции метода может быть собственный логгер. Вы в курсе, какlogging
работает пакет? Использование нескольких регистраторов - это норма.Вы можете использовать простые операторы печати или любой другой способ записи в стандартный вывод. Вы также можете вызвать отладчик Python в любом месте ваших тестов.
Если вы используете нос для запуска тестов (что я рекомендую), он будет собирать стандартный вывод для каждого теста и показывать его вам только в том случае, если тест не пройден, поэтому вам не придется жить с загроможденным выводом, когда тесты пройдут.
В носу также есть переключатели для автоматического отображения переменных, упомянутых в утверждениях, или для вызова отладчика при неудачных тестах. Например
-s
(--nocapture
) предотвращает захват stdout.источник
print
иlog.debug()
рядом друг с другом, и я явно включаюDEBUG
ведение журнала в корне изsetUp()
метода, ноprint
отображается только вывод.nosetests -s
показывает содержимое stdout независимо от того, есть ли ошибка - что-то, что я считаю полезным.Я не думаю, что это именно то, что вы ищете, нет способа отобразить значения переменных, которые не выходят из строя, но это может помочь вам приблизиться к выводу результатов так, как вы хотите.
Вы можете использовать объект TestResult, возвращаемый TestRunner.run (), для анализа и обработки результатов. В частности, TestResult.errors и TestResult.failures
Об объекте TestResults:
http://docs.python.org/library/unittest.html#id3
И немного кода, который укажет вам правильное направление:
источник
Другой вариант - запустить отладчик там, где тест не пройден.
Попробуйте запустить свои тесты с помощью Testoob (он запустит ваш пакет unittest без изменений), и вы можете использовать переключатель командной строки --debug, чтобы открыть отладчик, когда тест не прошел.
Вот сеанс терминала в Windows:
источник
Метод, который я использую, очень прост. Я просто записываю это как предупреждение, чтобы оно действительно появилось.
источник
Я думаю, что, возможно, слишком много об этом подумал. Один из способов, который я придумал, - это просто иметь глобальную переменную, которая накапливает диагностические данные.
Что-то вроде этого:
Спасибо за ответы. Они дали мне несколько альтернативных идей о том, как записывать информацию из модульных тестов в Python.
источник
Использовать ведение журнала:
Использование:
Если не выставить
LOG_FILE
, то логирование придетсяstderr
.источник
Вы можете использовать
logging
для этого модуль.Итак, в коде модульного теста используйте:
По умолчанию предупреждения и ошибки выводятся
/dev/stderr
, поэтому они должны быть видны на консоли.Чтобы настроить журналы (например, форматирование), попробуйте следующий пример:
источник
Что я делаю в этих случаях, так это
log.debug()
то, что в моем приложении есть несколько сообщений. Поскольку по умолчанию уровень ведения журнала равенWARNING
, такие сообщения не отображаются при обычном выполнении.Затем в модуле unittest я меняю уровень ведения журнала на
DEBUG
, чтобы такие сообщения отображались при их запуске.В юнит-тестах:
См. Полный пример:
Это
daikiri.py
базовый класс, который реализует Daikiri с его названием и ценой. Существует метод,make_discount()
который возвращает цену конкретного дайкири после применения данной скидки:Затем я создаю unittest,
test_daikiri.py
который проверяет его использование:Поэтому, когда я его выполняю, я получаю
log.debug
сообщения:источник
inspect.trace позволит вам получить локальные переменные после возникновения исключения. Затем вы можете обернуть модульные тесты декоратором, подобным следующему, чтобы сохранить эти локальные переменные для изучения во время вскрытия.
Последняя строка напечатает возвращенные значения, когда тест прошел успешно, и локальные переменные, в данном случае x, когда он не прошел:
Хар дет гёй :-)
источник
Как насчет того, чтобы перехватить исключение, которое возникает из-за ошибки утверждения? В вашем блоке catch вы можете выводить данные, как хотите, где угодно. Затем, когда вы закончите, вы можете повторно выбросить исключение. Участник тестирования, вероятно, не заметит разницы.
Отказ от ответственности: я не пробовал это с фреймворком модульного тестирования python, но использовал его с другими фреймворками модульного тестирования.
источник
Признаюсь, я не пробовал, но функция логирования testfixtures выглядит весьма полезной ...
источник
Расширяя ответ @FC, это хорошо работает для меня:
источник