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


Краткое руководство. Разработка через тестирование с использованием обозревателя тестов

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

Обозреватель тестов замещает окна модульных тестов предыдуших выпусков Visual Studio.Преимущества:

  • Возможность запуска .NET, базы данных и других типов тестов с использованием единого интерфейса.

  • Возможность использовать платформу модульных тестов, например NUnit или MSTest.

  • Возможность увидеть всю информацию, которая обычно требуется в одном окне.Более подробные сведения можно найти в окне Свойства.

Использование обозревателя тестов

Запуск модульных тестов с помощью обозревателя тестов

  1. Создайте модульные тесты, которые используют выбранные тестовые среды.

    Например для создания теста, использующего платформу MSTest:

    1. Создайте тестовый проект.

      В диалоговом окне Создать проект разверните Visual Basic, Visual C# или Visual C++, а затем выберите Тест.

      Выберите Проект модульных тестов.

    2. Напишите каждый модульный тест в виде метода.Добавьте каждый тестовый метод к атрибуту [TestMethod].

  2. В строке меню выберите Тест, Выполнение модульных тестов, Все тесты.

    Построения решений и запуск тестов.

    Обозреватель тестов откроет и отобразит сводку результатов.

Отображение полного списка тестов: Выберите Показать все в любой категории.

Для возвращения к сводке, выберите представление HOME.

Отображение подробностей результатов теста: Выберите тест в обозревателе тестов.Детальная информация, такая как сообщения исключений, появится в области сведений.Можно также просмотреть подробности в окне «Свойства».

Переход к коду теста: Дважды щелкните тест в обозревателе тестов или выберите Открыть тест в контекстном меню.

Отладка теста: Откройте контекстное меню для одного или нескольких тестов, а затем выберите Отладка выбранных тестов.

Важное примечаниеВажно

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

ПримечаниеПримечание

Если тест не отображается, то убедитесь в том, что был установлен адаптер для связи обозревателя тестов с используемой для тестов платформой .Дополнительные сведения см. в разделе Использование различных сред тестов с обозревателем тестов.

Пошаговое руководство: Использование модульных тестов для разработки метода

В данном пошаговом руководстве показано, как разработать тестируемый метод в C# с помощью стред тестирования модулей Майкрософт.Можно легко адаптировать его, для других языков, а также использовать другие тестовые среды, таких как NUnit.Для получения дополнительных сведений см. Использование различных тестовых платформ.

Создание теста и метода

  1. Создайте проект библиотеки классов Visual C#.Данный проект будет содержать код, который необходимо предоставить.В данном примере, именем является MyMath.

  2. Создайте тестовый проект.

    • В диалоговом окне Создать проект выберите Visual C#, Тест, а затем выберите Проект модульного теста.

      Новые проекты кода и тестов

  3. Напишите основной тестовый метод.Проверьте результат, полученный для определенных входных данных:

      [TestMethod]
      public void BasicRooterTest()
      {
        // Create an instance to test:
        Rooter rooter = new Rooter();
        // Define a test input and output value:
        double expectedResult = 2.0;
        double input = expectedResult * expectedResult;
        // Run the method under test:
        double actualResult = rooter.SquareRoot(input);
        // Verify the result:
        Assert.AreEqual(expectedResult, actualResult,
            delta: expectedResult / 100);
      }
    
  4. Генерация метод из теста.

    1. Поместите курсор на Rooter и в контекстном меню выберите пункт Создать, Новый тип.

    2. В диалоговом окне Создать новый тип, установите Проект в проект библиотеки классов.В этом примере задается имя MyMath.

    3. Поместите курсор на SquareRoot и в контекстном меню выберите пункт Создать, Заглушки метода.

  5. Выполнить модульный тест.

    • В меню Тест выберите Выполнение модульных тестов, Все тесты.

      Построения и выполнения решений.

      Обозреватель тестов откроет и отобразит результаты.

      Данный тест отобразится в разделе Неудачные тесты.

  6. Выберите имя теста.

    Дополнительные сведения о тесте появятся в нижней части обозревателя тестов.

  7. Выберие элементы в разделе Трассировка стека, чтобы увидеть, где тест не пройден.

