Как настроить модульное тестирование для Visual Studio C++

У меня возникли проблемы , выяснить , как получить основы тестирования настроить и использовать в Visual Studio 2008 для C++ предположительно с встроенным блоком тестирования пакета.

Приветствуются любые ссылки или учебные пособия.

Ответов (12)

Решение

Эта страница может помочь, она рассматривает довольно много фреймворков модульного тестирования C++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Единица ++
  • CxxTest

Проверьте CPPUnitLite или CPPUnitLite2 .

CPPUnitLite был создан Майклом Фезерсом , который изначально портировал JUnit из Java на C++ как CPPUnit (CPPUnit пытается имитировать модель разработки JUnit, но в C++ отсутствуют функции Java [например, отражение], чтобы упростить его использование).

CPPUnitLite пытается создать настоящую среду тестирования в стиле C++, а не платформу Java, перенесенную на C++. (Я перефразирую книгу Пера « Эффективная работа с унаследованным кодом» ). CPPUnitLite2 кажется еще одним переписанным с большим количеством функций и исправлений ошибок.

Я также только что наткнулся на UnitTest ++, который включает в себя материал из CPPUnitLite2 и некоторых других фреймворков.

Microsoft выпустила WinUnit .

Также проверьте Catch или Doctest

Я мучился с реализацией модульного тестирования для неуправляемого приложения C++ в среде Windows с Visual Studio. Так что мне удалось преодолеть и написать пост в качестве пошагового руководства по модульному тестированию неуправляемых приложений C++. Надеюсь, это поможет тебе.

Модульный тест для неуправляемого C++ в Visual Studio

Я использую UnitTest ++ .

За годы, прошедшие с тех пор, как я написал этот пост, исходный код переместился с SourceForge на github. Кроме того, пример учебного пособия теперь более агностичен - вообще не входит в какую-либо конфигурацию или настроенный проект.

Я сомневаюсь, что он по-прежнему будет работать для Visual Studio 6, поскольку файлы проекта теперь создаются через CMake. Если вам все еще нужна поддержка более старой версии, вы можете получить последнюю доступную версию в ветке SourceForge .

Я использовал CppUnit с VS2005 и Eclipse. Вики написана очень тщательно (особенно если вы знакомы с JUnit).

Я не уверен на 100% насчет VS2008, но я знаю, что фреймворк модульного тестирования, который Microsoft поставлял в VS2005 как часть своего Team Suite, был только для .NET, а не C++.

Я также использовал CppUnit, и все было хорошо. Во многом то же самое, что и NUnit / JUnit / и так далее.

Если вы использовали boost, у них также есть библиотека модульного тестирования

У ребят, стоящих за boost, есть серьезные проблемы с кодированием, поэтому я бы сказал, что их фреймворк должен быть довольно хорошим, но он может быть не самым удобным для пользователя :-)

Фреймворк, включенный в VS9, - это .NET, но вы можете писать тесты на C++ / CLI, так что, пока вам комфортно изучать некоторые .NET-измы, вы сможете тестировать практически любой код C++.

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

Мы используем фреймворк CxxTest , который намного легче; это только заголовки и использует сценарий Perl (!) для очистки информации о наборе тестов из ваших заголовков (наборы наследуются от CxxTest :: Base, имена всех ваших методов тестирования начинаются с «test»). Очевидно, для этого необходимо получить Perl из того или иного источника , что увеличивает накладные расходы на настройку среды сборки.

Насколько мне известно, модульный тестер для Visual Studio 2008 предназначен только для кода .NET.

Я использовал CppUnit в Visual Studio 2005 и обнаружил, что он неплохой.

Насколько я помню, настройка прошла относительно безболезненно. Просто убедитесь, что в ваших тестовых проектах компоновщик (Linker → Input → Additional Dependencies) включает cppunitd.lib.

Потом #include <cppunit/extensions/HelperMacros.h> в шапке.

Затем вы можете выполнить шаги, описанные в http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html, чтобы ваш тестовый класс заработал.

CxxTest мне тоже нравится по тем же причинам. Это только файл заголовка, поэтому связывание не требуется. Вы не зацикливаетесь на Perl, так как есть также бегун Python. Я скоро буду просматривать библиотеку Google. Материал Boost втягивает слишком много другого багажа.

Лично я предпочитаю WinUnit, поскольку он не требует от меня ничего писать, кроме моих тестов (я создаю .dll в качестве теста, а не exe). Я просто создаю проект, указываю WinUnit.exe в свой тестовый выходной каталог, и он запускает все, что находит. Вы можете скачать проект WinUnit здесь . (MSDN теперь требует, чтобы вы загрузили всю проблему, а не статью. WinUnit включен в нее.)

Есть способ протестировать неуправляемый C++ с помощью встроенной среды тестирования в Visual Studio 2008 . Если вы создаете тестовый проект C++ с помощью C++ / CLI, вы можете затем выполнять вызовы неуправляемой библиотеки DLL. Вам придется переключить поддержку Common Language Runtime на / clr с / clr: safe, если вы хотите протестировать код, написанный на неуправляемом C++.

У меня есть пошаговая информация в моем блоге здесь: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Все упомянутые здесь инструменты являются инструментами командной строки. Если вы ищете более интегрированное решение, обратите внимание на cfix studio , который представляет собой надстройку Visual Studio для модульного тестирования C/C++. Он очень похож на TestDriven.Net, но для (неуправляемого) C/C++, а не для .NET.

Вот подход, который я использую для тестирования модуля IIS URL Rewrite в Microsoft (он основан на командной строке, но должен работать и для VS):

  1. Убедитесь, что ваши файлы заголовков пригодны для использования, переместив исходный код в файлы cpp и при необходимости используя предварительное объявление.
  2. Скомпилируйте свой код для тестирования как библиотеку (.lib)
  3. Создайте свой проект UnitTest как C++ с поддержкой CLR.
  4. Включите файлы заголовков.
  5. Включите ваши файлы .lib.
  6. Добавьте ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Используйте действительно небольшой класс для объявления вашего модульного теста и переходите от управляемого кода к C++ / Native, как это (могут быть опечатки):

Вот пример:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

При таком подходе людям не нужно изучать слишком много материала C++ / CLI, весь реальный тест будет выполняться на нативном языке C++, а класс TestShim будет использоваться для `` публикации '' теста в MSTest.exe (или сделать его видимым). ).

Для добавления новых тестов вы просто объявляете новый метод [TestMethod] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest (). Никаких макросов, никаких хитростей, все понятно.

Теперь файл заголовка является необязательным, но его можно использовать для предоставления методов класса Assert с собственными сигнатурами C++ (например, wchar_t * вместо Stirng ^), чтобы вы могли держать его близко к C++ и вдали от C++ / CLI. :

Вот пример:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH