Пошаговое руководство. Основанная на тестировании разработка с помощью возможности "Создание в результате использования"
В этом разделе демонстрируется использование функции Generate From Usage , которая поддерживает разработку на основе тестирования.
Разработка на основе тестирования является подходом к созданию программного обеспечения, в рамках которого на основе спецификаций продукта создаются модульные тесты, а затем создается исходный код, который приводит к успешному выполнению тестов. Visual Studio поддерживает разработку на основе тестирования путем создания новых типов и членов в исходном коде при их первом упоминании в тестовых случаях до их определения.
Visual Studio создает типы и члены, практически не изменяя рабочий процесс. Разработчик может создавать заглушки для типов, методов, свойств, полей или конструкторов прямо из текущего места в коде. После закрытия диалогового окна создания типа фокус сразу же возвращается в файл, открытый в настоящий момент.
Функция Создание в результате использования может использоваться с платформами тестирования, интегрированными с Visual Studio. В этом разделе показана платформа модульного тестирования корпорации Майкрософт.
Примечание.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в этой статье. Возможно, вы используете другой выпуск Visual Studio или разные параметры среды. Дополнительные сведения см. в разделе Персонализация среды IDE.
Создание проекта библиотеки классов Windows и проекта тестирования
Создайте проект Библиотека классов Windows в C# или Visual Basic. Назовите его
GFUDemo_VB
илиGFUDemo_CS
в зависимости от используемого языка.В обозревателе решений щелкните правой кнопкой мыши значок решения в верхней части окна и выберите команду Добавить>Новый проект.
Создайте проект Проект модульного теста (.NET Framework).
Добавление ссылки на проект библиотеки классов
В обозревателе решений в проекта модульного теста щелкните правой кнопкой мыши узел Ссылки и выберите команду Добавить ссылку.
В диалоговом окне Диспетчер ссылок выберите Проекты, а затем выберите проект библиотеки классов.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Диспетчер ссылок.
Сохраните решение. Теперь все готово для создания тестов.
Создание класса на основе модульного теста
Тестовый проект содержит файл с именем UnitTest1. Дважды щелкните этот файл в обозревателе решений, чтобы открыть его в редакторе кода. Будет создан тестовый класс и метод теста.
Найдите объявление класса
UnitTest1
и переименуйте его вAutomobileTest
.Примечание.
Теперь функция IntelliSense поддерживает два режима завершения инструкций: режим завершения и режим предложений. Режим предложений следует применять в тех случаях, когда классы и члены используются до их определения. Когда открыто окно IntelliSense, для переключения между режимом завершения и режимом предложений можно нажать сочетание клавиш CTRL+ALT+ПРОБЕЛ. Дополнительные сведения см. в статье Использование IntelliSense. Режим предложений поможет вам при вводе
Automobile
в следующем шаге.Найдите метод
TestMethod1()
и переименуйте его вDefaultAutomobileIsInitializedCorrectly()
. Внутри этого метода создайте экземпляр класса с именемAutomobile
, как показано на приведенных ниже снимках экрана. Отобразится волнистая линия, которая указывает на ошибку во время компиляции, и появится лампочка с ошибкой в Быстрых действиях на левом поле или прямо под волнистой линией при наведении на нее.Щелкните значок быстрых действий. Появится сообщение об ошибке, в котором указывается, что тип
Automobile
не определен. Также будет предложено несколько решений.Щелкните Сформировать новый тип, чтобы открыть диалоговое окно Сформировать тип. В этом диалоговом окне доступен ряд параметров. В том числе можно создать тип в другом проекте.
В списке проектов щелкните GFUDemo_VB или GFUDemo_CS, чтобы указать Visual Studio добавить файл в проект библиотеки классов вместо тестового проекта. Выберите параметр Создать новый файл, если он еще не выбран, и присвойте файлу имя Automobile.cs или Automobile.vb.
Нажмите кнопку ОК , чтобы закрыть диалоговое окно и создать файл.
В обозревателе решенийобратитесь к узлам проекта GFUDemo_VB или GFUDemo_CS, чтобы убедиться в том, что новый файл Automobile.vb или Automobile.cs содержится в проекте. В редакторе кода фокус по-прежнему находится в
AutomobileTest.DefaultAutomobileIsInitializedCorrectly
, что позволяет продолжить написание теста максимально быстро.
Создание заглушки свойства
Предположим, что в спецификации продукта класс Automobile
имеет два открытых свойства с именами Model
и TopSpeed
. Эти свойства необходимо инициализировать значениями по умолчанию "Not specified"
и -1
с помощью конструктора по умолчанию. Следующий модульный тест позволит убедиться в том, что конструктор по умолчанию устанавливает свойства в соответствующие значения.
Добавьте в метод теста
DefaultAutomobileIsInitializedCorrectly
приведенную ниже строку кода.Так как код ссылается на два неопределенных свойства
Automobile
, подModel
иTopSpeed
появляется волнистая линия подчеркивания. Наведите указатель мыши наModel
и выберите значок Быстрые действия в виде лампочки с ошибкой, а затем выберите Создайте свойство "Automobile.Model".Аналогичным образом создайте заглушку для свойства
TopSpeed
.В классе
Automobile
типы новых свойств корректным образом выводятся из контекста.
Создание заглушки для нового конструктора
Теперь мы создадим метод теста, который будет создавать заглушку конструктора для инициализации свойств Model
и TopSpeed
. После этого будет добавлен код, завершающий тест.
Добавьте приведенный ниже дополнительный тестовый метод в класс
AutomobileTest
.Под красной волнистой линией щелкните значок Быстрые действия в виде лампочки с ошибкой и выберите пункт Создать конструктор в "Automobile".
В файле класса
Automobile
обратите внимание на то, что новый конструктор проверил имена локальных переменных, используемых в вызове конструктора, обнаружил свойства с одинаковыми именами в классеAutomobile
и создал в теле конструктора код для хранения значений аргументов в свойствахModel
иTopSpeed
.После создания нового конструктора под вызовом конструктора по умолчанию в
DefaultAutomobileIsInitializedCorrectly
отображается волнистая линия. Сообщение об ошибке указывает на то, что классAutomobile
не имеет конструктора, который не принимает ни одного аргумента. Чтобы создать явный конструктор по умолчанию без параметров, щелкните значок Быстрые действия в виде лампочки с ошибкой и выберите пункт Создать конструктор в "Automobile".
Создание заглушки метода
Предположим, что согласно спецификации новый объект Automobile
может быть переведен в состояние IsRunning
, если его свойства Model
и TopSpeed
содержат значения, отличные от значений по умолчанию.
Добавьте приведенные ниже строки в метод
AutomobileWithModelNameCanStart
.Щелкните значок Быстрые действия в виде лампочки с ошибкой для вызова метода
myAuto.Start
, а затем выберите пункт Создать метод "Automobile.Start".Щелкните значок Быстрые действия в виде лампочки для свойства
IsRunning
, а затем выберите пункт Создайте свойство "Automobile.IsRunning".Класс
Automobile
теперь содержит метод с именемStart()
и свойство с именемIsRunning
.
Запуск тестов
В меню Тест выберите Запуск>Все тесты.
Команда Запуск>Все тесты выполняет все тесты всех платформ тестирования, которые созданы для текущего решения. В этом случае существует два теста, которые ожидаемым образом завершаются с ошибкой. Тест
DefaultAutomobileIsInitializedCorrectly
завершается с ошибкой, так как условиеAssert.IsTrue
возвращает значениеFalse
. ТестAutomobileWithModelNameCanStart
завершается с ошибкой, так как методStart
в классеAutomobile
создает исключение.Окно Результаты теста показано на рисунке ниже.
В окне Результаты теста дважды щелкните каждую строку результата теста для перехода к месту тестирования.
Реализация исходного кода
Добавьте приведенный ниже код в конструктор по умолчанию, чтобы свойства
Model
,TopSpeed
иIsRunning
были инициализированы правильными значениями по умолчанию"Not specified"
,-1
иFalse
(false
для C#).При вызове метода
Start
он должен устанавливать флажокIsRunning
в значение true только в том случае, если свойствоModel
илиTopSpeed
имеет значение, отличное от значения по умолчанию. УдалитеNotImplementedException
из тела метода и добавьте приведенный ниже код.
Повторный запуск тестов
В меню Тест наведите указатель на пункт Выполнить, а затем выберите пункт Все тесты.
Результат на этот раз положительный. Окно Результаты теста показано на рисунке ниже.