Как инструменты покрытия кода работают на разных языках? - PullRequest
8 голосов
/ 18 января 2009

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

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

  • Python имеет sys.settrace, чтобы напрямую сказать, какие строки выполняются
  • Clover (для Java) использует собственный компилятор и добавляет метаданные отладки (во всяком случае, когда я в последний раз использовал его)
  • Эмма (для Java) имеет ClassLoader, который перезаписывает байт-код на лету
  • COVER (для Lisp) имеет аннотированный проход для инструмента с кодом

Меня интересует реализация покрытия кода для разных языков:

  1. Каковы основные подходы к охвату C0 , где вы можете отслеживать, какие строки кода были выполнены? Я уже упоминал о внутреннем самоанализе виртуальной машины и о статическом и динамическом инструментарии кода - есть ли другие методы?

  2. Получение более просвещенных данных о покрытии, таких как C1 или C2 , кажется не зависящим от языка заданием по сравнению с C0. Попахивает ли большая карта Карно манипуляцией мне; Есть ли лучшие практики о том, как на самом деле это сделать? Играют ли более современные логические техники, такие как нечеткость , роль?

  3. Одним из аспектов пропуска тестов, который часто упускается из виду, является отображение результатов обратно программисту, что становится все труднее с данными C1 и C2. Честно говоря, хотя они выполняют работу для C0, я не в восторге от большинства интерфейсов тестового покрытия; какие новые и интуитивно понятные интерфейсы вы видели для данных покрытия?

Ответы [ 3 ]

5 голосов
/ 21 января 2009

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

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

Другая причина, по которой я говорю, что C1 проще, заключается в том, что она имеет дело с синтаксическими сущностями, а не с лексическими сущностями: как бы вы работали:

if
c > 1 && c
< 10
then
blabla
end

Ну, просто мысль.

Что касается C2, я никогда не видел, чтобы это делалось на практике. Причина в том, что вы можете получить экспоненциальный взрыв:

if c1 then * else * end
if c2 then * else * end
...
if cn then * else * end

Для n строк кода вам потребуется 2 ^ n тестов. Кроме того, что вы делаете для петель? Как правило, вы абстрагируете их как простые операторы if (т.е. для каждого цикла, который вы проверяете, его тело было выполнено 0 раз для одного теста и, по крайней мере, один раз в другом тесте).

Я считаю, что выборка ПК является особенно ужасным способом выполнения покрытия кода, потому что вы можете пропустить некоторые операторы, потому что они выполняются слишком быстро: D То же самое касается нечеткой логики, которая используется для рассуждений о приближениях; обычно вы хотите, чтобы охват вашего кода был детерминированным.

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

Кроме того, ваш вопрос иногда не очень ясен: хотите ли вы, чтобы методы обеспечивали лучшее покрытие кода, или вас интересует только реализация инструментов покрытия кода?

0 голосов
/ 14 июня 2009

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

Техническая статья найдена здесь: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf объясняет, как это можно сделать в целом.

Моя компания, Semantic Designs, предлагает большой набор инструментов для тестирования. которые обеспечивают то, что называется покрытием C1 выше (например, «покрытие филиала») так что да это обычно делается), для разных языков (C, C ++, C #, Java, COBOL, PHP, все в нескольких диалекты). См. Www.semdesigns.com/Products/TestCoverage/index.html

0 голосов
/ 18 января 2009

В .NET предпочтительным способом является использование .NET Profiling API , который в основном предлагает несколько точек соединения в самой CLR.

...