Поделиться через


Пошаговое руководство. Основанная на тестировании поддержка с помощью функции "Создание в результате использования"

В этом разделе демонстрируется использование функции Создание в результате использования, которая поддерживает разработку на основе тестирования.

Разработка на основе тестирования является подходом к созданию программного обеспечения, в рамках которого на основе спецификаций продукта создаются модульные тесты, а затем создается исходный код, который приводит к успешному выполнению тестов. Visual Studio поддерживает разработку на основе тестирования путем создания новых типов и членов в исходном коде при их первом упоминании в тестовых случаях до их определения.

Visual Studio создает новые типы и элементы, практически не изменяя рабочий процесс. Разработчик может создавать заглушки для типов, методов, свойств, полей или конструкторов прямо из текущего расположения в коде. После закрытия диалогового окна создания типа фокус сразу же возвращается в файл, открытый в настоящий момент.

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

Примечание

Это руководство было написано с учетом параметров разработки Visual Basic или Visual C#.Данное руководство также совместимо с другими параметрами.

Для изменения рекомендованных параметров можно выполнить следующие действия: в меню Сервис выберите Импорт и экспорт параметров.На первой странице Мастера импорта и экспорта параметров щелкните Сброс всех параметров.На странице Выбор коллекции параметров по умолчанию щелкните Параметры разработки Visual Basic или Параметры разработки Visual C#.

Создание проекта библиотеки классов Windows и проекта тестирования

  1. Создайте новый проект библиотеки классов Windows в Visual C# или в Visual Basic. Назовите его GFUDemo_VB или GFUDemo_CS в зависимости от используемого языка.

  2. В обозревателе решений щелкните правой кнопкой мыши значок решения в верхней части окна, выберите команду Добавить, а затем — Новый проект. В диалоговом окне Создание проекта перейдите на панель Типы проекта и выберите элемент Тест.

  3. На панели Шаблоны щелкните элемент Тестовый проект. Не изменяйте имя по умолчанию TestProject1. На следующем рисунке показано диалоговое окно, отображаемое в Visual C#. Диалоговое окно в Visual Basic выглядит подобным образом.

    Диалоговое окно "Создание проекта"

    Диалоговое окно "Новый тестовый проект"

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Создание проекта. Теперь все готово для создания тестов.

Создание нового класса из модульного теста

  1. Тестовый проект содержит файл с именем UnitTest1. Дважды щелкните этот файл в обозревателе решений, чтобы открыть его в редакторе кода. Будет создан тестовый класс и метод теста.

  2. Найдите объявление класса UnitTest1 и переименуйте его в AutomobileTest. Если в C# присутствует конструктор UnitTest1(), переименуйте его в AutomobileTest().

    Примечание

    Теперь функция IntelliSense поддерживает два режима завершения инструкций: режим завершения и режим предложений.Режим предложений следует применять в тех случаях, когда классы и элементы используются до их определения.Когда открыто окно IntelliSense, для переключения между режимом завершения и режимом предложений можно нажать сочетание клавиш CTRL+ALT+ПРОБЕЛ.Дополнительные сведения см. в разделе Список членов.Режим предложений предоставит справку при вводе Automobile на следующем шаге.

  3. Найдите метод TestMethod1() и переименуйте его в DefaultAutomobileIsInitializedCorrectly(). Внутри этого метода создайте новый экземпляр класса с именем Automobile, как показано в следующих примерах. Отобразится волнистая линия подчеркивания, свидетельствующая об ошибке компиляции, а под именем типа отобразится смарт-тег. Расположение смарт-тега зависит от того, используется ли Visual Basic или Visual C#.

    Visual Basic

    Подчеркивание смарт-тега на языке Visual Basic

    Visual C#

    Подчеркивание смарт-тега на языке C#

  4. Наведите указатель мыши на смарт-тег, чтобы просмотреть сообщение об ошибке, в котором сообщается о том, что тип Automobile еще не определен. Щелкните смарт-тег или нажмите клавиши CTRL+. (CTRL+точка), чтобы открыть контекстное меню "Создание в результате использования", как показано на следующем рисунке.

    Visual Basic

    Контекстное меню смарт-тега на языке Visual Basic

    Visual C#

    Контекстное меню смарт-тега на языке C#

  5. Теперь возможны два варианта. Разработчик может щелкнуть команду Создать 'Class Automobile', чтобы создать новый файл в тестовом проекте и заполнить его пустым классом с именем Automobile. Это быстрый способ создания нового типа класса в новом файле текущего проекта с модификаторами доступа по умолчанию. Пользователь также может щелкнуть команду Создать новый тип, чтобы открыть диалоговое окно Создание нового типа. Это обеспечивает размещение класса в существующем файле или добавление файла в другой проект.

    Щелкните команду Создать новый тип, чтобы открыть диалоговое окно Создание нового типа, которое показано на следующем рисунке. В списке Проект щелкните элемент GFUDemo_VB или элемент GFUDemo_CS, чтобы файл Visual Studio был добавлен в проект исходного кода, а не в тестовый проект.

    Диалоговое окно "Создание нового типа"

    Диалоговое окно "Сформировать новый тип"

  6. Нажмите кнопку ОК, чтобы закрыть диалоговое окно и создать новый файл.

  7. В обозревателе решений обратитесь к узлам проекта 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 Basic

    Visual C#

    Контекстное меню создания свойства на языке C#

