Как реализовать метод для получения и вывода результата теста
Что проверяют
Формулировка размытая, и сначала стоит уточнить: речь о результатах автотестов или о прикладной задаче вроде подсчёта баллов в опроснике. Чаще имеют в виду первое, и тогда проверяют, знаете ли вы, где тестовый фреймворк хранит итоги прогона и как достать их программно. Следом спрашивают, как отдать результаты в CI или в чат команды.
Как отвечать
В unittest итог прогона это объект TestResult:
- запуск с результатом:
result = unittest.TextTestRunner(verbosity=2).run(suite), гдеsuiteсобран черезunittest.defaultTestLoader.discover()илиloadTestsFromTestCase(). Если нужен именноunittest.main, передайтеexit=False, и результат окажется вprogram.result; - поля:
testsRun, спискиfailuresиerrorsиз пар «тест, трейсбек»,skipped,expectedFailures, методwasSuccessful(); - своя обработка: наследник
unittest.TextTestResultс переопределённымиaddSuccess,addFailure(test, err)иaddErrorпередаётся раннеру черезresultclass.
В pytest, который стоит в большинстве проектов, итог снаружи дают код возврата pytest.main([...]) и отчёт --junitxml=report.xml, который понимают GitLab CI, Jenkins и другие системы. Результат каждого теста изнутри достают хуком в conftest.py: pytest_runtest_makereport объявляют обёрткой через @pytest.hookimpl(wrapper=True), получают отчёт из yield и читают report.when, report.outcome, report.duration, report.longreprtext. Свою сводку в конец вывода добавляют хуком pytest_terminal_summary.
Покажите, что получение и вывод разделены: метод собирает данные в структуру, а печать, JSON или отправка в мессенджер живут отдельным слоем.
Где спотыкаются
Кладут тестируемую функцию методом внутрь TestCase. Так проверяется код теста, а не код приложения, и на ревью это выглядит странно.
Путают failures и errors. Первое это проваленная проверка, второе исключение в самом тесте или в setUp, и в отчёте их показывают раздельно.
Не фильтруют по report.when. Хук срабатывает трижды, на setup, call и teardown: без фильтра один тест посчитается три раза, а если смотреть только на call, упавшая фикстура вообще пропадёт из отчёта.