Рубрики
Без рубрики

Введение к покрытию .py

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Coverage.py Является ли 3-й партийный инструмент для Python, который используется для измерения вашего кода покрытия. Это было первоначально создано NED Batchelder. Термин «покрытие» в кружках программирования обычно используется для описания эффективности ваших испытаний и насколько вашим кода на самом деле покрывается тестами. Вы можете использовать Coverage.py с Python 2.6 до текущей версии Python 3, а также с Pypy.

pip install coverage

Теперь, когда у нас есть Coverage.py установлен, нам нужен код, чтобы его использовать. Давайте создадим модуль, который мы позвоним MyMath.py Вот код:

def add(a, b):
    return a + b


def subtract(a, b):
    return a - b


def multiply(a, b):
    return a * b


def divide(numerator, denominator):
    return float(numerator) / denominator

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

# test_mymath.py
import mymath
import unittest

class TestAdd(unittest.TestCase):
    """
    Test the add function from the mymath library
    """

    def test_add_integers(self):
        """
        Test that the addition of two integers returns the correct total
        """
        result = mymath.add(1, 2)
        self.assertEqual(result, 3)

    def test_add_floats(self):
        """
        Test that the addition of two floats returns the correct result
        """
        result = mymath.add(10.5, 2)
        self.assertEqual(result, 12.5)

    def test_add_strings(self):
        """
        Test the addition of two strings returns the two string as one
        concatenated string
        """
        result = mymath.add('abc', 'def')
        self.assertEqual(result, 'abcdef')


if __name__ == '__main__':
    unittest.main()

Теперь, когда у нас есть все части, мы можем запустить Coverage.py, используя тест. Откройте терминал и перейдите к папке, которая содержит MyMath Модуль и тестовый код мы написали. Теперь мы можем позвонить в Coverage.py, как это:

coverage run test_mymath.py

Обратите внимание, что нам нужно позвонить Беги Чтобы получить Coverage.py, чтобы запустить модуль. Если ваш модуль принимает аргументы, вы можете пройти те, как вы обычно будете. Когда вы делаете это, вы увидите вывод теста, как если бы вы сами провели его. Вы также найдете новый файл в каталоге, который называется .coverage (Обратите внимание на период в начале). Чтобы получить информацию из этого файла, вам нужно будет запустить следующую команду:

coverage report -m

Выполнение этой команды приведет к следующему выходу:

Name             Stmts   Miss  Cover   Missing
----------------------------------------------
mymath.py            9      3    67%   9, 13, 17
test_mymath.py      14      0   100%
----------------------------------------------
TOTAL     

Флаг сообщает Coverage.py, который вы хотите, чтобы он включил Отсутствует столбец в выходе. Если вы опускаете Тогда вы получите только первые четыре колонны. Вот что вы видите здесь, является то, что охват управляет тестовым кодом и определил, что у меня есть только 67% модуля MyMath, охватываемых моим модульным тестом. «Пропал» колонна говорит мне, какие строки кода все еще нуждаются в покрытии. Если вы посмотрите на линии Coverage.py, вы быстро увидите, что мой тестовый код не проверяет вычесть , Умножьте или Разделить Функции.

Прежде чем мы попытаемся добавить больше тестового покрытия, давайте узнаем, как сделать Coverage.py создать отчет HTML. Для этого все, что вам нужно сделать, это запустить следующую команду:

coverage html

Эта команда создаст папку с именем HTMLCOV который содержит различные файлы. Перейдите к этой папке и попробуйте открыть index.html в вашем браузере выбора. На моей машине он загрузил такую страницу:

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

Этот скриншот четко показывает, какие части кода не были покрыты в нашем исходном тесте на единицу. Теперь, когда мы окончательно знаем, что отсутствует в нашем тестовом покрытии, давайте добавим тест на единицу для нашего вычесть Функция и посмотрите, как это меняет вещи!

Откройте свою копию test_mymath.py и добавьте следующий класс к нему:

class TestSubtract(unittest.TestCase):
    """
    Test the subtract function from the mymath library
    """

    def test_subtract_integers(self):
        """
        Test that subtracting integers returns the correct result
        """
        result = mymath.subtract(10, 8)
        self.assertEqual(result, 2)

Теперь нам нужно повторно запускать охват от обновленного теста. Все, что вам нужно сделать, это повторно запустить эту команду: Покрытие Run Test_Mymath.py Отказ Вывод покажет, что четыре теста прошли успешно. Теперь повторно запустите Охват HTML и снова откройте файл «index.html». Теперь вы должны увидеть то, что мы находимся на 78% охвате:

Это улучшение на 11%! Давайте пойдем вперед и добавьте простой тест для размножения и разделите функции и посмотреть, сможем ли мы достигать 100% покрытия!

class TestMultiply(unittest.TestCase):
    """
    Test the multiply function from the mymath library
    """

    def test_subtract_integers(self):
        """
        Test that multiplying integers returns the correct result
        """
        result = mymath.multiply(5, 50)
        self.assertEqual(result, 250)


class TestDivide(unittest.TestCase):
    """
    Test the divide function from the mymath library
    """

    def test_divide_by_zero(self):
        """
        Test that multiplying integers returns the correct result
        """
        with self.assertRaises(ZeroDivisionError):
            result = mymath.divide(8, 0)

Теперь вы можете повторно запустить те же команды, что и раньше, и перезагрузить файл «index.html». Когда вы делаете, вы должны увидеть что-то вроде следующего:

Как видите, мы получили полное тестовое покрытие! Конечно, полный охват в этом случае означает, что каждая функция осуществляется нашим тестовым набором. Проблема с этим в том, что у нас три раза больше тестов на функцию добавления против других, но Coverage.py не дает нам никаких данных об этом. Однако это даст нам хорошее представление о базовом охвате, даже если он не может сказать нам, если мы проверили все возможные аргументы перестановки для представителей.

Дополнительная информация

Я просто хотел упомянуть несколько других особенностей Coverage.py, не входя в много деталей. Во-первых, Coverage.py поддерживает файлы конфигурации. Формат файла конфигурации является вашим классическим файлом «.ini» с разделами, разграниченными тем фактом, что они окружены квадратными брендами (I.E. [my_section]). Вы можете добавить комментарии к файлу конфигурации, используя следующий # или; (точка с запятой).

Coverage.py Также позволяет указать, какие исходные файлы вы хотите, чтобы проанализировать через файл конфигурации, который мы упоминали ранее. После того, как у вас есть конфигурация настроить так, как вы хотите, чтобы вы можете запустить Coverage.py. Он также поддерживает коммутатор командной строки «-Source». Наконец, вы можете использовать переключатели «-Irude» и «-OMIT», чтобы включить список шаблонов имени файла или исключить их. Эти коммутаторы имеют соответствующие значения конфигурации, которые вы можете добавить в свой файл конфигурации.

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

Упаковка

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