Это проблема, возникшая при выполнении одного теста с несколькими независимыми режимами отказа из-за наличия нескольких выходных потоков. Я также хотел показать результаты утверждения данных обо всех этих режимах, независимо от того, что произошло в первую очередь. У Python unittest нет такой функции за пределами использования Suite для представления одного теста, что было неприемлемо, поскольку мой единственный тест всегда нужно запускать как единое целое; он просто не фиксирует природу вещи.
Практическим примером является тестирование объекта, который также генерирует журнал. Вы хотите утверждать вывод его методов, но вы также хотите утверждать вывод журнала. Для двух выходов требуются разные тесты, которые могут быть четко выражены, поскольку два из выражений запаса утверждают, но вы также не хотите, чтобы один из них скрывал возможный сбой другого в тесте. Поэтому вам действительно нужно протестировать оба одновременно.
Я собрал этот полезный маленький виджет, чтобы решить мою проблему.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
Используется так:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
В результате logFailures() вызовет исключение, содержащее журнал всех утверждений, поднятых в методах в списке.
Вопрос: В то время как это выполняет задание, мне остается задаться вопросом, есть ли лучший способ справиться с этим, кроме необходимости идти на длину создания вложенных наборов тестов и т.д.