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

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

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

7 ответов


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

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

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

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

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

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


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

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

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

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

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


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

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

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


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

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

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

  1. покрытие условий: все логические выражения для оценки для истинного и ложного.
  2. покрытие решений: не только логические выражения, которые будут оцениваться для true и false один раз, но и для покрытия всего последующего тела if-elseif-else.
  3. покрытие цикла: означает, что каждый возможный цикл был выполнен один раз, более одного раза и нулевое время. Кроме того, если у нас есть предположение о максимальном пределе, то, если это возможно, проверьте максимальные предельные времена и, один больше, чем максимальные предельные времена.
  4. охват входа и выхода: тест для всего возможного звонка и своего возвращения значение.
  5. покрытие значений параметров (ПВХ). Чтобы проверить, проверяются ли все возможные значения параметра. Например, строка может быть любой из них: a) null, b) empty, c) whitespace (пробел, вкладки, новая строка), d) valid string, e) invalid string, f) single-byte string, g) double-byte string. Отказ проверить каждое возможное значение параметра может оставить ошибку. Тестирование только одного из них может привести к 100% охвату кода, поскольку каждая строка покрыта, но только один из семи вариантов испытано, значит, только 14.2% охвата значения параметра.
  6. покрытие наследования: в случае объектно-ориентированного источника при возврате производного объекта, упомянутого базовым классом, покрытие для оценки, если возвращается объект sibling, должно быть протестировано.

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


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

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

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

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

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

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

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


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

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