В чем разница между тремя методами анализа покрытия кода?

На этой странице сонара в основном перечислены различные методы, используемые разными инструменты анализа покрытия кода:

  1. Инструментарий исходного кода (используется Clover)
  2. Автономная обработка байтового кода (используется Cobertura)
  3. Оперативная обработка байтового кода (используется Jacoco)

Что это за три метода, какой из них наиболее эффективен и почему? Если ответ на вопрос об эффективности - «зависит от обстоятельств», тогда объясните, почему?


person Geek    schedule 06.03.2013    source источник


Ответы (2)


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

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

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

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

В зависимости от вашего определения слова «эффективный» выберите тот, который вам больше всего нравится. Я не думаю, что вы получите огромные различия. Все они выполняют свою работу, и общая картина будет одинаковой, независимо от используемого метода.

person JB Nizet    schedule 06.03.2013
comment
Думаю, вам нужна была ссылка на документацию Clover? - person sharakan; 07.03.2013
comment
да. Забыл добавить ссылку. Готово сейчас. Спасибо, что заметили проблему. - person JB Nizet; 07.03.2013
comment
На данный момент cobertura поддерживает как Java 7, так и Java 8. - person Krzysztof Krasoń; 18.02.2016
comment
Но не использует инструменты, это означает, что у нас есть сборка, которая включает в себя распечатки инструментов и другую сборку для работы (без печати). Так что кто-то всегда может сказать, что тест проводился на другой сборке, верно? - person ransh; 01.08.2017

В целом эффект на покрытие такой же.

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

Представьте, что у меня есть два вложенных оператора if (или, что эквивалентно, if (a && b) ... *) в одной строке. Инструментальный инструмент исходного кода может их видеть и предоставлять информацию о покрытии для нескольких ветвей внутри if в строке исходного кода; он может сообщать о блоках на основе строк и столбцов. Инструментальный инструмент байт-кода видит только одну строку, обернутую вокруг условий. Сообщает ли он о строке как о "покрытой", если условие a выполняется, но ложно?

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

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

Инструментальный инструмент исходного кода также может обеспечить более быстрое выполнение тестов, поскольку у него есть компилятор, помогающий оптимизировать инструментированный код. В частности, зонд, вставленный в цикл бинарным инструментом, может быть скомпилирован внутри цикла JIT-компилятором. Хороший компилятор Java увидит, что инструментарий выдает результат, инвариантный к циклу, и выведет инструментарий из цикла. (Компилятор JIT, возможно, тоже может это сделать; вопрос в том, действительно ли они это делают).

person Ira Baxter    schedule 06.03.2013
comment
На самом деле причина того, что такие инструменты, как Cobertura и JaCoCo, не отображают информацию о внутреннем покрытии, заключается просто в том, что разработчики решили не реализовывать их. В моем собственном инструменте оперативного управления байт-кодом (JMockit Coverage) этот реализован, и отдельные сегменты линии (например, в if (a && b)) показаны как таковые в покрытии отчет. - person Rogério; 02.09.2014
comment
Таковы все инструменты: разработчики решили не реализовывать (некоторую функцию). Хорошо, что у тебя появилось больше энтузиазма. Как отличить части линии? Я не думал, что файлы классов содержат более подробную информацию. - person Ira Baxter; 02.09.2014
comment
На уровне байт-кода инструкции перехода являются основой для разделения нескольких исполняемых сегментов в строке кода. Каждая инструкция перехода имеет целевую инструкцию, которая может находиться или не находиться в одной строке; эта информация предоставляется библиотекой ASM, которая используется для манипулирования байт-кодом. Для каждой строки кода сохраняется список инструкций перехода и их целей, который позже становится доступным для генератора отчетов HTML, который затем анализирует каждую строку кода source, сопоставляя ветви байт-кода. к отдельным сегментам линии. - person Rogério; 03.09.2014
comment
@ Rogério: Должно быть, это было забавно реализовать. Как это может работать перед лицом оптимизации / упрощения кода и движения кода? (Другой пользователь сообщил, что проверка условия для x == null игнорируется компилятором, если он знает, что x! = Null истинно, когда он оценивает условие x == null. Как вы можете надежно сопоставить вещи?) - person Ira Baxter; 02.05.2015
comment
Я не сталкивался с такими трудностями просто потому, что на уровне байт-кода не было сделано никаких оптимизаций / упрощений; Компиляторы Java генерируют стандартизованный и неоптимизированный байт-код (с небольшими различиями между javac и компилятором Eclipse), и это (плюс исходный код) - все, с чем может работать инструмент покрытия. Оптимизация JIT не мешает. Я думаю, что другой пользователь ошибается; если в источнике есть условие x == null, оно всегда будет в байт-коде. - person Rogério; 04.05.2015
comment
Но не использует инструменты, это означает, что у нас есть сборка, которая включает в себя распечатки инструментов и другую сборку для работы (без печати). Так что кто-то всегда может сказать, что тест проводился на другой сборке, верно? - person ransh; 01.08.2017
comment
@ransh: Да, они могут сказать это. Хорошо спроектированная инструментария не влияет на функциональность программы, если в программе нет чего-то явного для проверки наличия этого инструментария, чтобы вызвать какое-то изменение поведения, и можно быть достаточно уверенным в процессе совместной разработки, что такие проверки не существуют. кроме причудливых способов (например, проверки размера программы, который изменится из-за добавленного объема кода от инструментовки). ... - person Ira Baxter; 03.08.2017
comment
@ransh: ... Инструментарий также влияет на производительность (для наших инструментов на Java, добавляя около 10-15% накладных расходов), и это также может повлиять на функциональность. Большинство приложений имеют большой запас производительности, поэтому на практике это не представляет большой проблемы. Итак, можно сказать, что тестировалось что-то другое, кроме неинструментированной сборки, но практический эффект такой, как если бы вы собрали данные о тестовом покрытии для производственной сборки. Если вы настаиваете и не возражаете против накладных расходов, вы действительно можете развернуть инструментальный код в производственной среде :-) - person Ira Baxter; 03.08.2017