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

94
我在尝试在 Visual Studio 2008 中使用内置的单元测试套件,来对C ++进行测试。然而我无法弄清如何设置和使用该测试框架。

请提供任何链接或教程,谢谢!


Google发布了C++测试框架,它与xUnit框架非常相似。http://code.google.com/p/googletest/ - popopome
你最终使用了哪个框架? - Joakim Karlsson
实际上,我还没有使用过它们。我决定对于我正在处理的工作来说,单元测试不是最有效的时间利用方式。 - DShook
12个回答

57

这个页面 可能会有所帮助,它评论了相当多的C++单元测试框架:

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

看看CPPUnitLite CPPUnitLite2

CPPUnitLite 是由 Michael Feathers 创建的,他最初将 Java 的 JUnit 移植到 C++ 中作为 CPPUnit(CPPUnit 试图模仿 JUnit 的开发模型 - 但是 C++ 缺少 Java 的特性 [例如反射],使其难以使用)。

CPPUnitLite 试图创建一个真正的 C++ 风格的测试框架,而不是一个从 Java 移植到 C++ 的框架。 (我在 Feather 的书 Working Effectively with Legacy Code 中间接引述)。 CPPUnitLite2 似乎是另一个重写版本,具有更多的功能和缺陷修复。

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

微软发布了 WinUnit

还可以查看CatchDoctest


3
Google测试框架与boost::test非常相似,但更容易集成到VS中。 - Martin Beckett
3
我很惊讶这里没有提到 Catch。同时,也请查看 doctest - 这是我重新实现的Catch,着重关注编译速度 - 请查看FAQ,了解两者的不同之处。 - onqtam
1
@onqtam 不要太惊讶,这个问题/答案是来自2008年的!我已经添加了你建议的链接。 - Aardvark

25
有一种方法可以使用Visual Studio 2008内置的测试框架测试未托管的C++代码。如果创建一个C++测试项目,并使用C++/CLI,就可以调用未托管的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

9

以下是我用于测试微软IIS URL Rewrite模块的方法(基于命令行,但也适用于VS):

  1. 确保您的头文件可消耗,将源代码移动到cpp文件中,并在需要时使用前向声明。
  2. 将代码编译为库(.lib)以进行测试。
  3. 创建支持CLR的C++ UnitTest项目。
  4. 包含您的头文件。
  5. 包含您的.lib文件。
  6. 添加对Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll的引用。
  7. 使用一个非常小的类来声明您的单元测试,并像这样从托管代码跳转到C++/本机代码(可能会有拼写错误):

这里是一个例子:

// 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()本地函数。没有宏,没有技巧,直截了当。
现在,头文件是可选的,但可以用于使用C++本地签名(例如wchar_t*而不是String^)公开Assert类的方法,因此它可以让您保持接近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


6

就我个人而言,我更喜欢 WinUnit,因为它不需要我编写除测试以外的任何内容(我将.dll作为测试构建,而不是.exe)。 我只需构建一个项目,然后将WinUnit.exe指向我的测试输出目录,并运行它找到的所有内容。您可以在此下载WinUnit项目。(MSDN现在要求您下载整个问题,而不是文章。WinUnit已包含在其中。)


4

VS9附带的框架是.NET,但您可以使用C++ / CLI编写测试,只要您习惯于学习一些.NET技巧,就应该能够测试大多数C++代码。

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

我们使用的框架是CxxTest,它非常轻巧;它仅包含头文件,并使用Perl(!)脚本从您的头文件中提取测试套件信息(套件继承自CxxTest :: Base,所有测试方法的名称以“test”开头)。显然,这需要您从一个来源另一个获取Perl,这会增加构建环境设置的开销。


CxxTest可以使用Python代替Perl。 - Martin Beckett
你还需要注意代码所需的任何DLL - 我曾经在尝试加载DLL时遇到了NUnit和mbUnit测试C++/CLI代码的问题。 - Andy Dent

2
这里提到的工具都是命令行工具。如果你想要更集成化的解决方案,可以看看cfix studio,它是一个用于C/C++单元测试的Visual Studio插件。它与TestDriven.Net相似,但适用于(非托管的)C/C++而不是.NET。

2

我使用UnitTest++

自从我发表这篇文章以来,源代码已经从SourceForge移动到了github。此外,示例教程现在更加不可知 - 它不再涉及任何配置或项目设置。

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


1

我曾经苦恼于在 Windows 环境下的 Visual Studio 中实现非托管 C++ 应用程序的单元测试。最终我克服了这个问题,并编写了一篇逐步指南,以帮助进行非托管 C++ 应用程序的单元测试。我希望它能对你有所帮助。

Visual Studio 中的非托管 C++ 单元测试


1

我曾在VS2005和Eclipse中使用CppUnit。如果你熟悉JUnit,那么这个维基百科非常详尽。


1

我不确定VS2008,但我知道微软在VS2005中发布的单元测试框架只适用于.NET,而不是C++。

我也使用过CppUnit,还可以。与NUnit/JUnit/等类似。

如果您使用过boost,它们也有一个单元测试库

boost背后的人有一些严肃的编码技巧,所以我认为他们的框架应该很好,但可能不是最用户友好的:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接