Модульное тестирование при помощи Visual Studio 2012: MSTest, NUnit, xUnit.net и Code Clone

Общие сведения

Выполнив задания этого упражнения, вы узнаете о принципиально новом подходе к модульному тестированию в Visual Studio 2012. Ядро модульного тестирования в Visual Studio 2012 стало расширяемым, оно поддерживает адаптеры тестирования от сторонних поставщиков, такие как NUnit и xUnit.net. Вы также узнаете о том, как новые инструменты обнаружения клонов исходного кода способствуют разработке высококачественного программного обеспечения, помогая найти семантически сходные блоки кода для внесения общих исправлений или рефакторинга.

Необходимые условия

Для этого практического занятия вам понадобится виртуальная машина Visual Studio 2012, предоставляемая компанией Microsoft. Для получения дополнительных сведений о получении и использовании этой виртуальной машины выберите ссылку.

Информация о сценарии Fabrikam Fiber

В этой группе практических занятий для более удобного изучения сценариев упоминается вымышленная компания Fabrikam Fiber, которая предоставляет доступ к кабельному телевидению и оказывает сопутствующие услуги в США. С целью масштабирования своего веб-сайта для клиентов она использует приложение Windows Azure, чтобы предоставить конечным пользователям возможность самообслуживания и отслеживания доступности технических специалистов. В компании используется также локальное приложение ASP.NET MVC для повышения эффективности работы представителей отдела обслуживания клиентов. Приложение позволяет управлять процессом выполнения заказов клиентов.

В рамках этой группы практических занятий вы примете участие в ряде сценариев, в которые вовлечены разработчики и тестировщики компании Fabrikam Fiber. Рабочая группа из 8–10 специалистов решила использовать инструменты управления жизненным циклом приложений Visual Studio для управления исходным кодом, запуска сборок, проверки веб-сайтов, а также планирования и мониторинга процесса реализации проекта.

Упражнения

Это практическое занятие включает следующие упражнения:

1.      Модульное тестирование.

2.      Анализ клонов исходного кода.

Примерная продолжительность практического занятия: 30 минут.

Упражнение 1. Модульное тестирование

В этом упражнении вы познакомитесь с некоторыми усовершенствованиями, внесенными в процесс модульного тестирования в Visual Studio 2012 и направленными на повышение эффективности и расширяемости.

  1. Войдите в систему с логином Julia. Для всех учетных записей используется пароль P2ssw0rd.
  2. Запустите Visual Studio 2012 при помощи ярлыка на панели задач или через меню Start | All Programs | Microsoft Visual Studio 2012 (Пуск | Все программы | Microsoft Visual Studio 2012).

Рисунок 1. Запуск Visual Studio 2012

  1. Запустите решение FabrikamFiber.CallCenter (Центр обработки вызовов FabrikamFiber) из ветви Dev (Разработка) в окне Source Control Explorer (Обозреватель управления исходным кодом).

Рисунок 2. Окно Source Control Explorer (Обозреватель управления исходным кодом)

  1. Откройте окно Unit Test Explorer (Обозреватель модульного тестирования) через меню Unit Test | Windows | Unit Test Explorer (Модульное тестирование | Окна | Обозреватель модульного тестирования).

Рисунок 3. Окно Unit Test Explorer (Обозреватель модульного тестирования)

  1. Выберите пункт Build | Build Solution (Сборка | Собрать решение) в главном меню, чтобы начать процесс обнаружения новых модульных тестов и изменений в коде, которые могут повлиять на существующие тесты. Обратите внимание, что обнаруженные тесты первоначально устанавливаются в состояние Not Run (Невыполненные).

Рисунок 4. Обнаруженные тесты

  1. Щелкните ссылку Run All (Выполнить все) в окне Unit Test Explorer (Обозреватель модульного тестирования).

Рисунок 5. Выполнение всех модульных тестов

Примечание. Visual Studio 2012 также предоставляет инструмент Continuous Test Runner (Средство непрерывного выполнения тестов), который можно активировать через меню Unit Test | Unit Test Settings | Run Test After Build (Модульное тестирование | Настройка модульных тестов | Выполнить тест после сборки). Если эта опция включена, тесты будут выполняться после сборки приложений в случае необходимости.

  1. Дважды щелкните тест под названием CreateInsertsCustomerAndSaves (Создать вставки клиентов и сохранения), чтобы открыть исходный код.

