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

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

Любые ссылки или руководства будут оценены.

Ответ 1

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

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unit ++
  • CxxTest

Отметьте CPPUnitLite или CPPUnitLite2.

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

  • Убедитесь, что ваши файлы заголовков расходуются, перемещая исходный код в файлы cpp и используя при необходимости форвардное объявление.
  • Скомпилируйте свой код для тестирования в качестве библиотеки (.lib)
  • Создайте проект UnitTest как С++ с поддержкой CLR.
  • Включите файлы заголовков.
  • Включите ваши .lib файлы.
  • Добавить ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  • Используйте действительно маленький класс для объявления вашего unit test и перехода от управляемого к С++/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();
  }
};

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

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

Теперь файл heade является необязательным, но его можно использовать для раскрытия методов класса Assert с помощью собственных сигнатур С++ (например, wchar_t * вместо Stirng ^), так что вы можете поддерживать его близко к С++ и далеки от С++/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)

НТН

Ответ 4

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

Ответ 5

Рамка, включенная в VS9, -.NET, но вы можете писать тесты в С++/CLI, поэтому, если вам удобно изучать некоторые .NET-isms, вы должны проверить большинство С++-кода.

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Я тоже использовал CppUnit, и все было в порядке. То же самое, что и NUnit/JUnit/so.

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

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

Ответ 10

Тестер модулей для 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, чтобы ваш тестовый класс работал.

Ответ 11

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

Ответ 12

Мне пришлось выполнять модульное тестирование для неуправляемого приложения С++ в среде Windows с помощью Visual Studio. Поэтому мне удалось преодолеть и написать сообщение как пошаговое руководство по неуправляемому тестированию модулей С++. Надеюсь, это может вам помочь.

Unit test для неуправляемого С++ в Visual Studio