В целом эффект на покрытие такой же.
Инструментирование исходного кода может дать превосходные результаты отчетности просто потому, что инструментирование байтового кода не может различить какую-либо структуру в строках исходного кода, поскольку детализация блока кода регистрируется только в терминах строк исходного кода.
Представьте, что у меня есть два вложенных оператора if (или, что эквивалентно, if (a && b) ... *) в одной строке. Инструментальный инструмент исходного кода может их видеть и предоставлять информацию о покрытии для нескольких ветвей внутри if в строке исходного кода; он может сообщать о блоках на основе строк и столбцов. Инструментальный инструмент байт-кода видит только одну строку, обернутую вокруг условий. Сообщает ли он о строке как о "покрытой", если условие a выполняется, но ложно?
Вы можете возразить, что это редкое обстоятельство (и, вероятно, так оно и есть), и поэтому не очень полезно. Когда вы получаете фиктивное покрытие, за которым следует отказ поля, вы можете изменить свое мнение о полезности.
Есть хороший пример и объяснение того, как покрытие байтовым кодом делает получение правильного покрытия операторов switch чрезвычайно трудным.
Инструментальный инструмент исходного кода также может обеспечить более быстрое выполнение тестов, поскольку у него есть компилятор, помогающий оптимизировать инструментированный код. В частности, зонд, вставленный в цикл бинарным инструментом, может быть скомпилирован внутри цикла JIT-компилятором. Хороший компилятор Java увидит, что инструментарий выдает результат, инвариантный к циклу, и выведет инструментарий из цикла. (Компилятор JIT, возможно, тоже может это сделать; вопрос в том, действительно ли они это делают).
person
Ira Baxter
schedule
06.03.2013