Обозреватель модульных тестов с непройденным тестом.

На данном этапе создан тест и заглушка, которые будут изменены таким образом, что тест будет успешно пройден.

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

  1. В MyMath\Rooter.cs, усовершенствуйте код SquareRoot:

     public double SquareRoot(double input)
      {
        return input / 2;
      }
    
  2. В обозревателе тестов выберите Выполнить все.

    Код построения и выполнение тестов.

    Тест проходит.

    Обозреватель модульных тестов с пройденным тестом.

Добавьте тесты, чтобы расширить диапазон входных данных

  1. Для уверенности, что код работает во всех случаях, добавьте тесты, которые используют более широкий диапазон входных значений.

    СоветСовет

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

    В тестовом классе добавьте следующий тест, который использует диапазон входных значений:

      [TestMethod]
      public void RooterValueRange()
      {
        // Create an instance to test:
        Rooter rooter = new Rooter();
        // Try a range of values:
        for (double expectedResult = 1e-8;
            expectedResult < 1e+8;
            expectedResult = expectedResult * 3.2)
        {
          RooterOneValue(rooter, expectedResult);
        }
      }
    
      private void RooterOneValue(Rooter rooter, double expectedResult)
      {
        double input = expectedResult * expectedResult;
        double actualResult = rooter.SquareRoot(input);
        Assert.AreEqual(expectedResult, actualResult,
            delta: expectedResult / 1000);
      }
    
  2. В обозревателе тестов выберите Выполнить все.

    Новый тест завершается неудачей, несмотря на то, что по-прежнему первый тест завершается успешно.

    Для нахождения точки сбоя выберите завершенный неудачей тест в нижней части обозревателя тестов, выберите верхний элемент Трассировка стека.

  3. Проверьте метод теста, чтобы увидеть, что может быть причиной неудачи.В классе MyMath.Rooter перепишите код:

      public double SquareRoot(double input)
      {
        double result = input;
        double previousResult = -input;
        while (Math.Abs(previousResult - result) > result / 1000)
        {
          previousResult = result;
          result = result - (result * result - input) / (2 * result);
        }
        return result;
      }
    
  4. В обозревателе тестов выберите Выполнить все.

    Теперь оба теста успешно завершаются.

Добавьте тесты в исключительных случаях

  1. Добавление тесты для отрицательных входных значений:

           [TestMethod]
            public void RooterTestNegativeInputx()
            {
                Rooter rooter = new Rooter();
                try
                {
                    rooter.SquareRoot(-10);
                }
                catch (ArgumentOutOfRangeException e)
                {
                    return;
                }
                Assert.Fail();
            }
    
  2. В обозревателе тестов выберите Выполнить все.

    Метод теста зацикливается и должны быть отменен вручную.

  3. Выберите Отмена.

    Тест останавливается после 10 секунд.

  4. Исправьте код метода:

      public double SquareRoot(double input)
      {
        if (input <= 0.0) 
        {
          throw new ArgumentOutOfRangeException();
        } 
      ...
    
  5. В обозревателе тестов выберите Выполнить все.

    Все тесты успешно завершаются.

Оптимизация без изменения тестов

  1. Упростить код, но не изменяйте тесты.

    СоветСовет

    Оптимизация — это изменение, которое делает код более производительным или более понятным.Она не предназначена для изменения поведения кода, поэтому тесты не изменяются.

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

      public class Rooter
      {
        public double SquareRoot(double input)
        {
          if (input <= 0.0) 
          {
            throw new ArgumentOutOfRangeException();
          }
          double result = input;
          double previousResult = -input;
          while (Math.Abs(previousResult - result) > result / 1000)
          {
            previousResult = result;
            result = (result + input / result) / 2;
            //was: result = result - (result * result - input) / (2*result);
          }
          return result;
        }
      }
    
  2. Выберите Запустить все.

    Все тесты по-прежнему завершаются успехом.

    Обозреватель модульных тестов с тремя пройденными тестами.