Поиск исходного кода

  • Используйте функцию Перейти к для перехода к файлу исходного кода Automobile.cs или Automobile.vb, чтобы убедиться, что были созданы новые свойства.

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

    Откройте диалоговое окно Перейти к, щелкнув в окне редактора кода и нажав клавиши CTRL+, (CTRL+запятая). В текстовом поле введите automobile. Выберите в списке класс Automobile и нажмите кнопку OK.

    Окно Перейти к представлено на следующей иллюстрации.

    Окно "Перейти к"

    Диалоговое окно "Перейти"

Создание заглушки для нового конструктора

  1. В этом тестовом методе будет создана заглушка конструктора, которая выполнит инициализацию свойств 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);
    }
    
  2. Щелкните смарт-тег в новом конструкторе класса и выберите команду Создать заглушку конструктора. В файле класса Automobile обратите внимание на то, что новый конструктор определил имена локальных переменных, используемых в вызове конструктора, обнаружил свойства с одинаковыми именами в классе Automobile и создал в теле конструктора код для хранения значений аргументов в свойствах Model и TopSpeed. (В Visual Basic поля нового конструктора _model и _topSpeed являются явным образом определенными резервными полями свойств Model и TopSpeed).

  3. После создания нового конструктора под вызовом конструктора по умолчанию в DefaultAutomobileIsInitializedCorrectly отображается волнистая линия. Сообщение об ошибке указывает на то, что класс Automobile не имеет конструктора, который не принимает ни одного аргумента. Чтобы создать явный конструктор по умолчанию без параметров, щелкните смарт-тег и выберите команду Создать заглушку конструктора.

Создание заглушки метода

  1. Предположим, что согласно спецификации новый объект Automobile может быть переведен в состояние "Running", если его свойства Model и TopSpeed содержат значения, отличные от значений по умолчанию. Добавьте следующие строки к методу AutomobileWithModelNameCanStart.

    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Щелкните смарт-тег для вызова метода myAuto.Start, а затем щелкните команду Создать заглушку метода.

  3. Щелкните смарт-тег для свойства 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; }
    }
    

Запуск тестов

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

    В этом случае существует два теста, которые ожидаемым образом завершаются с ошибкой. Тест DefaultAutomobileIsInitializedCorrectly завершается с ошибкой, так как условие Assert.IsTrue возвращает значение False. Тест AutomobileWithModelNameCanStart завершается с ошибкой, так как метод Start в классе Automobile возвращает исключение.

    Окно результаты теста показано на следующем рисунке.

    Окно "Результаты теста"

    Результаты теста, завершившегося ошибкой

  2. В окне Результаты теста дважды щелкните каждую строку результата теста для перехода к месту сбоя в ходе каждого тестирования.

    Примечание

    Если после двойного щелчка не происходит перемещение в коде к сбою тестирования, для включения этой функции можно выполнить следующие действия: в меню Сервис выберите Параметры, затем разверните Средства тестирования и щелкните Выполнение теста.Поставьте флажок При двойном щелчке по результату модульного теста с неудачным или неопределенным результатом отображается точка сбоя в тесте.

Реализация исходного кода

  1. Добавьте следующий код в конструктор по умолчанию, чтобы свойства 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;
    }
    
  2. При вызове метода 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;
    }
    

Повторный запуск тестов

  • В меню Тест выберите команду Выполнить, а затем выберите Все тесты в решении. Результат на этот раз положительный. Окно результаты теста показано на следующем рисунке.

    Окно "Результаты теста"

    Переданные результаты теста

См. также

Задачи

Практическое руководство. Поиск объектов, определений и ссылок (символы)

Ссылки

Список членов

Основные понятия

Создание в результате использования