如何为Visual Studio C ++设置单元测试


93

我在弄清楚如何设置测试框架以及如何在Visual Studio 2008C++中将其用于内置单元测试套件方面遇到了麻烦。

任何链接或教程,将不胜感激。


Google发布了与xUnit框架非常相似的C ++测试框架。http://code.google.com/p/googletest/-popopome
08/20

您最终使用什么框架?
Joakim Karlsson,2009年

实际上我仍然没有用过它们。我认为我在单元测试上所做的工作并不是最有效的时间利用。
DShook,

Answers:


56

该页面可能会有所帮助,它回顾了许多C ++单元测试框架:

  • CppUnit
  • 增强测试
  • CppUnitLite
  • NanoCppUnit
  • 单位++
  • Cxx测试

CPPUnitLiteCPPUnitLite2

CPPUnitLite是由Michael Feathers创建的,他最初将Java的JUnit移植为C ++作为CPPUnit(CPPUnit试图模仿JUnit的开发模型-但是C ++缺乏Java的功能(例如,反射)使其易于使用)。

CPPUnitLite尝试创建一个真正的C ++风格的测试框架,而不是移植到C ++的Java。(我从Feather的《有效处理旧版代码》一书中解说)。CPPUnitLite2似乎是另一个重写,具有更多功能和错误修复。

我还偶然发现了UnitTest ++,其中包括CPPUnitLite2和其他框架中的内容。

Microsoft已发布WinUnit

同时结帐CatchDoctest


2
Googletest非常类似的boost ::测试,但一点更容易融入VS
马丁贝克特

3
我很惊讶这里没有提到Catch。还要签出doctest-我对Catch的重新实现,重点是编译速度-签出FAQ,看看两者之间有什么不同
onqtam,2013年

1
@onqtam不要太惊讶,这个问题/答案来自2008年!添加了您建议的链接。
Aardvark

24

有一种方法可以使用Visual Studio 2008中的内置测试框架来测试非托管C ++。如果使用C ++ / CLI创建C ++测试项目,则可以调用非托管DLL。如果要测试使用非托管C ++编写的代码,则必须将公共语言运行时支持从/ clr:safe切换到/ clr。

我在这里的博客上有逐步的详细信息:http : //msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
这确实对您的C ++代码施加了一定的限制,我至少有一个代码库,尝试将其标头包含在C ++ / CLI代码中比它值得的麻烦更多。使用C ++ / CLI给我带来的最大好处是,您可以对mbUnit / NUnit / xUnit.Net中的RowTest等属性使用时髦的参数化测试
Andy Dent 2010年

9

这是我用来在Microsoft测试IIS URL Rewrite模块的方法(它是基于命令行的,但也适用于VS):

  1. 通过将源代码移动到cpp文件并在需要时使用前向声明来确保头文件是可使用的。
  2. 编译代码以测试为库(.lib)
  3. 创建具有CLR支持的C ++的UnitTest项目。
  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()本机函数。没有宏指令,没有技巧。

现在,可以选择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)

高温超导



4

VS9包含的框架 .NET,但是您可以用C ++ / CLI编写测试,因此,只要您愿意学习一些.NET形式,就应该能够测试大多数任何C ++代码。

boost.testgoogletest 看起来非常相似,但适用于稍有不同的用途。两者都有一个二进制组件,因此您在解决方案中需要一个额外的项目来编译和运行测试。

我们使用的框架是CxxTest,它轻巧得多。它仅是标题,并使用Perl(!)脚本从标题中刮取测试套件信息(套件继承自CxxTest :: Base,所有测试方法的名称均以“ test”开头)。显然,这需要你从Perl中得到一个源另一个,这就增加了开销到您的构建环境设置。


CxxTest可以使用python代替perl
Martin Beckett

您还需要注意代码所需的任何DLL-我在使用NUnit和mbUnit测试C ++ / CLI代码时遇到问题,试图加载DLL。
安迪·邓特

2

我使用UnitTest ++

自从我发表这篇文章以来的几年中,源代码已经从SourceForge迁移到github。此外,示例教程现在更加不可知-完全不需要进行任何配置或项目设置。

我怀疑它是否仍适用于Visual Studio 6,因为现在通过CMake创建了项目文件。如果仍然需要较早的版本支持,则可以在SourceForge分支下获取最新的可用版本。


2

此处提到的工具都是命令行工具。如果您需要更集成的解决方案,请查看cfix studio,它是用于C / C ++单元测试的Visual Studio 插件。它与TestDriven.Net非常相似,但适用于(非托管)C / C ++,而不是.NET。


1

我在VS2005和Eclipse中使用了CppUnit。Wiki非常详尽(特别是如果您熟悉JUnit)。


1

我对VS2008不确定100%,但是我知道Microsoft在VS2005中作为Team Suite的一部分提供的单元测试框架仅适用于.NET,而不适用于C ++。

我也用过CppUnit,没关系。与NUnit / JUnit /等等基本相同。

如果您使用过Boost,他们还有一个单元测试库

boost背后的家伙有一些严重的编码问题,所以我想说他们的框架应该很好,但是它可能不是最用户友好的:-)


1

出于相同的原因,我也喜欢CxxTest。它只是一个头文件,因此不需要链接。您也不会被Perl所吸引,因为它也有Python运行器。我将很快复习Google图书馆。Boost的东西会带来太多其他负担。


1

据我所知,Visual Studio 2008的单元测试器仅适用于.NET代码。

我在Visual Studio 2005上使用了CppUnit,发现它相当不错。

据我所知,该设置相对来说很轻松。只要确保您的测试项目中的链接器(链接器→输入→其他依赖项)包含cppunitd.lib。

然后,#include <cppunit/extensions/HelperMacros.h>在标题中。

然后,您可以按照http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html中的步骤进行操作,以使测试类正常工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.