Вопрос

Что такое покрытие кода и как ВЫ его измеряете?

Мне задали этот вопрос относительно нашего покрытия кода автоматизации тестирования.Похоже, что если не считать автоматизированных инструментов, то это скорее искусство, чем наука.Есть ли реальные примеры использования покрытия кода?

Это было полезно?

Решение

Покрытие кода - это измерение количества строк / блоков / дуг вашего кода во время выполнения автоматических тестов.

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

Наша команда использует Magellan - собственный набор инструментов для покрытия кода , Если вы магазин .NET, Visual Studio имеет встроенные инструменты для сбора покрытия кода. Вы также можете использовать некоторые пользовательские инструменты, например, описанные в этой статье .

Если вы работаете в магазине C ++, у Intel есть несколько инструменты , которые работают для Windows и Linux, хотя я ими не пользовался. Я также слышал, что есть инструмент gcov для GCC, но я ничего о нем не знаю и не могу дать вам ссылку.

Что касается того, как мы его используем - покрытие кода является одним из критериев выхода для каждого этапа. На самом деле у нас есть три метрики покрытия кода - покрытие из модульных тестов (от команды разработчиков), сценариев (от команды тестирования) и комбинированное покрытие.

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

Другие советы

Покрытие кода в основном проверяет, какая часть вашего кода покрыта тестами. Таким образом, если у вас 90% покрытия кода, это означает, что 10% кода не покрыто тестами. Я знаю, что вы можете подумать, что 90% кода покрыты, но вы должны смотреть под другим углом. Что мешает вам получить 100% покрытие кода?

Хороший пример будет таким:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Теперь в приведенном выше коде есть два пути / ветви. Если вы всегда нажимаете кнопку «ДА» ветвь, то вы не покрываете остальную часть, и это будет показано в результатах покрытия кода. Это хорошо, потому что теперь вы знаете, что не охватывается, и вы можете написать тест, чтобы охватить остальную часть. Если не было никакого покрытия кода, то вы просто сидите на бомбе замедленного действия, чтобы взорваться.

NCover - хороший инструмент для измерения покрытия кода.

Просто помните, что у вас есть "100% охват кода". не означает, что все проверено полностью - хотя это означает, что проверяется каждая строка кода, это не значит, что они проверяются в каждой (общей) ситуации.

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

По сути, 100% покрытие кода не означает, что ваш код идеален. Используйте это как руководство, чтобы написать более всесторонние (модульные) тесты.

В дополнение ко многим предыдущим ответам добавим несколько пунктов:

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

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

<Ол>
  • Охват условий: все булевы выражения должны оцениваться как true и false.
  • Охват решения: не только логические выражения, которые должны быть оценены для истинного и ложного значений один раз, но и для покрытия всего последующего тела if-elseif-else.
  • Loop Coverage: означает, что каждый возможный цикл был выполнен один раз, более одного раза и нулевое время. Кроме того, если у нас есть предположение о максимальном пределе, то, если это возможно, протестируйте максимальное предельное время и на единицу больше максимального предельного времени.
  • Охват входа и выхода. Проверьте все возможные вызовы и их возвращаемое значение.
  • Охват значения параметра (PVC). Проверить, проверены ли все возможные значения параметра. Например, строка может быть любой из этих обычно: а) ноль, б) пусто, в) пробел (пробел, табуляции, новая строка), г) допустимая строка, д) недопустимая строка, е) однобайтовая строка, г ) двухбайтовая строка. Неспособность проверить каждое возможное значение параметра может оставить ошибку. Тестирование только одного из них может привести к 100% охвату кода при покрытии каждой строки, но поскольку проверяется только один из семи вариантов, это означает, что охват значения параметра составляет только 14,2%.
  • Охват наследования. В случае объектно-ориентированного источника при возврате производного объекта, на который ссылается базовый класс, должно быть проверено покрытие для оценки, если возвращен родственный объект.
  • Примечание. При статическом анализе кода будет обнаружен какой-либо недоступный код или зависший код, т. е. код, не охватываемый каким-либо другим вызовом функции. А также другое статическое покрытие. Даже если статический анализ кода сообщает, что код покрыт на 100%, он не дает отчетов о вашем наборе тестирования, если проверено все возможное покрытие кода.

    Покрытие кода было хорошо объяснено в предыдущих ответах.Так что это скорее ответ на вторую часть вопроса.

    Мы использовали три инструмента для определения покрытия кода.

    1. JTest — собственный инструмент, созданный на базе JUnit.(Он также генерирует модульные тесты.)
    2. Кобертура — инструмент покрытия кода с открытым исходным кодом, который можно легко объединить с тестами JUnit для создания отчетов.
    3. Эмма - другой - этот мы использовали для несколько иной цели, чем модульное тестирование.Он использовался для создания отчетов о покрытии, когда конечные пользователи обращаются к веб-приложению.Это в сочетании с инструментами веб-тестирования (пример:Canoo) может предоставить вам очень полезные отчеты о покрытии, которые сообщают вам, какой объем кода покрывается при обычном использовании конечным пользователем.

    Мы используем эти инструменты, чтобы

    • Проверьте, что разработчики написали хорошие модульные тесты.
    • Убедитесь, что весь код просматривается во время тестирования «черного ящика».

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

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

    Для Perl есть отличный модуль Devel :: Cover , которым я регулярно пользуюсь мои модули.

    Если сборкой и установкой управляет Module :: Build, вы можете просто запустить ./ Build testcover , чтобы получить хороший HTML-сайт, который сообщает вам покрытие по каждой подпрограмме, строке и условию, с хорошим цвета, позволяющие легко увидеть, какой путь к коду не был пройден.

    В предыдущих ответах покрытие кода было хорошо объяснено. Я просто добавляю некоторые знания, связанные с инструментами, если вы работаете на платформах iOS и OSX , Xcode предоставляет возможность тестировать и отслеживать покрытие кода.

    Справочные ссылки:

    https: // разработчик .apple.com / библиотека / архив / документация / Разработчик / концептуальный / testing_with_xcode / глава / 07-code_coverage.html

    https://medium.com/zendesk-engineering/code -coverage-и-Xcode-6b2fb8756a51

    Обе полезные ссылки для изучения и изучения покрытия кода Xcode.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top