Устранение неполадок с покрытием кода
Средство анализа покрытия кода в Visual Studio выполняет сбор данных для машинных и управляемых сборок (.dll или файлы exe).Однако в некоторых случаях в окне результатов покрытия кода отображается ошибка, похожая на "Созданы пустые результаты: …." Существует несколько возможных причин, по которым это может произойти.Данный раздел предназначен для разрешения этой проблемы.
Отображаться должно следующее
При выборе команды Анализ покрытия кода в меню Тест, а также если построение и тесты были пройдены успешно, должен отобразиться список результатов в окне покрытия кода.Для просмотра сведений элементы можно развернуть.
Дополнительные сведения см. в разделе Использование покрытия кода для определения объема протестированного кода.
Возможные причины отсутствия результатов
Тесты не были выполнены
Анализ
Проверьте окно вывода.В раскрывающемся списке Показать выходные данные от выберите Тесты.Проверьте, были ли какие-либо записи в журнале предупреждений или ошибок.Объяснение
Анализ покрытия кода выполняется во время выполнения тестов.Он включает только сборки, загруженные в память во время выполнения тестов.Если ни один из тестов не выполнен, то ничего нельзя сообщить о покрытии кода.Решение
В обозревателе тестов выберите Выполнить все, чтобы проверить успешное выполнение тестов.Исправьте все ошибки перед использованием Анализа покрытия кода.
файлы (символов) с расширением .pdb недоступны
Анализ
Откройте предназначенную для компиляции папку (обычно bin\debug) и убедитесь, что для каждой сборки существует файл с расширением .pdb в том же каталоге, что и файлы с расширением .dll или .exe.Объяснение
Анализатору покрытия кода необходимо, чтобы каждая сборка имела связанный с ним PDB-файл, доступный во время тестового запуска.Если не существует файла с расширением .pdb для указанной сборки, то она не будет проанализирована.PDB-файл должен быть создан из той же сборки, что и файлы с расширениями .dll или .exe.
Решение
Убедитесь, что в параметрах построения указано создание PDB-файла.Если PDB-файлы не обновляются при построении проекта, то откройте свойства проекта, выберите страницу Построение, затем выберите Дополнительно и проверьте Отладочную информацию.Если файлы с расширениями .pdb и .dll или .exe располагаются в разных местах, то скопируйте файл с расширением .pdb в тот же каталог.Кроме того, можно настроить обработчик покрытия кода для поиска файлов .pdb в другом местоположении.Дополнительные сведения см. в разделе Настройка анализа покрытия кода.
Использование инструментированного или оптимизированного двоичного файла
Анализ
Определите, прошел ли двоичный файл любую из форм дополнительной оптимизации, такую как Оптимизация с использованием профиля, или было выполнено инструментирование средствами профилирования, такими как vsinstr.exe или vsperfmon.exe.Объяснение
Если сборка уже была инструментирована или оптимизирована другими средствами профилирования, то сборка исключается из анализа покрытия кода.Анализ покрытия кода не может быть выполнен на таких сборках.
Решение
Выключить оптимизацию и использовать новое построение.
Неуправляемый код (.NET) или машинный код (C++)
Анализ
Убедитесь, что хотя бы какие-то из тестов выполняются на управляемом коде или коде C++.Объяснение
Анализ покрытия кода в Visual Studio доступен только для управляемого и машинного кода (C++).При работе со сторонними средствами некоторый или весь код может выполняться на другой платформе.Решение
Нет.
Сборка была установлена с использованием технологии NGen
Анализ
Убедитесь, что сборка не загружается из кэша образов в машинном коде.Объяснение
Из соображений производительности сборки образов в машинном коде не анализируются.Дополнительные сведения см. в разделе Ngen.exe (генератор образов в машинном коде).Решение
Используйте MSIL-версию сборки.Не обрабатывайте ее с помощью NGen.
Пользовательский файл .runsettings с неверным синтаксисом
Анализ
Если используется пользовательский файл .runsettings, то он может содержать синтаксические ошибки.Это приводит к тому, что анализ покрытия кода не запускается вовсе.Либо окно покрытия кода не открывается в конце тестового запуска, либо оно отображает старые результаты.
Объяснение
Можно запускать модульные тесты, используя пользовательский файл .runsettings для того, чтобы настроить параметры покрытия кода.Параметры позволяют включать или исключать файлы.Дополнительные сведения см. в разделе Настройка анализа покрытия кода.Решение
Существует два возможных типа ошибок:
ошибка XML
Откройте файл .runsettings в XML-редакторе Visual Studio.Просмотрите отмеченные ошибки.
Ошибка в регулярном выражении
Каждая строка в файле представляет собой регулярное выражение.Проверьте каждую на наличие ошибок, в частности, можно найти:
Несоответствующие круглые скобки (...) или незакрытые скобки \(...\).Для проверки соответствия скобок в проверяемой строке можно их выделить.Например, проверим соответствие в функции: .*MyFunction\(double\)
Звездочка или плюс в начале выражения.Для сопоставления любой строки символов используйте точку со следующей за ней звездочкой. .*
Пользовательский файл .runsettings с неверными исключениями
Анализ
Если используется пользовательский файл .runsettings, то убедитесь в том, что он включает в себя сборку.Объяснение
Можно запускать модульные тесты, используя пользовательский файл .runsettings для того, чтобы настроить параметры покрытия кода.Параметры позволяют включать или исключать файлы.Дополнительные сведения см. в разделе Настройка анализа покрытия кода.Решение
Удалите все узлы Include из файла .runsettings, а затем удалите все узлы Exclude.Если это не решит проблемы, то верните их обратно.Убедитесь, что узел DataCollectors определяет покрытие кода.Сравните его с образцом в Настройка анализа покрытия кода.
Некоторый код всегда отображается как непокрытый
Код инициализации в машинных DLL выполняется перед инструментированием
Анализ
В статически связанном машинном коде, часть инициализирующих функций DllMain и код, который их вызывает, иногда отображается как непокрытый, даже если код был выполнен.Объяснение
Анализатор покрытия кода работает путем вставки инструментирования в сборку непосредственно перед тем, как приложение начинает выполняться.В любой сборке, загруженной до этого времени, код инициализации в DllMain выполняется после того, как загружается сборка и выполняется приложение.Данный код будет отображаться как непокрытый.Обычно это применяется к статически загружаемым сборкам.
Решение
Отсутствует.
См. также
Другие ресурсы
Использование покрытия кода для определения объема протестированного кода