Измерение покрытия кода в Delphi - PullRequest
24 голосов
/ 10 февраля 2009

Есть ли способ измерить покрытие кода с помощью DUnit? Или есть бесплатные инструменты для этого? Что вы используете для этого? Какой охват кода вы обычно используете?

Джим Маккит: Спасибо за подробный ответ. Я говорю о модульном тестировании в смысле подхода TDD, а не только о модульных тестах после сбоя. Меня интересует покрытие кода, которого я могу достичь с помощью некоторых базовых предварительно написанных модульных тестов.

Ответы [ 6 ]

24 голосов
/ 25 июня 2010

Я только что создал новый проект с открытым исходным кодом в Google Code с помощью базового инструмента покрытия кода для Delphi 2010. https://sourceforge.net/projects/delphicodecoverage/

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

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

Обновление: Начиная с версии 0.3 Delphi Code Coverage вы можете создавать отчеты XML, совместимые с плагином Hudson EMMA, для отображения трендов покрытия кода в пределах Hudson .

Обновление: Версия 0.5 содержит исправления ошибок, улучшенную конфигурируемость и очищенные отчеты

Обновление: Версия 1.0 обеспечивает поддержку вывода emma, покрытие классов и методов и покрытие DLL и BPL

11 голосов
/ 10 февраля 2009

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

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

7 голосов
/ 10 февраля 2009

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

Теперь устаревший код с другой стороны - это отдельная история. Устаревший код - это код, который не используется. Скорее всего, вам не нужен инструмент, чтобы сказать вам это для большей части вашего кода, просто ищите маленькие синие точки после компиляции в Delphi. Все без синей точки устарело. Обычно, если код не используется, его следует удалить. Так что это будет 100% покрытие кода.

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

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

Полагаю, я действительно не ответил на ваш вопрос о DUnit и Code Coverage, но, думаю, я оставил вам больше вопросов, чем вы начали. Какой вид покрытия кода вы ищете?

ОБНОВЛЕНИЕ: Если вы используете подход TDD, то никакой код не будет написан, пока вы не напишите для него тест, поэтому по своей природе у вас есть 100 тестовых покрытий. Конечно, только то, что каждый метод выполняется с помощью теста, не означает, что применяется весь диапазон его поведения. SmartInspect предоставляет действительно простой метод для определения, какие методы вызываются вместе с синхронизацией и т. Д. Он немного меньше, чем AQTime, но не бесплатный. Еще немного поработав с вашей стороны, вы можете добавить инструментарий для измерения каждого пути кода (ветви операторов if и т. Д.). Конечно, вы можете просто добавить свою собственную регистрацию в ваши методы, чтобы получить отчет о покрытии, и это бесплатно (хорошо, ожидайте своего времени, которое, вероятно, стоит больше чем инструменты). Если вы используете JEDI Debug, вы также можете получить стек вызовов.

TDD действительно нельзя легко применить задним числом к ​​существующему коду без большого количества рефакторинга. Хотя более новые интегрированные среды разработки Delphi имеют возможность создавать заглушки для модульных тестов для каждого открытого метода, что дает вам 100% охват ваших открытых методов. То, что вы вставите в эти заглушки, определяет, насколько эффективно это покрытие.

5 голосов
/ 10 февраля 2009

Я использую Discover для Delphi , и он выполняет свою работу, для модульного тестирования с помощью DUnit и функционального тестирования с TestComplete.

Discover можно настроить для запуска из командной строки для автоматизации. Как в:

Discover.exe Project.dpr -s -c -m
2 голосов
/ 11 февраля 2009

Discover прекрасно работает для меня. Это вряд ли замедляет ваше приложение, в отличие от AQTime. Конечно, это может и не быть проблемой для вас. Я думаю, что последние версии AQTime работают лучше в этом отношении.

1 голос
/ 05 сентября 2013

Я использую Discover "в течение многих лет, отлично работал до BDS2006 включительно (которая была последней версией Delphi до XE *, которую я использовал и все еще использую), но в ее текущем состоянии с открытым исходным кодом неясно, как сделать он работает с версиями Delphi для XE *. Стыдно, потому что мне понравился этот инструмент, быстрый и удобный почти во всех отношениях. Так что теперь я перехожу к покрытию delphi-code ...

...