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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Хорошим примером будет следующее:

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

Теперь в приведенном выше коде есть два пути/ветки. Если вы всегда нажимаете ветку "YES", вы не закрываете часть else, и она будет отображаться в результатах Code Coverage. Это хорошо, потому что теперь вы знаете, что то, что не охвачено, и вы можете написать тест, чтобы покрыть часть else. Если бы не было покрытия кода, вы просто сидели на бомбе замедленного действия, чтобы взорваться.

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

Ответ 3

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

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

В принципе, 100% -ное покрытие кода не означает, что ваш код идеально подходит. Используйте его в качестве руководства для написания более полных (единичных) тестов.

Ответ 4

Дополняя несколько пунктов ко многим из предыдущих ответов:

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

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

  1. Охват условий: все логические выражения должны оцениваться как истинные и ложные.
  2. Охват решения: не только логические выражения, которые должны быть вычислены для истинного и ложного значений один раз, но и для охвата всего последующего тела if-elseif-else.
  3. Охват цикла: означает, что каждый возможный цикл был выполнен один раз, более одного раза и нулевое время. Кроме того, если у нас есть предположение о максимальном пределе, тогда, если это возможно, протестируйте максимальное предельное время и на единицу больше максимального предельного времени.
  4. Охват входа и выхода: Проверьте все возможные вызовы и их возвращаемое значение.
  5. Значение параметра Покрытие (ПВХ). Проверить, проверены ли все возможные значения параметра. Например, строка может быть любой из этих обычно: а) ноль, б) пусто, в) пробел (пробел, табуляции, новая строка), г) допустимая строка, д) недопустимая строка, е) однобайтовая строка, г ) двухбайтовая строка. Неспособность проверить каждое возможное значение параметра может оставить ошибку. Тестирование только одного из них может привести к 100% -ному охвату кода при покрытии каждой строки, но, поскольку тестируется только один из семи вариантов, это означает, что охват значения параметра составляет только 14,2%.
  6. Охват наследования: в случае объектно-ориентированного источника при возврате производного объекта, на который ссылается базовый класс, должно быть проверено покрытие для оценки, если возвращен родственный объект.

Примечание: Статический анализ кода обнаружит, есть ли какой-либо недоступный код или зависший код, то есть код, не охваченный каким-либо другим вызовом функции. А также другое статическое покрытие. Даже если статический анализ кода сообщает, что код покрыт на 100%, он не дает отчетов о вашем наборе тестирования, если проверено все возможное покрытие кода.

Ответ 5

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

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

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

Мы используем эти инструменты для

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ссылки Ссылки:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

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