Рисунок 6. Переходим к методу тестирования, который использует MSTest

  1. В открывшемся файле CustomersControllerTest.cs обратите внимание на то, что метод тестирования использует ожидаемый атрибут TestMethod (Метод теста). Этот атрибут используется инструментом MSTest для маркировки модульных тестов.

Рисунок 7. Исходный код модульного теста MSTest

  1. В поле Search (Поиск) в верхней части окна Unit Test Explorer (Обозреватель модульного тестирования) введите слово index и обратите внимание на доступные фильтры поиска.

Рисунок 8. Выполнение поиска в окне Unit Test Explorer (Обозреватель модульного тестирования)

  1. Нажмите клавишу Enter (Ввод), чтобы выполнить поиск.
  2. В списке результатов поиска двойным щелчком откройте единственный тест под названием IndexReturnsNonNullView (Индекс возвращает ненулевое представление), чтобы просмотреть исходный код.

Рисунок 9. Переходим к методу тестирования, который использует XUnit

  1. В открывшемся файле HomeControllerTest.cs вы увидите, что тест IndexReturnsNonNullView (Индекс возвращает ненулевое представление) действительно использует платформу тестирования XUnit. Адаптер XUnit в настоящее время доступен только в виде прототипа, однако компания Microsoft сотрудничает с рабочей группой XUnit и собирается включить официальную версию этого продукта в Visual Studio 2012.

Рисунок 10. Пример теста XUnit в Visual Studio 2012

  1. Нажмите кнопку Home (Главная) в окне Unit Test Explorer (Обозреватель модульного тестирования), чтобы просмотреть все тесты.

Рисунок 11. Местоположение кнопки Home (Главная)

  1. Обратите внимание, что результаты распределены на две группы — passed (Успешные) и failed (Неудачные) — с отображением времени, затраченного на выполнение теста.

Рисунок 12. Результаты выполнения теста

  1. В Visual Studio 2012 улучшилась производительность средств выполнения тестов. Обратите внимание на затраченное время, затем снова щелкните ссылку Run All (Выполнить все), чтобы оценить разницу.

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

Рисунок 13. Второй тестовый запуск выполняется быстрее при отсутствии изменений в коде

  1. Выберите неудачно пройденный тест в окне Unit Test Explorer (Обозреватель модульного тестирования), чтобы просмотреть результаты тестирования.

Рисунок 14. Выбор неудачно пройденного теста

Примечание. Вы также можете щелкнуть правой кнопкой результаты тестирования и выбрать команду Copy (Копировать), чтобы скопировать подробную информацию в буфер обмена. Эта функция будет полезна, например, при отправке электронной почты.

  1. В окне со сводной информацией о неудачном тесте отображается сообщение о возникновении исключения ArgumentNullException (Исключение пустого аргумента). Система предоставит вам трассировку стека на момент появления исключения. Обратите внимание, что мы можем перейти по ссылкам непосредственно к исходному коду для тестирования или к точкам трассировки стека. Щелкните ссылку source link (Ссылка на источник), чтобы просмотреть исходный код метода теста.

Рисунок 15. Переход к исходному коду метода теста

Рисунок 16. Начальное представление после перехода к исходному коду метода теста

  1. Найдите закомментированную строку кода и раскомментируйте ее. Предположим, что это и есть причина неудачного теста.

Рисунок 17. Устранение причины неудачного теста

  1. Нажмите клавиши CTRL + S, чтобы сохранить изменения.
  2. Щелкните правой кнопкой неудачный тест в окне Unit Test Explorer (Обозревать модульного тестирования) и выберите Run Selected Tests (Выполнить выбранные тесты), чтобы убедиться в том, что проблема устранена.

Рисунок 18. Выполнение неудачно пройденного теста

  1. Закройте окно Unit Test Explorer (Обозревать модульного тестирования).

Упражнение 2. Анализ клонов исходного кода

В этом упражнении вы познакомитесь с новой функцией Code Clone (Клон кода), которая используется в Visual Studio 2012 для обнаружения клонов исходного кода. Эта программа ищет семантически сходные блоки кода, используя эвристический анализ, а не просто поиск точных совпадений.

  1. Выберите пункт Analyze | Analyze Solution for Code Clones (Анализ | Анализ клонов в исходном коде решения) в главном меню Visual Studio.

Рисунок 19. Анализ клонов в исходном коде решения

  1. По завершении анализа в окне Code Clone Analysis Results (Обнаруженные клоны в исходном коде) отображаются сходные блоки кода, сгруппированные по степени совпадения. Нажмите кнопку «+» слева от группы Strong Match (Близкое совпадение), чтобы открыть два файла, в которых присутствуют практически аналогичные блоки.

