Какой процент функциональности приложения должен быть покрыт модульными тестами

Обновлено: 12.08.2022

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

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

Что такое покрытие кода?

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

Теперь добавление кода инструментирования приводит к увеличению времени выполнения и длины кода. Но увеличение более чем оправдано в свете информации, которую тестировщик получает из-за лишнего кода.

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

Зачем выполнять покрытие кода?

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

  • Достаточно ли тестов в наборе модульных тестов?
  • Нужно ли добавить дополнительные тесты?

Покрытие кода отвечает на эти вопросы.

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

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

Уровни покрытия кода

  • Покрытие ветвей: используется для обеспечения выполнения каждой ветви в процессе принятия решений. Допустим, тестер включает резервную копию для кросс-браузерной совместимости, используя условный оператор If…Else или оператор Do…While в коде. Покрытие ответвлений гарантирует, что все ответвления (If, Else, Do, While) будут протестированы с соответствующими входными данными.
  • Охват функций: это гарантирует, что все необходимые функции протестированы. Он также включает тестирование функций с различными входными параметрами для проверки логики в функциях.
  • Охват операторов. При этом код создается таким образом, что каждый исполняемый оператор в исходном коде выполняется хотя бы один раз. Это включает крайние или граничные случаи.
  • Покрытие циклов. Это гарантирует, что каждый цикл в исходном коде будет выполнен хотя бы один раз. Некоторые циклы могут выполняться на основе результатов, полученных во время выполнения. Нужно быть осторожным при тестировании таких циклов, чтобы полностью укрепить код.
  • Покрытие условий: показывает, как оцениваются переменные в условных операторах. Это помогает обеспечить надлежащее покрытие потока управления.
  • Покрытие с конечным автоматом. Это работает на основе частоты посещений из статических состояний и других транзакций. Покрытие конечного автомата — это наиболее сложная форма покрытия кода, поскольку оно зависит от конструкции структуры программного обеспечения.

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

Типы инструментов

  • Инструментирование кода. Исходный код компилируется после вставки операторов инструментирования. Компиляцию лучше всего выполнять с помощью обычного тулчейна. Успешная компиляция создает инструментальную сборку.
  • Инструментирование во время выполнения. Инструментальные операторы собирают информацию из среды выполнения, т. е. во время выполнения кода.
  • Инструментация промежуточного кода. Инструментальный класс создается путем добавления байт-кодов в скомпилированные файлы классов.

Преимущества покрытия кода

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

Теперь давайте рассмотрим тестовое покрытие.

Что такое тестовое покрытие?

В отличие от покрытия кода, покрытие тестами — это метод тестирования черного ящика. Он отслеживает количество выполненных тестов. Тестовые наборы написаны для обеспечения максимального охвата требований, изложенных в нескольких документах — FRS (спецификация функциональных требований), SRS (спецификация требований к программному обеспечению), URS (спецификация требований пользователя) и т. д.

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

Как выполнить тестовое покрытие?

Покрытие тестами также можно оценить с помощью различных типов тестирования. Однако тип тестов, которые необходимо выполнить, зависит от бизнес-приоритетов группы тестирования и стоящей за ними организации. Например, ориентированные на пользователя веб-приложения отдают предпочтение тестам UI/UX, а не функциональным тестам. И наоборот, финансовые приложения будут отдавать предпочтение тестированию удобства использования и безопасности по сравнению со всеми другими тестами.

Если вы хотите проверить свой веб-сайт на совместимость с разными браузерами или ошибки UI/UX, посетите эту страницу.

