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


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

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

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

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

Функцию создания из использования можно использовать с платформами тестирования, которые интегрируются с Visual Studio. В этом разделе демонстрируется платформа Microsoft Unit Testing Framework.

Замечание

Инструкции в этой статье иллюстрируют последнюю версию интерактивного интерфейса разработки (IDE), доступную в Visual Studio. На компьютере могут отображаться различные имена или расположения для некоторых элементов пользовательского интерфейса. Вы можете использовать другую версию Visual Studio или разные параметры среды. Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки.

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

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

  2. В обозревателе решений щелкните правой кнопкой мыши значок решения вверху, выберите "Добавить>новый проект".

  3. Создайте новый проект модульного теста (.NET Framework).

Добавление ссылки на проект библиотеки классов

  1. В обозревателе решений в проекте модульного теста щелкните правой кнопкой мыши запись "Ссылки" и выберите "Добавить ссылку".

  2. В диалоговом окне "Диспетчер ссылок" выберите "Проекты " и выберите проект библиотеки классов.

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

  4. Сохраните решение. Теперь вы готовы приступить к написанию тестов.

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

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

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

    Замечание

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

  3. Найдите метод TestMethod1() и переименуйте его в DefaultAutomobileIsInitializedCorrectly(). В этом методе создайте новый экземпляр класса с именем Automobile, как показано на следующих снимках экрана. Появится фигурное подчеркивание, указывающее на ошибку во время компиляции, а лампочка " Быстрые действия " отображается в левом поле или непосредственно под волнистой линией при наведении указателя мыши на него.

    Быстрые действия в Visual Basic

    Быстрые действия в C#

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

  5. Нажмите кнопку "Создать новый тип" , чтобы открыть диалоговое окно "Создать тип". Это диалоговое окно предоставляет параметры, включающие создание типа в другом проекте.

  6. В списке проектов щелкните GFUDemo_VB или GFUDemo_CS , чтобы указать Visual Studio добавить файл в проект библиотеки классов вместо тестового проекта. Если он еще не выбран, нажмите кнопку "Создать файл " и назовите его Automobile.cs или Automobile.vb.

    Диалоговое окно создания нового типа

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

  8. В обозревателе решений просмотрите узел проекта GFUDemo_VB или GFUDemo_CS , чтобы убедиться в наличии нового Automobile.vb или Automobile.cs файла. В редакторе кода фокус по-прежнему находится в AutomobileTest.DefaultAutomobileIsInitializedCorrectly, что позволяет продолжать писать тест с минимальным прерыванием.

Создайте заглушку свойства

Предположим, что спецификация продукта указывает, что Automobile класс имеет два открытых свойства с именем Model и TopSpeed. Эти свойства должны быть инициализированы значениями по умолчанию "Not specified" и -1 с помощью конструктора по умолчанию. Следующий модульный тест проверяет, что конструктор по умолчанию задает свойства правильным значениям по умолчанию.

  1. Добавьте следующую строку кода в DefaultAutomobileIsInitializedCorrectly метод теста.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. Поскольку код ссылается на два неопределенных свойства Automobile, волнистое подчеркивание отображается под Model и TopSpeed. Наведите указатель мыши на Model, затем выберите значок лампочки "Быстрые действия", а затем выберите "Создать свойство Automobile.Model".

  3. Создайте заглушку для свойства TopSpeed аналогичным образом.

    Automobile В классе типы новых свойств правильно выводятся из контекста.

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

Теперь мы создадим метод тестирования, создающий заглушку конструктора, чтобы инициализировать свойства Model и TopSpeed. Позже вы добавите дополнительный код для завершения теста.

  1. Добавьте в класс следующий дополнительный метод AutomobileTest тестирования.

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. Щелкните лампочку "Быстрые действия" под красным волнистым элементом, а затем нажмите кнопку "Создать конструктор" в разделе "Автомобиль".

    Automobile В файле класса обратите внимание, что новый конструктор изучил имена локальных переменных, используемых в вызове конструктора, обнаружил свойства, имеющие те же имена в классе, и предоставил код в Automobile тексте конструктора для хранения значений аргументов в Model свойствах и TopSpeed свойствах.

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

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

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

  1. Добавьте в метод следующие строки AutomobileWithModelNameCanStart .

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Щелкните на лампочке ошибки "Быстрые действия" для вызова метода myAuto.Start, а затем щелкните Сгенерировать метод 'Automobile.Start'.

  3. Щелкните на лампочке Быстрые действия для IsRunning свойства, затем щелкните Создать свойство 'Automobile.IsRunning'.

    Теперь Automobile класс содержит метод с именем Start() и свойством с именем IsRunning.

Выполнение тестов

  1. В меню "Тест" выберите "Выполнить>все тесты".

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

    Окно результатов теста отображается на следующем рисунке.

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

  2. В окне "Результаты теста " дважды щелкните каждую строку результатов теста, чтобы перейти к расположению каждого теста.

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

  1. Добавьте следующий код в конструктор по умолчанию, чтобы свойства Model, TopSpeed и IsRunning были инициализированы их правильными значениями по умолчанию: "Not specified", -1 и False (или false для C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Start При вызове метода флаг IsRunning должен быть установлен в значение true только в том случае, если для свойств Model или TopSpeed задано значение, отличающееся от значения по умолчанию. Удалите тело метода NotImplementedException и добавьте следующий код.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

Снова запустите тесты

  • В меню "Тест" подведите курсор к "Запуск" и нажмите "Все тесты".

    На этот раз тесты проходят. Окно результатов теста отображается на следующем рисунке.

    Результаты теста, переданные