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