Мне сложно понять, как настроить среду тестирования и использовать ее в Visual Studio 2008 для C++, предположительно со встроенным набором модульного тестирования.
Приветствуются любые ссылки или учебные пособия.
на самом деле я до сих пор не использовал ни один из них. Я решил, что то, над чем я работал, модульные тесты - не самое эффективное использование времени.
Google выпускает C++ Test Framework, который очень похож на фреймворки xUnit. http://code.google.com/p/googletest/





Я использую UnitTest ++.
За годы, прошедшие с тех пор, как я написал этот пост, исходный код переместился с SourceForge на github. Кроме того, пример учебника теперь более агностичен - он вообще не входит в какую-либо конфигурацию или настройку проекта.
Я сомневаюсь, что он по-прежнему будет работать для Visual Studio 6, поскольку файлы проекта теперь создаются через CMake. Если вам все еще нужна поддержка более старой версии, вы можете получить последнюю доступную версию в ветке SourceForge.
Я использовал CppUnit с VS2005 и Eclipse. Вики написана очень тщательно (особенно если вы знакомы с JUnit).
Я не уверен на 100% в VS2008, но я знаю, что фреймворк модульного тестирования, который Microsoft поставлял в VS2005 как часть своего Team Suite, был только для .NET, а не C++.
Я также использовал CppUnit, и все было хорошо. Во многом то же самое, что и NUnit / JUnit / и так далее.
Если вы использовали буст, они также есть библиотека модульного тестирования
У ребят, стоящих за boost, есть некоторые варианты кодирования серьезный, поэтому я бы сказал, что их структура должна быть довольно хорошей, но она может быть не самой удобной для пользователя :-)
Фреймворк включен в VS9 является .NET, но вы можете писать тесты на C++ / CLI, так что, пока вам комфортно изучать некоторые .NET-измы, вы сможете тестировать практически любой код C++.
boost.test и googletest выглядят довольно похожими, но адаптированными для немного разных целей. Оба они имеют двоичный компонент, поэтому вам понадобится дополнительный проект в вашем решении для компиляции и запуска тестов.
Мы используем фреймворк CxxTest, который намного легче; это только заголовки, и он использует сценарий Perl (!) для очистки информации о наборе тестов из ваших заголовков (наборы наследуются от CxxTest :: Base, имена всех ваших методов тестирования начинаются с «test»). Очевидно, для этого необходимо получить Perl из один источник или еще один, что увеличивает накладные расходы на настройку среды сборки.
CxxTest может использовать python вместо perl
Вы также должны быть осторожны с любыми DLL, которые требуются вашему коду - у меня были проблемы с NUnit и mbUnit, тестировавшим код C++ / CLI, пытаясь загрузить библиотеки DLL.
Насколько мне известно, модульный тестер для 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 втягивает слишком много другого багажа.
Эта страница может помочь, он рассматривает довольно много фреймворков модульного тестирования C++:
Проверьте CPPUnitLite или CPPUnitLite2.
CPPUnitLite был создан Майклом Фезерсом, который изначально портировал JUnit из Java на C++ как CPPUnit (CPPUnit пытается имитировать модель разработки JUnit, но в C++ отсутствуют функции Java (например, отражение), чтобы упростить его использование).
CPPUnitLite пытается создать настоящую среду тестирования в стиле C++, а не платформу Java, перенесенную на C++. (Я перефразирую книгу Feather's Эффективная работа с устаревшим кодом). CPPUnitLite2 кажется еще одним переписанным с большим количеством функций и исправлений ошибок.
Я также только что наткнулся на UnitTest ++, который включает в себя материал из CPPUnitLite2 и некоторых других фреймворков.
Microsoft выпустила WinUnit.
Также проверьте Ловить или Доктест
Googletest очень похож на boost :: test, но немного проще интегрировать в VS
Я удивлен, что Ловить здесь не упоминается. Также проверьте доктест - мою повторную реализацию Catch с огромным упором на скорость компиляции - проверьте Часто задаваемые вопросы, чтобы увидеть разницу между ними
@onqtam, не удивляйтесь, это вопрос / ответ из 2008 года! Добавлены предложенные вами ссылки.
Лично я предпочитаю 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/
Это накладывает определенные ограничения на ваш код C++, у меня есть по крайней мере одна база кода, где попытка включить ее заголовки в код C++ / CLI была больше проблем, чем она того стоила. Большим преимуществом использования C++ / CLI для меня является то, что вы можете использовать фанки параметризованное тестирование с такими атрибутами, как RowTest в mbUnit / NUnit / xUnit.Net.
Все упомянутые здесь инструменты являются инструментами командной строки. Если вы ищете более интегрированное решение, обратите внимание на cfix studio, который представляет собой надстройку Visual Studio для модульного тестирования C / C++. Он очень похож на TestDriven.Net, но для (неуправляемого) C / C++, а не для .NET.
Вот подход, который я использую для тестирования модуля IIS URL Rewrite в Microsoft (он основан на командной строке, но должен работать и для VS):
Вот пример:
// 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
Я мучился с реализацией модульного тестирования для неуправляемого приложения C++ в среде Windows с Visual Studio. Так что мне удалось преодолеть и написать пост в качестве пошагового руководства по модульному тестированию неуправляемых приложений C++. Надеюсь, это поможет вам.
Какой фреймворк вы в конечном итоге использовали?