Nano Hash - криптовалюты, майнинг, программирование

Множественные исключения и покрытие кода при модульном тестировании Python

Проблема:

Вот искусственный пример тестируемого кода:

from datetime import datetime

def f(s):
    try:
        date = s.split(":")[1]
        return datetime.strptime(date, "%Y%m%d")
    except (ValueError, IndexError) as e:
        # some code here
        raise

Вот набор тестов, которые у меня сейчас есть:

from datetime import datetime
import unittest

from test_module import f

class MyTestCase(unittest.TestCase):
    def test_valid_date(self):
        self.assertEqual(f("1:20130101"), datetime(2013, 1, 1))

    def test_invalid_date(self):
        self.assertRaises(ValueError, f, "1:invalid")

Тест пройден, и если я запущу покрытие с флагом --branch, я получу 100% покрытие строк и ветвей:

$ coverage run --branch -m unittest test
..
----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK
$ coverage report
Name            Stmts   Miss Branch BrPart  Cover
--------------------------------------------
test_module.py      7      0      0      0   100%
--------------------------------------------
TOTAL               7      0      0      0   100%

Однако обратите внимание, что тест в настоящее время исследует только два случая — когда нет выброшенного исключения и возникает ValueError исключение.

Вопрос:

Есть ли способ для coverage сообщить, что я не тестировал случай, когда IndexError поднимается?


  • У вас может быть другой блок, кроме блока для IndexError. Я думаю, что покрытие просто подсчитывает, какие строки были выполнены. 26.05.2016

Ответы:


1

Coverage.py может только измерять, какие пути выполнения (операторы или ветки) были запущены. У него нет средств для отслеживания того, какие значения были использованы, в том числе какие типы исключений были вызваны.

Как я вижу, ваши варианты:

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

  2. Не беспокойтесь о двух исключениях. Ваши тесты для этого кода, скорее всего, будут учитывать несколько различных входных данных, предназначенных для проверки различных пограничных случаев. Coverage.py не может помочь вам отличить их всех или убедиться, что вы написали достаточно случаев. Используйте другие критерии, чтобы решить, что вы написали достаточно тестовых примеров.

27.05.2016
  • Хорошо, большое спасибо. Удачи с вашим выступлением на PyCon! 27.05.2016

  • 2

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

    from datetime import datetime
    
    def f(s):
        try:
            date = s.split(":")[1]
            return datetime.strptime(date, "%Y%m%d")
        except ValueError as e:
            # some code here
            raise
        except IndexError as e:
            # some code
            raise
    

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

    26.05.2016
  • Это определенно вариант, но мое любопытство все еще вызывает вопрос, будет ли покрытие (или другой пакет) определять непроверенный путь выполнения без изменения тестируемого кода. Спасибо! 27.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..