如何为Visual Studio C ++设置单元测试
我在弄清楚如何建立测试框架以及在Visual Studio 2008 for C ++中使用内置框架测试套件时遇到了麻烦。
任何链接或者教程,将不胜感激。
解决方案
回答
我使用UnitTest ++。
自从我发表这篇文章以来的岁月里,源代码已经从SourceForge转移到了github。另外,示例教程现在更加不可知,根本不需要进行任何配置或者项目设置。
我怀疑它是否仍适用于Visual Studio 6,因为现在通过CMake创建了项目文件。如果仍然需要较早的版本支持,则可以在SourceForge分支下获取最新的可用版本。
回答
我在VS2005和Eclipse中使用了CppUnit。 Wiki非常详尽(特别是如果我们熟悉JUnit)。
回答
我对VS2008不确定100%,但是我知道Microsoft在VS2005中作为Team Suite的一部分提供的单元测试框架仅适用于.NET,而不适用于C ++。
我也用过CppUnit,没关系。与NUnit / JUnit /等等基本相同。
如果我们使用过Boost,他们也有一个单元测试库
boost背后的家伙有一些严重的编码问题,所以我想说他们的框架应该很好,但是它可能不是最用户友好的:-)
回答
VS9包含的框架是.NET,但是我们可以用C ++ / CLI编写测试,因此,只要我们愿意学习一些.NET形式,就应该能够测试大多数任何C ++代码。
增强测试
和googletest
看起来相当相似,但适用于稍有不同的用途。两者都有一个二进制组件,因此我们在解决方案中需要一个额外的项目来编译和运行测试。
我们使用的框架是CxxTest,它轻巧得多。它仅是标题,并使用Perl(!)脚本从标题中刮取测试套件信息(套件继承自CxxTest :: Base,所有测试方法的名称均以" test"开头)。显然,这要求我们从一种或者多种来源获得Perl,这会增加构建环境设置的开销。
回答
据我所知,VisualStudio2008的单元测试器仅适用于.NET代码。
我在VisualStudio2005上使用了CppUnit,发现它相当不错。
据我所知,该设置相对来说很轻松。只要确保测试项目中的链接器(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 ++单元测试框架:
- CppUnit
- 升压测试
- CppUnitLite
- NanoCppUnit
- 单位++
- Cxx测试
签出CPPUnitLite或者CPPUnitLite2.
CPPUnitLite由迈克尔·费瑟斯(Michael Feathers)创建,他最初将Java的JUnit移植为C ++作为CPPUnit(CPPUnit试图模仿JUnit的开发模型,但C ++缺乏Java的功能(例如,反射)使其易于使用)。
CPPUnitLite尝试创建一个真正的C ++样式的测试框架,而不是移植到C ++的Java。 (我从Feather的《有效处理旧版代码》一书中解说)。 CPPUnitLite2似乎是另一个重写,具有更多功能和错误修复。
我也偶然发现了UnitTest ++,其中包括CPPUnitLite2和其他框架的内容。
Microsoft已发布WinUnit。
同时结帐Catch或者Doctest
回答
就个人而言,我更喜欢WinUnit,因为它不需要我写测试以外的任何东西(我将.dll作为测试而不是exe构建)。我只是构建一个项目,然后将WinUnit.exe指向我的测试输出目录,它会运行找到的所有内容。我们可以在此处下载WinUnit项目。 (MSDN现在要求我们下载整个问题,而不是文章。WinUnit包含在其中。)
回答
有一种方法可以使用Visual Studio 2008中的内置测试框架来测试非托管C ++。如果使用C ++ / CLI创建C ++测试项目,则可以调用非托管DLL。如果要测试使用非托管C ++编写的代码,则必须将"公共语言运行时"支持从/ clr:safe切换到/ clr。
我在这里的博客上有逐步的详细信息:http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/
回答
这里提到的工具都是命令行工具。如果我们需要一个更集成的解决方案,请查看cfix studio,它是用于C / C ++单元测试的Visual Studio插件。它与TestDriven.Net非常相似,但适用于(非托管)C / C ++,而不是.NET。
回答
这是我用来在Microsoft测试IIS URL Rewrite模块的方法(它是基于命令行的,但也应该适用于VS):
- 通过将源代码移至cpp文件并在需要时使用前向声明来确保头文件是可使用的。
- 编译代码以测试为库(.lib)
- 在CLR的支持下,将UnitTest项目创建为C ++。
- 包括头文件。
- 包括.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()本机函数。没有宏,没有花招,直截了当。
现在,可以选择heade文件,但是可以使用它来公开具有C ++本机签名的Assert类的方法(例如,用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)
高温超导