Некоторые механизмы покрытия тестами:

  • Модульное тестирование. Выполняется на уровне модуля или модуля. Ошибки на этом уровне сильно отличаются от проблем, возникающих на этапе интеграции. : функции или функции проверяются на соответствие требованиям, указанным в документах Спецификации функциональных требований (FRS).
  • Приемочное тестирование: определяет, подходит ли продукт для выпуска для использования покупателем. На этом этапе разработчики должны будут получить одобрение от тестировщиков и малого и среднего бизнеса, чтобы перенести изменения кода из промежуточной стадии в производственную.
  • Интеграционное тестирование. Также называется системным тестированием, поскольку тестирование выполняется на системном уровне. Эти тесты выполняются после интеграции всех программных модулей.
  • Охват функций. Тестовые наборы разрабатываются для максимального охвата функций продукта. Например, чтобы протестировать приложение для набора номера телефона, тестер должен убедиться, что набираемый номер имеет правильную длину. Если номер американский, он должен состоять из 10 цифр. В противном случае должна произойти ошибка. Все обязательные и дополнительные функции должны быть протестированы в соответствии с приоритетами, установленными командой разработчиков.
  • Покрытие рисков. В каждом документе с требованиями к продукту упоминаются риски, связанные с проектом, а также способы их снижения. Они рассматриваются на этом этапе тестового покрытия. Однако определенные риски, такие как изменения рыночных условий, не могут быть предсказаны или обработаны на этом этапе. Например, при разработке бизнес-сайта необходимо настроить серверную инфраструктуру для обеспечения высокоскоростного доступа к страницам. В зависимости от места, откуда осуществляется доступ к веб-сайту, для загрузки веб-сайта необходимо выбрать ближайший сервер. Если нет, пользователь получает низкую скорость, и его опыт становится ниже номинала. Это необходимо проверить.
    • Совет. Хотите оценить эффективность своего веб-сайта из другой части мира? Узнайте, как протестировать свои веб-сайты из разных стран или местоположений.

    Преимущества тестового покрытия

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

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

    С AWS запуск инстансов EC2 стал простой задачей, но до конечного результата нужно пройти еще много шагов. Узнайте, как успешно .

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

    Устранение сбоев в развертывании AWS с помощью стратегии аварийного восстановления. Узнайте, как выбрать правильное восстановление .

    На первый взгляд, разница между микроприложениями и микросервисами просто связана с проблемами внешнего интерфейса и серверной части. Но .

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

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

    Kubernetes доступен с открытым исходным кодом, а также от поставщиков ИТ. Сложный инструмент, он позволяет оркестровать контейнеры в любом масштабе. Какой.

    Docker может быть авторитетным выбором для контейнеров, но с учетом того, как меняется рынок, это может быть не всегда. Здесь.

    Пользователи Service Mesh, включая T-Mobile и Constant Contact, развернули сетевую платформу приложений Solo.io, чтобы справиться с .

    Ключом к коду без ошибок является знание наиболее распространенных типов ошибок во время выполнения в Java, а также знание того, как их .

    Не понимаете, почему ваш Java-код не компилируется? Вот 10 наиболее часто встречающихся ошибок компиляции Java, а также исправления .

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

    Считаете, что готовы к сертификационному экзамену AWS Certified Solutions Architect? Проверьте свои знания, ответив на эти 12 вопросов и.

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

    Amazon хотела бы укрепить свое глобальное присутствие, но гигант электронной коммерции сегодня сталкивается с препятствиями и проблемами, которых у него не было.

    С AWS запуск инстансов EC2 стал простой задачей, но до конечного результата нужно пройти еще много шагов. Узнайте, как успешно .

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

    Устранение сбоев в развертывании AWS с помощью стратегии аварийного восстановления. Узнайте, как выбрать правильное восстановление .

    На первый взгляд, разница между микроприложениями и микросервисами просто связана с проблемами внешнего интерфейса и серверной части. Но .

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

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

    Kubernetes доступен с открытым исходным кодом, а также от поставщиков ИТ. Сложный инструмент, он позволяет оркестровать контейнеры в любом масштабе. Какой.

    Docker может быть авторитетным выбором для контейнеров, но с учетом того, как меняется рынок, это может быть не всегда. Здесь.

    Пользователи Service Mesh, включая T-Mobile и Constant Contact, развернули сетевую платформу приложений Solo.io, чтобы справиться с .

    Ключом к коду без ошибок является знание наиболее распространенных типов ошибок во время выполнения в Java, а также знание того, как их .

    Не понимаете, почему ваш Java-код не компилируется? Вот 10 наиболее часто встречающихся ошибок компиляции Java, а также исправления .

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

    Считаете, что готовы к сертификационному экзамену AWS Certified Solutions Architect? Проверьте свои знания, ответив на эти 12 вопросов и.

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

    Amazon хотела бы укрепить свое глобальное присутствие, но гигант электронной коммерции сегодня сталкивается с препятствиями и проблемами, которых у него не было.

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

    Мы живем в 21 веке, и наверняка должен быть лучший способ узнать, работает ли ваш код, чем просто предположить, что код работает. Кроме того, что произойдет, если вы измените часть кода. Откуда вы знаете, что ничего не сломали. ДОЛЖЕН БЫТЬ ЛУЧШИЙ СПОСОБ! Это одна из основных причин, почему модульное тестирование так ценно и важно. Например, на моем канале Youtube я рассказываю о различных структурах данных и о том, как их реализовать в Python. Хотя вы могли бы просто поверить мне, что код, который я пишу, работает: я пишу и запускаю модульные тесты в конце каждого из моих видео, чтобы показать, что код действительно делает то, что я думаю. С технической точки зрения модульный тест можно описать как метод тестирования программного обеспечения, который проверяет функциональность небольшого модуля или фрагмента кода (обычно это метод или функция). Модульное тестирование стало популярным благодаря таким методологиям, как Agile, где разработка через тестирование является очень важным методом разработки.Идея заключается в том, что вы пишете модульные тесты до того, как на самом деле напишете свой код, который будет тестироваться этими модульными тестами.

    Теперь, когда вы знаете, почему мы используем модульные тесты, вы можете спросить себя, как вы пишете и запускаете модульные тесты? Например, предположим, что у меня есть какой-то код (это код, который я буду использовать в своем следующем видео об удалении очередей):


    Чтобы написать свой первый файл модульного теста, вам нужно сделать следующее:

    • импортируйте библиотеку unittest, встроенную в python3
    • импортируйте библиотеку sys, чтобы вы могли изменить свои пути, чтобы импортировать файлы, которые вы хотите протестировать, а также импортировать классы/функции, которые вы хотите протестировать (возможно, вам это не нужно, это было для меня). Ниже приведен пример файла модульного теста для проверки некоторых методов в моем классе удаления из очереди. Обратите внимание, что в моей структуре каталогов файлов у меня есть отдельный тестовый файл для каждого из моих классов, которые я хочу протестировать. Это помогает с удобством сопровождения и модульностью (если я изменяю что-то в классе Dequeue, мне просто нужно изменить файл модульного теста Dequeue).


    Вы заметите несколько вещей. Во-первых, файл модульного теста — это, по сути, класс, в котором каждый метод является модульным тестом. Обычное соглашение об именовании классов заключается в написании «Test» вместе с именем вашего класса (в случае Pascal). Кроме того, класс принимает один параметр — unittest.TestCase (вы можете прочитать документацию, но все, что было до этого момента, по сути является шаблоном). Теперь самое интересное. Вы создаете модульные тесты, создавая методы в своем классе. В соответствии с соглашением об именах вы обычно начинаете имя каждого метода со слова «тест», а затем описываете, что делает тест, например, «test_is_empty». Если у вас возникли проблемы с придумыванием имен для вашего метода, большинство имен модульных тестов обычно обозначают какое-то действие (например, глаголы). Как и в любом другом методе Python, первым параметром является «я», и вы можете добавить дополнительные параметры, если хотите использовать их в своем методе.

    Теперь с реальными модульными тестами. Модульные тесты работают так, что каждый тест выполняется независимо друг от друга. Я говорю о том, что переменные данные не могут быть отправлены или переданы из одного модульного теста в другой (без области видимости переменных). В библиотеке юнит-тестирования есть пара встроенных функций, о которых вы должны знать. Их много, в зависимости от того, чего вы пытаетесь достичь с помощью модульного теста, который можно найти в официальной документации, но вот некоторые из них, которые помогут вам начать работу.

    Метод setUp() – это метод, который будет вызываться каждый раз перед выполнением модульных тестов. Например, в моем файле модульного теста я создаю свою очередь в setUp(), и это означает, что я могу получить доступ к этой очереди в каждом из моих модульных тестов. Удаление из очереди в каждом из модульных тестов будет отличаться друг от друга, поэтому мне не нужно беспокоиться о том, что два модульных теста ссылаются на один и тот же объект. Метод tearDown() работает наоборот. Вместо выполнения фрагмента кода перед каждым модульным тестом код в tearDown() выполняется после выполнения каждого модульного теста. Я видел, как кто-то использует это для очистки мусора или управления памятью.

    Теперь давайте поговорим о том, как компилятор запускает эти модульные тесты. Как я уже говорил, модульное тестирование ОБЫЧНО должно тестировать только один метод/функцию, пару строк кода или конкретную условную ветвь. В моем примере я иногда проверяю два метода, потому что я сначала выполняю операцию, такую ​​как add_first() или remove_last(), а затем использую peek(), чтобы увидеть, какое значение есть (просто используйте свое суждение).

    После завершения операции вы используете оператор утверждения. Их много, и вы можете узнать обо всех здесь, но я расскажу о паре. Self.assertEqual() принимает два параметра и возвращает True, если оба параметра имеют одинаковое значение, и False в противном случае. Иногда вы можете захотеть протестировать свой код, чтобы увидеть, возникает ли определенная ошибка при тестировании определенных пограничных случаев. Ниже приведен пример того, как вы могли бы создать модульный тест для проверки такой ситуации. Обычно для модульных тестов следует использовать только один оператор утверждения, поскольку предполагается, что каждый модульный тест проверяет только одну вещь. Это скорее эмпирическое правило, а не жесткое правило.


    Итак, после того, как вы создали множество модульных тестов, как вы их запускаете? Как и любой другой файл Python, вы можете просто ввести в своем терминале «python name_test_file.py». Когда вы это сделаете, вы увидите пару вещей.


    Не волнуйтесь, я знаю, что это выглядит много, но давайте разберемся.После того, как вы запустите файл, вы увидите строку, содержащую смесь точек, буквы F и буквы E (если все одинаковые, не паникуйте, это круто). По сути, эти символы говорят вам, что произошло, когда ваши модульные тесты были запущены. Точка означает, что ваш модульный тест прошел успешно, F означает, что ваш модульный тест не пройден, а E означает, что ваш модульный тест столкнулся с ошибкой. Они перечислены в том порядке, в котором модульные тесты написаны в вашем файле Python. Затем каждый модульный тест, который либо не прошел, либо столкнулся с ошибкой, будет отображать выходные данные и то, что произошло. Вы либо получите Assertion Error, что означает, что ваш модульный тест был выполнен и не прошел, либо другую ошибку, означающую, что ваша программа столкнулась с реальной ошибкой. В конце файла вы можете увидеть общее количество выполненных модульных тестов, сколько из них не удалось и сколько из них было успешно выполнено. Всякий раз, когда я пишу модульный тест, я всегда начинаю с неудачного модульного теста. Таким образом, вы будете знать, что код, который вы написали для того, чтобы этот неудачный модульный тест прошел, был из вашего кода, а не из чего-то другого.

    Как именно Python узнает, какие модульные тесты проходят? Компилятор запустит каждый метод в файле модульного теста. Если в каком-либо методе есть операторы assert, которые возвращают False, тогда этот модульный тест будет отображать F. Если компилятор столкнется с ошибкой при запуске метода, он отобразит E, а модульный тест будет отображаться в виде точки, если он проходит.

    Модульные тесты — это круто, потому что они помогают мне быть честным в том, что мой код работает. Теперь, если я когда-нибудь захочу реорганизовать один из моих методов в своем классе, я могу запустить те же модульные тесты, чтобы убедиться, что любой код, который я изменил, все еще работает. Вы даже можете настроить автоматическое модульное тестирование на Github, поэтому при слиянии или коммите модульные тесты будут запускаться автоматически, и если какой-либо из них даст сбой, кто-то будет немедленно предупрежден об этом. Это помогает убедиться, что когда добавляются новые функции или обновляются старые, другая функция непреднамеренно нарушается. Это может показаться большой работой, но в долгосрочной перспективе она окупится в 10 раз за сэкономленное время.

    Итак, мы закончили разговор о модульных тестах, о том, что они собой представляют, как их реализовать в Python и почему они важны. Что, черт возьми, такое покрытие кода? Покрытие кода в основном показывает, какая часть вашего кода фактически используется вашими модульными тестами. Запуск отчета о покрытии кода помогает показать, какой код не используется, что поможет вам написать больше модульных тестов. Покрытие кода также может показать, какие ветви условной логики не охватываются. Покрытие кода рассчитывается для файла на основе УСПЕШНО пройденных модульных тестов. После того, как все модульные тесты будут выполнены, вы сможете увидеть либо в своем браузере точные строки в вашем коде, которые выполняются, либо прямо в вашем терминале.

    Спасибо, что прочитали

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

    Читайте также: