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


Модульное тестирование существующих приложений C++ с использованием обозревателя тестов

Перед изменением существующего приложения рекомендуется убедиться, что оно хорошо охвачено модульными тестами.Это уменьшает шансы того, что будущие изменения создадут новые ошибки.Если приложение не содержит модульные тесты, то их можно добавить с помощью методик, продемонстрированных в этом разделе.В этом разделе описывается добавление модульных тестов для существующего кода Visual C++ в Microsoft Visual Studio 2012, начиная с выбора метода тестирование кода, а затем создавая, кодируя и, наконец, выполняя тесты.

Определение способа тестирования кода

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

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

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

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

  • Модульные тесты будут использовать только функции, экспортированные из тестируемого кода:
    Добавьте отдельный тестовый проект.Добавьте ссылку в тестовом проекте на тестируемый проект.
Перейдите к процедуре Создание тестового проекта со ссылкой на проекта кода.
  • Тестируемый код создан как файл exe.
    Добавьте отдельный тестовый проект.Привяжите его к выходному объектному файлу.

    Перейдите к процедуре Создание тестового проекта со ссылкой на объектный файл.

  • Модульные тесты должны использовать закрытые функции и данные, и тестируемый код может быть построен как статическая библиотека:
    Измените тестируемый проект так, чтобы он компилировался в файл .lib.Добавьте отдельные тестовый проект со ссылкой на тестируемый проект.

    Данный подход имеет преимущество использования закрытых членов, но он по-прежнему содержит тесты в отдельном проекте.Однако такой подход может оказаться неподходящим для некоторых приложений, где необходимо иметь библиотеку динамической компоновки (.dll).

    Перейдите к процедуре Изменение тестируемого кода в статическую библиотеку.

  • Модульные тесты должны использовать закрытые функции и данные, и код необходимо построить как динамически подключаемую библиотеку (DLL):
    Добавьте модульные тесты в тот же проект, в котором находится код продукта.

    Перейдите к процедуре Добавление модульных тестов в тот же проект.

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

Изменение тестируемого кода в статическую библиотеку

  • Если тесты должны использовать элементы, которые не экспортированы проектом, а тестируемый проект построен как динамическая библиотека, то следует преобразовать его в статическую библиотеку.

    1. В Обозревателе решений, в контекстном меню тестируемого проекта выберите пункт Properties.Откроется окно свойств проекта.

    2. Выберите Свойства конфигурации, затем Общие.

    3. Установите Тип конфигурации в Статическая библиотека (.lib).

Продолжите процедуру Создание тестового проекта для экспортированных функций.

Для создания ссылки на экспортируемые функции из тестового проекта

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

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

      • В меню Файл выберите Создать, Проект, Visual C++, Тест, Проект модульного теста С++.
    2. В Обозревателе решений, в контекстном меню тестового проекта выберите пункт Ссылки.Откроется окно свойств проекта.

    3. Выберите Общие свойства, .NET Framework и ссылки, а затем нажмите кнопку Добавить новую ссылку.

    4. Выберите Проекты, а затем тестируемый проект.

      Нажмите кнопку Добавить.

    5. В свойствах тестового проекта добавьте расположение тестируемого проекта в каталоги включения.

      Выберите Свойства конфигурации, Каталоги VC++, Каталоги включения.

      Выберите Изменить, а затем добавьте каталог заголовков тестируемого проекта.

Перейдите к Написание модульных тестов.

Для связывания тестов с объектным файлом или файлом библиотеки

  • Если тестируемый код не экспортирует функции, которые необходимо проверить, то можно добавить файл .lib или .obj в зависимости тестового проекта.

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

      • В меню Файл выберите Создать, Проект, Visual C++, Тест, Проект модульного теста С++.
    2. В обозревателе решений в контекстном меню тестового проекта выберите пункт Свойства.Откроется окно свойств проекта.

    3. Выберите Свойства конфигурации, Компоновщик, Ввод, Дополнительные зависимости.

      Выберите Изменить и добавьте имена файлов .obj или .lib.Не используйте полный путь.

    4. Выберите Свойства конфигурации, Компоновщик, Общие, Дополнительные каталоги библиотек.

      Выберите Изменить и добавьте путь к каталогу файлов .obj или .lib.Путь обычно находится внутри папки построения тестируемого проекта.

    5. Выберите Свойства конфигурации, Каталоги VC++, Каталоги включения.

      Выберите Изменить, а затем добавьте каталог заголовков тестируемого проекта.

Перейдите к Написание модульных тестов.

Добавление модульных тестов в тот же проект

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

    1. В Обозревателе решений, в контекстном меню тестируемого проекта выберите пункт Properties.Откроется окно свойств проекта.

    2. Выберите Свойства конфигурации, Каталоги VC++.

    3. Измените каталоги включения и библиотек:

      Каталоги включения

      $(VCInstallDir)UnitTest\include;$(IncludePath)

      Каталоги библиотек

      $(VCInstallDir)UnitTest\lib;$(LibraryPath)

  2. Добавьте файл модульного тестирования С++:

    • В Обозревателе решений в контекстном меню проекта выберите Добавить, Создать элемент, а затем выберите Модульный тест С++.

Перейдите к Написание модульных тестов.

Написание модульных тестов

  1. В каждом файле кода модульного теста, добавьте оператор #include для заголовков тестируемого проекта.

  2. Добавьте тестовые классы и методы в файлы кода модульного теста.Например:

    #include "stdafx.h"
    #include "CppUnitTest.h"
    #include "MyProjectUnderTest.h"
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    namespace MyTest
    {
      TEST_CLASS(MyTests)
      {
      public:
          TEST_METHOD(MyTestMethod)
          {
              Assert::AreEqual(MyProject::Multiply(2,3), 6);
          }
      };
    }
    

Дополнительные сведения см. в разделе Модульное тестирование машинного кода с использованием обозревателя тестов.

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

  1. В меню Вид выберите Другие окна, Обозреватель тестов.

  2. В Обозревателе тестов выберите Выполнить все.

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