Получение результатов модульного тестирования Python сразу во время выполнения тестаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Получение результатов модульного тестирования Python сразу во время выполнения теста

Сообщение Anonymous »

Я провожу большие тесты (от нескольких часов до дней с сотнями тестов) и хочу видеть прогресс в электронной таблице. В этой таблице тот же результат, который unittest выводит на консоль (то есть ., F или E), должен быть вставлен сразу после завершения каждого отдельного теста.
Я знаю об этом ответе, который успешно извлекает правильный результат модульного теста в методе TearDown, если он попадает в категории PASS, FAIL или ERROR.< /p>
Однако есть и другие способы завершения теста: также есть SKIPPED, EXPECTED_FAILURE и UNEXPECTED_SUCCESS.
Я использовал следующий код для обработки как минимум PASS , FAIL, ERROR и ПРОПУЩЕНО:

Код: Выделить всё

import unittest

class MyTestCase(unittest.TestCase):
def tearDown(self):
def list2reason(exc_list):
"""Converts test-result structure to str."""
if exc_list and exc_list[-1][0] is self:
return exc_list[-1][1]

if hasattr(self, '_feedErrorsToResult'):
# for Python 3.4 - 3.10
result = self.defaultTestResult()
self._feedErrorsToResult(result, self._outcome.errors)
result.skipped = self._outcome.skipped
else:
# for Python 3.11+
result = self._outcome.result

failureMsg = list2reason(result.failures)
errorMsg   = list2reason(result.errors)
skippedMsg = list2reason(result.skipped)

isFailure  = bool(failureMsg)
isError    = bool(errorMsg)
isSkipped  = bool(skippedMsg)

# Here, I want to add the result to a spreadsheet.
# For simplicity, I'll just print the result.
print()
if isFailure:
print('FAIL')
elif isError:
print('ERROR')
elif isSkipped:
print('SKIPPED')
else:
print('PASS')

def test_01_pass(self):
self.assertTrue(True)

def test_02_fail(self):
self.assertTrue(False)

def test_03_error(self):
raise ZeroDivisionError

def test_04_skip(self):
self.skipTest('')

@unittest.expectedFailure
def test_05_expectedFailure(self):
self.assertTrue(False)

@unittest.expectedFailure
def test_06_unexpectedSuccess(self):
self.assertTrue(True)

if __name__ == '__main__':
unittest.main()
Мне также удалось получить EXPECTED_FAILURE, изменив последний абзац в TearDown на это:

Код: Выделить всё

        expFailure    = self._outcome.expectedFailure
expFailureMsg = f'{expFailure[0].__name__}: {expFailure[1]}' if expFailure else None
isExpFailure  = bool(expFailureMsg)

# Here, I want to add the result to a spreadsheet.
# For simplicity, I'll just print the result.
print()
if isFailure:
print('FAIL')
elif isError:
print('ERROR')
elif isSkipped:
print('SKIPPED')
elif isSkipped:
print('SKIPPED')
elif isExpFailure:
print('EXPECTED_FAILURE')
else:
print('PASS')
Однако я ни в коем случае не могу получить информацию о UNEXPECTED_SUCCESS, поэтому мой код неправильно интерпретирует этот случай как PASS.Мои выводы:
  • Код: Выделить всё

    self._outcome.expecting_failure
    всегда имеет значение False
  • Код: Выделить всё

    self._outcome.success
    всегда имеет значение True
  • Код: Выделить всё

    self._outcome.result.unexpectedSuccesses
    всегда равно []
  • Код: Выделить всё

    self._outcome.result.wasSuccessful()
    возвращает общий результат выполнения теста, а не только текущего теста.
И под словом «всегда» я имею в виду всегда. Я не помню, чтобы видел что-то другое для какого-либо типа результата. Просматривая данные, хранящиеся в self._outcome , я не вижу способа получить нужную мне информацию.
Есть ли у кого-нибудь идеи? pytest лучше в этом отношении?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -execution
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»