Пошаговое руководство. Основанная на тестировании поддержка с помощью функции "Создание в результате использования"
В этом разделе демонстрируется использование функции Создание в результате использования, которая поддерживает разработку на основе тестирования.
Разработка на основе тестирования является подходом к созданию программного обеспечения, в рамках которого на основе спецификаций продукта создаются модульные тесты, а затем создается исходный код, который приводит к успешному выполнению тестов.Visual Studio поддерживает разработку на основе тестирования путем создания новых типов и членов в исходном коде при их первом упоминании в тестовых случаях до их определения.
Visual Studio создает новые типы и элементы, практически не изменяя рабочий процесс.Разработчик может создавать заглушки для типов, методов, свойств, полей или конструкторов прямо из текущего расположения в коде.После закрытия диалогового окна создания типа фокус сразу же возвращается в файл, открытый в настоящий момент.
Функция "Создание в результате использования" может использоваться вместе с платформами тестирования, интегрированными с Visual Studio.В этом разделе показана платформа модульного тестирования корпорации Майкрософт.
Примечание |
---|
На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Создание проекта библиотеки классов Windows и проекта тестирования
Создайте новый проект библиотеки классов Windows в Visual C# или в Visual Basic.Назовите его GFUDemo_VB или GFUDemo_CS в зависимости от используемого языка.
В обозревателе решений щелкните правой кнопкой мыши значок решения в верхней части окна, выберите команду Добавить, а затем — Новый проект.В диалоговом окне Создание проекта перейдите на панель Типы проекта и выберите элемент Тест.
В Шаблоны область, нажмите кнопку Проект модульных тестов и примите имя по умолчанию UnitTestProject1.На следующем рисунке показано диалоговое окно, отображаемое в Visual C#.Диалоговое окно в Visual Basic выглядит подобным образом.
Диалоговое окно "Создание проекта"
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Создание проекта.Теперь все готово для создания тестов.
Создание нового класса из модульного теста
Тестовый проект содержит файл с именем UnitTest1.Дважды щелкните этот файл в обозревателе решений, чтобы открыть его в редакторе кода.Будет создан тестовый класс и метод теста.
Найдите объявление класса UnitTest1 и переименуйте его в AutomobileTest.Если в C# присутствует конструктор UnitTest1(), переименуйте его в AutomobileTest().
Примечание Теперь функция IntelliSense поддерживает два режима завершения инструкций: режим завершения и режим предложений.Режим предложений следует применять в тех случаях, когда классы и элементы используются до их определения.Когда открыто окно IntelliSense, для переключения между режимом завершения и режимом предложений можно нажать сочетание клавиш CTRL+ALT+ПРОБЕЛ.Дополнительные сведения см. в разделе Использование технологии IntelliSense.Режим предложений предоставит справку при вводе Automobile на следующем шаге.
Найдите метод TestMethod1() и переименуйте его в DefaultAutomobileIsInitializedCorrectly().Внутри этого метода создайте новый экземпляр класса с именем Automobile, как показано в следующих примерах.Отобразится волнистая линия подчеркивания, свидетельствующая об ошибке компиляции, а под именем типа отобразится смарт-тег.Расположение смарт-тега зависит от того, используется ли Visual Basic или Visual C#.
Visual Basic
Visual C#
Наведите указатель мыши на смарт-тег, чтобы просмотреть сообщение об ошибке, в котором сообщается о том, что тип Automobile еще не определен.Щелкните смарт-тег или нажмите клавиши CTRL+.(CTRL+точка), чтобы открыть контекстное меню "Создание в результате использования", как показано на следующем рисунке.
Visual Basic
Visual C#
Теперь возможны два варианта.Разработчик может щелкнуть команду Создать 'Class Automobile', чтобы создать новый файл в тестовом проекте и заполнить его пустым классом с именем Automobile.Это быстрый способ создания нового типа класса в новом файле текущего проекта с модификаторами доступа по умолчанию.Пользователь также может щелкнуть команду Создать новый тип, чтобы открыть диалоговое окно Создание нового типа.Это обеспечивает размещение класса в существующем файле или добавление файла в другой проект.
Щелкните команду Создать новый тип, чтобы открыть диалоговое окно Создание нового типа, которое показано на следующем рисунке.В списке Проект щелкните элемент GFUDemo_VB или элемент GFUDemo_CS, чтобы файл Visual Studio был добавлен в проект исходного кода, а не в тестовый проект.
Диалоговое окно "Создание нового типа"
Нажмите кнопку ОК, чтобы закрыть диалоговое окно и создать новый файл.
В обозревателе решений обратитесь к узлам проекта GFUDemo_VB или GFUDemo_CS, чтобы убедиться в том, что новый файл Automobile.vb или Automobile.cs содержится в проекте.В редакторе кода фокус остается на элементе AutomobileTest.DefaultAutomobileIsInitializedCorrectly.Написание теста можно свободно продолжить.
Создание заглушки свойства
Предположим, что в спецификации продукта класс Automobile имеет два открытых свойства с именами Model и TopSpeed.Эти свойства необходимо инициализировать значениями по умолчанию "Not specified" и -1 через конструктор по умолчанию.Следующий модульный тест позволит убедиться в том, что конструктор по умолчанию устанавливает свойства в соответствующие значения.
Добавьте следующую строку кода в элемент DefaultAutomobileIsInitializedCorrectly.
Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
Так как в коде содержатся два неопределенных свойства Automobile, отображается смарт-тег.Щелкните смарт-тег для Model, а затем щелкните команду Создать заглушку свойства.Создайте заглушку свойства и для свойства TopSpeed.
В классе Automobile типы новых свойств корректным образом выводятся из контекста.
На следующем рисунке показано контекстное меню смарт-тега.
Visual Basic
Visual C#
Поиск исходного кода
Используйте функцию Перейти к для перехода к файлу исходного кода Automobile.cs или Automobile.vb, чтобы убедиться, что были созданы новые свойства.
Функция Перейти к позволяет быстро открыть текстовую строку (например, имя типа или часть имени) и перейти в необходимое расположение, щелкнув элемент в списке результатов.
Откройте диалоговое окно Перейти к, щелкнув в окне редактора кода и нажав клавиши CTRL+, (CTRL+запятая).В текстовом поле введите automobile.Выберите в списке класс Automobile и нажмите кнопку OK.
Окно Перейти к представлено на следующей иллюстрации.
Окно "Перейти к"
Создание заглушки для нового конструктора
В этом тестовом методе будет создана заглушка конструктора, которая выполнит инициализацию свойств Model и TopSpeed с указанными значениями.После этого будет добавлен код, завершающий тест.Добавьте следующий дополнительный тестовый метод в класс AutomobileTest.
<TestMethod()> Public Sub AutomobileWithModelNameCanStart() Dim model As String = "Contoso" Dim topSpeed As Integer = 199 Dim myAuto As New Automobile(model, topSpeed) End Sub
[TestMethod] public void AutomobileWithModelNameCanStart() { string model = "Contoso"; int topSpeed = 199; Automobile myAuto = new Automobile(model, topSpeed); }
Щелкните смарт-тег в новом конструкторе класса и выберите команду Создать заглушку конструктора.В файле класса Automobile обратите внимание на то, что новый конструктор определил имена локальных переменных, используемых в вызове конструктора, обнаружил свойства с одинаковыми именами в классе Automobile и создал в теле конструктора код для хранения значений аргументов в свойствах Model и TopSpeed.(В Visual Basic поля нового конструктора _model и _topSpeed являются явным образом определенными резервными полями свойств Model и TopSpeed).
После создания нового конструктора под вызовом конструктора по умолчанию в DefaultAutomobileIsInitializedCorrectly отображается волнистая линия.Сообщение об ошибке указывает на то, что класс Automobile не имеет конструктора, который не принимает ни одного аргумента.Чтобы создать явный конструктор по умолчанию без параметров, щелкните смарт-тег и выберите команду Создать заглушку конструктора.
Создание заглушки метода
Предположим, что согласно спецификации новый объект Automobile может быть переведен в состояние "Running", если его свойства Model и TopSpeed содержат значения, отличные от значений по умолчанию.Добавьте следующие строки к методу AutomobileWithModelNameCanStart.
myAuto.Start() Assert.IsTrue(myAuto.IsRunning = True)
myAuto.Start(); Assert.IsTrue(myAuto.IsRunning == true);
Щелкните смарт-тег для вызова метода myAuto.Start, а затем щелкните команду Создать заглушку метода.
Щелкните смарт-тег для свойства IsRunning, а затем щелкните команду Создать заглушку свойства.Класс Automobile теперь содержит следующий код:
Public Class Automobile Sub New(ByVal model As String, ByVal topSpeed As Integer) _model = model _topSpeed = topSpeed End Sub Sub New() ' TODO: Complete member initialization End Sub Property Model() As String Property TopSpeed As Integer Property IsRunning As Boolean Sub Start() Throw New NotImplementedException End Sub End Class
public class Automobile { public string Model { get; set; } public int TopSpeed { get; set; } public Automobile(string model, int topSpeed) { this.Model = model; this.TopSpeed = topSpeed; } public Automobile() { // TODO: Complete member initialization } public void Start() { throw new NotImplementedException(); } public bool IsRunning { get; set; } }
Запуск тестов
На Модульного теста , выберите пункт меню Выполнить модульные тестыи нажмите кнопку Все тесты.Эта команда запускает все тесты всех платформ тестирования, которые созданы для текущего решения.
В этом случае существует два теста, которые ожидаемым образом завершаются с ошибкой.Тест DefaultAutomobileIsInitializedCorrectly завершается с ошибкой, так как условие Assert.IsTrue возвращает значение False.Тест AutomobileWithModelNameCanStart завершается с ошибкой, так как метод Start в классе Automobile возвращает исключение.
Окно результаты теста показано на следующем рисунке.
Окно "Результаты теста"
В окне Результаты теста дважды щелкните каждую строку результата теста для перехода к месту сбоя в ходе каждого тестирования.
Реализация исходного кода
Добавьте следующий код в конструктор по умолчанию, чтобы свойства Model, TopSpeed и IsRunning были инициализированы с правильными значениями "Not specified", -1 и True (true).
Sub New() Model = "Not specified" TopSpeed = -1 IsRunning = True End Sub
public Automobile() { this.Model = "Not specified"; this.TopSpeed = -1; this.IsRunning = true; }
При вызове метода Start он должен устанавливать флажок IsRunning в значение true только в том случае, если свойства Model и TopSpeed имеют значения, отличные от значения по умолчанию.Удалите NotImplementedException из тела метода и добавьте следующий код.
Sub Start() If Model <> "Not specified" Or TopSpeed <> -1 Then IsRunning = True Else IsRunning = False End If End Sub
public void Start() { if (this.Model != "Not specified" || this.TopSpeed != -1) this.IsRunning = true; else this.IsRunning = false; }
Повторный запуск тестов
В меню Тест выберите команду Выполнить, а затем выберите Все тесты в решении.Результат на этот раз положительный.Окно результаты теста показано на следующем рисунке.
Окно "Результаты теста"
См. также
Основные понятия
Создание в результате использования
Проверка кода при помощи модульных тестов