Инструменты покрытия кода .NET не работают в собственных приложениях, которые загружают сборки .net

#.net #code-coverage #revit

#.net #покрытие кода #revit

Вопрос:

Я пишу подключаемый модуль для архитектуры Revit, который предоставляет .NET API. По сути, вы создаете сборку с классами, которые реализуют определенный интерфейс. Затем Revit загружает сборку и выполняет вызовы интерфейса.

Я хотел бы иметь возможность получать текущие показатели покрытия кода для моего кода подключаемого модуля, но обнаружил, что все типичные инструменты покрытия кода (NCover, PartCover, dotCover) в этом случае не работают, поскольку основное приложение Revit (Revit.exe) является собственным приложением Windows, а не управляемым приложением. В документации NCover конкретно указано, что NCover не будет работать, если покрываемый процесс является процессом собственного приложения. Я предполагаю, что методы инструментирования, используемые другими инструментами, схожи и, следовательно, имеют ту же основную причину, по которой они не работают.

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

Комментарии:

1. Когда вы запускаете свой модуль плагина с использованием NUnit (etc), Разве он не загружает сборку без использования архитектуры Revit? Я знаю, что когда мы тестируем наш плагин (заметьте, не для Revit), NUnit, работающий в R #, просто размещает DLL и запускает их, основное приложение не задействовано. Мы можем получить показатели покрытия без существующего хост-приложения.

2. Майкл, у меня есть модульные тесты, которые работают так, как вы описали, однако меня интересуют показатели покрытия для моих функциональных / интеграционных тестов, для которых требуется хост Revit. Спасибо.

3. Я хотел бы услышать больше о ваших методах тестирования с Revit, я уверен, что Джереми Таммик, который ведет блог Building Coder, также хотел бы опубликовать пост об этом (он проявил ко мне интерес ранее в этом году). Есть ли шанс, что вам будет интересно опубликовать что-нибудь о том, как вы это делаете?

Ответ №1:

Для этого должен работать наш инструмент покрытия тестированием C #.

Это работает путем инструментирования исходного кода; вы запускаете инструментальный исходный код (любым способом, включая традиционные методы компиляции и запуска). Следовательно, не важно, как выполняется код, важно только, чтобы он каким-то образом выполнялся. Данные инструментария собираются в добавленном классе, и у вас есть полный контроль над тем, как и когда эти данные экспортируются, поэтому вы можете экспортировать из произвольной среды.

Ответ №2:

NCover, PartCover и dotCover являются .Инструменты покрытия СЕТИ и делают это с помощью IL (я знаю, что PartCover и NCover делают это с помощью интерфейсов ICorProfilerCallback и событий JITCompilationStarted и тому подобного) для сбора информации о покрытии, и поэтому они не знают, как обрабатывать машинный код (хотя на самом деле они написаны на машинном коде.).

Я не могу утверждать, что знаю, как работает dotCover.

Если вы хотите получить покрытие для собственного приложения, я бы обратил внимание на такие инструменты, как средство проверки покрытия