Есть ли способ определить покрытие кода без запуска кода?

Я не прошу статического анализа кода, который предоставляется StyleCop или Fxcop. Оба имеют разные цели, и это хорошо работает. Я спрашиваю, есть ли способ найти покрытие кода вашего пользовательского элемента управления или субмодуля? Например, у вас есть приложение, которое использует вспомогательные классы в отдельной сборке. Чтобы обеспечить покрытие кода модульного тестирования, нам нужно запустить приложение и убедиться, что он использует NCover или аналогичный инструмент.

Мое требование - без запуска, есть ли возможность найти покрытие кода вспомогательных классов или подобных сборок?

6 ответов

Решение

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

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

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

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

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

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

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

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

В общем, ответ - нет. Это эквивалентно проблеме остановки, которая не вычислима.

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

"Анализ функционального покрытия при проверке ограниченной модели", Гросс, Д. Кюне, У. Дрехслер, Р. 2008

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

Если вы используете Visual Studio, вы можете сначала запустить «Анализ покрытия кода», а затем экспортировать результаты покрытия кода с помощью кнопки ниже (отмеченной зеленым цветом) в Visual Studio:

Позже вы можете импортировать файл результатов покрытия обратно в Visual Studio.

Coverity Static Analysis - это инструмент, который может выявить многие серьезные недостатки в программе. Он также может идентифицировать мертвый код и может использоваться для удовлетворения требований по тестированию, таких как D0178B, который требует, чтобы разработчики продемонстрировали возможность выполнения всего кода.

Другие вопросы по тегам