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


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

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

7 188

7 ответов:

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

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

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

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

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

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

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

хорошим примером будет это:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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