Рисунок 20. Просмотр близких совпадений в файлах

  1. В каждой записи показан класс и метод, определенный файл и строки, которые были определены как близкие совпадения. Если вы наведете указатель мыши на любое совпадение, фрагмент кода даст вам представление о сходных блоках кода.

Рисунок 21. Наводим указатель мыши на результаты, чтобы получить более подробную информацию

  1. Дважды щелкните каждое совпадение, чтобы открыть их в редакторе кода, затем щелкните правой кнопкой заголовок одной из вкладок и выберите пункт New Horizontal Tab Group (Новая горизонтальная группа вкладок) в контекстном меню.

Рисунок 22. Открытие обоих файлов с целью сравнения

  1. Пролистайте код и найдите метод AssignSchedule (Назначить расписание) в обоих файлах. Обратите внимание, что блоки кода практически полностью совпадают, за исключением последней строки, в которой вызывается метод RedirectToAction (Перенаправление к действию). Это означает, что данный метод является подходящим для рефакторинга. Такой всеобъемлющий поиск особенно полезен в процессе обнаружения кода, который подходит для рефакторинга с целью упрощения обслуживания в будущем.

Рисунок 23. Сравнение близких совпадений в результатах анализа кода клонов

  1. Выберите пункт Window | Close All Documents (Окно | Закрыть все документы) в главном меню, чтобы освободить пространство на экране.
  2. Вы также можете сузить область поиска клонов исходного кода, если это необходимо. В окне Solution Explorer (Обозреватель решений) перейдите в папку Controllers (Контроллеры) проекта FabrikamFiber.Web (Веб-страница FabrikamFiber) и откройте файл CustomersController.cs в редакторе кода.

Рисунок 24. Открытие исходного файла CustomersController.cs

  1. Прокрутите страницу вниз и найдите метод Create (Создать), который использует параметр Customer (Клиент). Выделите три строки, начиная с оператора if (если).

Рисунок 25. Выбор кода с целью обнаружения клонов

  1. Щелкните правой кнопкой выбранный блок кода и выберите пункт Find Matching Clones in Solution (Найти близкие совпадения в решении) в контекстном меню.

Рисунок 26. Поиск близких совпадений для выбранного блока кода

  1. После выполнения поиска в окне Code Clone Search Results (Обнаруженные клоны кода) отображаются фрагменты кода с различной степенью совпадения.

Рисунок 27. Обнаруженные клоны кода

  1. Разверните все группы клонов и просмотрите обнаруженные совпадения, в том числе в исходной группе клонов. Если увеличить размер окна Code Clone Search Results (Обнаруженные клоны кода), вы сможете увидеть сразу все совпадения.

Рисунок 28. Развернутые группы обнаруженных клонов кода

  1. Наведите курсор мыши на оригинальный фрагмент кода, чтобы напомнить, для какого блока мы ищем клоны.

Рисунок 29. Оригинальный фрагмент кода

  1. Наведите курсор на результат Exact Match (Полное совпадение) и обратите внимание, что метод Edit (Редактировать) использует тот же код, что и метод Create (Создать).
  2. Наведите курсор на результат Strong Match (Близкое совпадение) и обратите внимание, что разница заключается только в строке с вызовом метода Delete (Удалить).

Рисунок 30. Фрагмент кода, представляющий собой близкое совпадение с оригиналом

  1. Наведите курсор на результат MediumMatch (Частичное совпадение) и обратите внимание, что фрагмент похож на оригинал, но мы работаем с совершенно другим объектом (employeeRepository (Репозиторий сотрудника)).

Рисунок 31. Фрагмент кода, представляющий собой близкое совпадение с оригиналом

  1. Таким образом, существует три основных сценария, когда обнаружение клонов кода может быть полезно для разработчиков:
  • Выявление подходящих блоков для рефакторинга.
  • Обновление сходных блоков кода в процессе исправления ошибок или оптимизации.
  • Обучение новых разработчиков, которые присоединяются к проекту рабочей группы. Например, разработчик добавляет блоки кода для обновления данных о клиенте и хочет увидеть методы, используемые в остальной части программы (например, блок Try... Catch).

Свои отзывы и предложения вы можете отправить по электронной почте: VSKitFdbk@Microsoft.com

© 2012 г. Корпорация Microsoft. Все права защищены.