Python unittest: запустить тот же тест для списка значений, но рассматривать их как отдельные тесты - PullRequest
0 голосов
/ 19 октября 2018

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

Как запустить тот же тест для списка значенийчитать из файла, но сказать unittest обрабатывать каждую из этих проблем как отдельный тест , чтобы я мог точно определить все случаи неудачи / прохождения? (желательно без внешних библиотек)

КомуВо избежание явного указания test_solution_1, test_solution_2... test_solution_n, моей первоначальной мыслью было создание цикла for для каждого элемента списка и выполнение утверждений по одному:

class TestProblem(unittest.TestCase):
    def test_all(self):
        results = Counter()
        rng = 50
        for i in range(rng):
            p = Problem(matrix_index=i)  # generate instance of problem.
            p.solve()
            results[p.is_complete()] += 1  # log result of test.
            self.assertTrue(p.is_complete(), msg="Failed at %s" % str(i))
        # Now ensure all instances passed (useful when above assertion not included).
        self.assertEqual(results[True], rng, msg="SCORE: %s / %s" % (results[True], rng))

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

1 Ответ

0 голосов
/ 19 октября 2018

Используйте менеджер контекста subTest () , чтобы различать тесты внутри одного тела теста.(Python 3.4 +)

    def test_all(self):
        results = Counter()
        rng = 50
        for i in range(rng):
            with self.subTest(i=i):  # <----------------------
                p = Problem(matrix_index=i)  # generate instance of problem.
                p.solve()
                results[p.is_complete()] += 1  # log result of test.
                self.assertTrue(p.is_complete())
        self.assertEqual(results[True], rng, msg="SCORE: %s / %s" % (results[True], rng))

Результат от PyCharm:

PyCharm unittest subTest results

Вы можете увидеть отдельные результаты для каждого случая и увидеть всенеудачные случаи сразу.Обратите внимание, что он по-прежнему рассматривается как единый логический тест (« Ran 1 test »), что имеет смысл, поскольку при его тестировании выполняются те же функции.Каждый случай рассматривается как дополнительный тест.


Другие вопросы, которые следует учитывать:

  • Если вы используете более старую версию Python или хотите использовать другую библиотеку, вы можете посмотретьв ddt для добавления тестовых данных через декоратор @data(3, 4, 12, 23).
...