Покрытие кода в Microsoft Test Manager. Подробный анализ
Квартальное обновление 1 для Visual Studio 2012 добавило в выпуск функцию сбора сведений о покрытии кода. Она используется в ходе ручного тестирования веб-приложений ASP.Net, выполняющихся в службах Internet Information Services (IIS). Теперь тест-инженеры смогут получать данные об объеме проанализированного кода с помощью Microsoft Test Manager (MTM). Этот пост Майка Дугласа (Mike Douglas) рассказывает о том, как работает покрытие кода в MTM. В его публикации отмечено, что обновление принесло несколько новых функций и улучшений. Сегодня мы рассмотрим важные вопросы, касающиеся настройки покрытия кода, затронем многопользовательские сценарии тестирования и расскажем о консолидированном файле покрытия уровня построения.
Упрощенная настройка
Чтобы получить сведения о покрытии кода, необходимо создать стандартную или лабораторную среду, установив тестовый агент на веб-сервер. Установка и настройка автоматизированного агента позволяет значительно упростить процедуру создания среды в Visual Studio 2012. В отличие от Visual Studio 2010, где требовались права администратора для сбора информации о покрытии кода, в новой версии пользователь не должен предоставлять тестовому агенту никаких специальных разрешений.
Покрытие кода в MTM выступает в качестве адаптера диагностических данных и, как все адаптеры, требует активации и настройки в параметрах тестирования.
По умолчанию обработчик покрытия кода пытается инструментировать все загруженные сборки, для которых он может найти соответствующие символы. Это действие можно переопределить и указать конкретные сборки для добавления в покрытие кода. Если символы не развертываются вместе со сборками продукта, то нужно задать дополнительные папки для поиска соответствующих PDB-файлов. Эти папки могут располагаться на общем сетевом ресурсе, однако следует убедиться, что скорость передачи данных от него к компьютеру с тестовым агентом не слишком мала, поскольку PDB-файлы необходимы для получения информации об источнике.
Поддержка нескольких пользователей
Обычно группа разработчиков располагает общим сервером IIS, и все тест-инженеры выполняют на нем тестовые случаи. Помня об этом, мы добавили дополнительную функцию: теперь несколько пользователей могут одновременно проводить тестирование на веб-сервере. Ниже приведен пример стандартной ситуации, когда два пользователя выполняют тестирование в одной и той же среде.
- Пользователь 1 запускает ручной тестовый запуск в среде 1.
- Тестовый агент запускает сеанс покрытия кода в среде 1.
- Тестовый агент перезапускает все рабочие процессы IIS на веб-сервере. Это необходимо для инструментирования w3wp.exe с целью покрытия кода.
- Пользователь 1 продолжает тестирование и обращается к веб-приложениям с компьютера MTM.
- Пользователь 2 запускает новый ручной тестовый запуск в среде 1.
- Поскольку в среде 1 уже выполняется сеанс тестирования, то параметры теста пользователя 2 игнорируются. В течение этого времени рабочие процессы IIS не перезапускаются.
- Пользователь 2 продолжает тестирование.
- Пользователь 1 завершает тестирование.
- Пользователь 2 завершает тестирование.
- Тестовый агент завершает сеанс покрытия кода.
По окончании запусков пользователи 1 и 2 получат данные о протестированном объеме кода. Важно отметить, что даже если на веб-сервере работают несколько пользователей, существует только один сеанс покрытия кода. Когда пользователь завершает тестовый запуск, он получает все данные о протестированном объеме, собранные на этот момент. Это означает, что в приведенном выше примере пользователь 1 получит данные о покрытии кода, выполненного с помощью w3wp.exe на этапах 3–8. Аналогичным образом пользователь 2 получит данные о покрытии кода, выполненного на этапах 3–9, и у него появятся дублирующиеся сведения о покрытии кода. Для решения именно этой проблемы предназначен файл покрытия уровня построения, представленный в данном обновлении.
Сведения о покрытии уровня построения
Покрытие кода –– важный показатель, определяющий качество построения. Поэтому мы предоставили файл покрытия уровня построения, который содержит объединенные сведения о покрытии кода для всех запусков, опубликованных в данной сборке. Всякий раз, когда пользователь публикует тестовый запуск (ручной или автоматизированный) с информацией о покрытии кода, фоновое задание в TFS объединяет сведения нового запуска и запусков, опубликованных ранее, и сохраняет их на сервере в виде файла. Этот файл доступен для загрузки по ссылке результатов покрытия на сводной странице построения в Visual Studio.
Кроме того, фоновое задание помещает сведения о покрытии в базу данных TFS, используемую хранилищем TFS для создания отчетов о покрытии кода.
Несмотря на то что функция хранилища покрытия кода была представлена в Visual Studio 2010, в квартальное обновление 1 было внесено важное изменение, касающееся способа записи сведений о покрытии в базу данных. Задание покрытия больше не записывает сведения о покрытии функционального уровня в базу данных хранилища. Это сделано, главным образом, по двум причинам: во-первых, запись информации о каждой функции в базу данных занимает много времени, а во-вторых, с течением времени заметно увеличивается размер базы данных. Если имеется файл с данными о покрытии на уровне построения, то эта информация является избыточной, поскольку пользователь может получить данные о покрытии на функциональном уровне из консолидированного файла. Приведенный ниже код демонстрирует загрузку файла покрытия построения и получение сведений на функциональном уровне.
string serverPath = string.Format(CultureInfo.InvariantCulture, "/BuildCoverage/{0}{1}", build.BuildNumber,
string.Format(CultureInfo.InvariantCulture, ".{0}.{1}.2}.coverage",
buildCoverage.Configuration.BuildFlavor,buildCoverage.Configuration.BuildPlatform,
buildCoverage.Configuration.Id.ToString(NumberFormatInfo.InvariantInfo)));
string coverageFileUrl = String.Format(CultureInfo.InvariantCulture, "{0}/{1}/_api/_build/ItemContent?buildUri={2}&path={3}",
build.BuildServer.TeamProjectCollection.Uri.AbsoluteUri, Uri.EscapeDataString(build.TeamProject),
Uri.EscapeDataString(build.Uri.AbsoluteUri), Uri.EscapeDataString(serverPath));
string localFilePath = "c:\Build.Coverage";
WebClient myWebClient = new WebClient();
myWebClient.DownloadFile(coverageFileUrl, localFilePath);
CoverageInfo firstCoverageInfo = CoverageInfo.CreateFromFile(localFilePath);
Класс CoverageInfo содержит сведения, необходимые для получения данных на уровне модуля и функционирования.
И, наконец, в классе CoverageInfo появился общедоступный интерфейс API, который можно использовать для объединения данных из двух файлов покрытия в один выходной файл.
Предупреждения
Мы постарались максимально упростить сбор данных о покрытии кода, однако остались некоторые моменты, которые следует иметь в виду при использовании покрытия кода в MTM.
1. Покрытие кода само по себе не требует запуска тестового агента с правами администратора, но если в параметрах теста указаны другие сборщики на основе профилировщика (например, Intellitrace и Test Impact), необходимо настроить тестовый агент для запуска под учетной записью администратора.
2. Если несколько пользователей выполняют тестирование в одной среде, то параметры второго пользователя полностью игнорируются. Таким образом, даже если второй пользователь не выберет покрытие кода в своих параметрах, он все равно получит данные покрытия как часть результатов тестового запуска.
3. Убедитесь, что TFS и тестовый агент установлены на разных компьютерах, поскольку агент перезапускает все рабочие процессы в начале тестового запуска. Кроме того, в TFS присутствует компонент IIS, а перезапуск всех рабочих процессов переведет сервер в
автономный режим.