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

我无法弄清楚如何使用内置的单元测试套件在Visual Studio 2008 for C ++中设置和使用测试框架。

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

0
额外 编辑
意见: 2
实际上我还没有使用过它们中的任何一个。我决定单元测试的工作并不是最有效的时间使用。
额外 作者 DShook,
Google发布了与xUnit框架非常相似的C ++测试框架。 http://code.google.com/p/googletest/
额外 作者 popopome,
你最终使用了什么框架?
额外 作者 Joakim Karlsson,

11 答案

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

我也用过CppUnit,它没问题。和NUnit / JUnit /很相似。

If you've used boost, they also have a unit testing library

后面的人有一些严肃的编码印记,所以我会说他们的框架应该很好,但它可能不是用户最友好的:-)

0
额外

我使用 UnitTest ++

在我发布这篇文章后的几年中,源代码已经从SourceForge转移到了github。还有示例教程现在更加不可知论 - 完全没有进入任何配置或项目。

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

0
额外

There is a way to test unmanaged C++ using the built in testing framework within Visual Studio 2008. If you create a C++ Test Project, using C++/CLI, you can then make calls to an unmanaged DLL. You will have to switch the Common Language Runtime support to /clr from /clr:safe if you want to test code that was written in unmanaged C++.

I have step by step details on my blog here: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

0
额外
这确实对你的C ++代码有一定的限制,至少有一个代码库试图将它的头文件包含到C ++ / CLI代码中比它的价值更麻烦。对我来说使用C ++ / CLI的最大好处是你可以使用类似RowBest的属性在mbUnit / NUnit / xUnit.Net中进行时髦的参数化测试
额外 作者 Andy Dent,
太好了,我很高兴这是可能的,谢谢:)
额外 作者 DanDan,

我忍受着用Visual Studio在Windows环境中对非托管C ++应用程序执行单元测试。所以我设法克服并写了一篇文章,作为非托管C ++应用程序单元测试的逐步指导。我希望它可以帮助你。

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

0
额外

The unit tester for Visual Studio 2008 is only for .NET code as far as I know.

I used CppUnit on Visual Studio 2005 and found it to be pretty good.

据我所知,设置是相对无痛的。只要确保在你的测试项目中链接器(Linker?Input?Additional Dependencies)包含cppunitd.lib。

Then, #include in your header.

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

0
额外

This page may help, it reviews quite a few C++ unit test frameworks:

  • CppUnit
  • 如Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • 单位++
  • CxxTest

查看 CPPUnitLiteCPPUnitLite2

CPPUnitLite was created by Michael Feathers, who originally ported Java's JUnit to C++ as CPPUnit (CPPUnit tries mimic the development model of JUnit - but C++ lacks Java's features [e.g. reflection] to make it easy to use).

CPPUnitLite试图构建一个真正的C ++风格的测试框架,而不是一个移植到C ++的Java框架。 (我从Feather的有效地使用遗留代码书中转述)。 CPPUnitLite2 似乎是另一个重写,具有更多功能和错误修复。

我也偶然发现 UnitTest ++ 其中包括来自CPPUnitLite2和其他框架的东西。

微软发布了 WinUnit

Also checkout Catch or Doctest

0
额外
我很惊讶这里没有提到 Catch 。同时结帐 doctest - 我重新编译Catch,注重编译速度 - 签出常见问题 to看两者有什么不同
额外 作者 onqtam,
@onqtam不要太惊讶,这个问题/答案是从2008年起!添加了你建议的链接。
额外 作者 Aardvark,
Googletest与boost :: test非常相似,但是更容易集成到VS中
额外 作者 Martin Beckett,
额外 作者 inazaruk,

VS9 包含的框架是.NET,但您可以使用C ++ / CLI编写测试,因此只要您习惯于学习某些.NET主题,就应该可以测试大多数C ++代码。

boost.test and googletest look to be fairly similar, but adapted for slightly different uses. Both of these have a binary component, so you'll need an extra project in your solution to compile and run the tests.

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

0
额外
您还需要注意代码所需的任何DLL - 我在NUnit和mbUnit测试C ++ / CLI代码时遇到问题,试图加载DLL。
额外 作者 Andy Dent,
CxxTest可以使用python而不是perl
额外 作者 Martin Beckett,

就个人而言,我更喜欢 WinUnit ,因为它不要求我<< href =“http://www.wintellect.com/cs/blogs/jrobbins/archive/2008/01/17/winunit-an-outstanding-native-c-unit-testing-tool.aspx”rel =“noreferrer” >除了我的测试,写任何东西(我建立一个.dll作为测试,而不是exe)。我只是建立一个项目,并将WinUnit.exe指向我的测试输出目录,并运行找到的所有内容。您可以在此处下载WinUnit项目。 (MSDN现在要求您下载整个问题,而不是文章,WinUnit包含在其中。)

0
额外
请注意,WinUnit已转移到CodePlex winunit.codeplex.com
额外 作者 Andy Dent,

我在VS2005和Eclipse中使用了 CppUnit 。维基是非常彻底的(特别是如果你熟悉JUnit的话)。

0
额外

我也喜欢CxxTest,原因相同。它只是一个头文件,所以不需要链接。你不会因为Perl而陷入困境,因为它也有Python runner。我将很快审查谷歌图书馆。提升的东西拉太多的其他行李。

0
额外

这里是我用来测试微软IIS URL重写模块的方法(它是基于命令行的,但也适用于VS):

  1. 通过将源代码移至cpp文件并根据需要使用前向声明,确保您的头文件是可消费的。
  2. 编译您的代码以测试库(.lib)
  3. 将您的UnitTest项目创建为具有CLR支持的C ++。
  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();}方法和一个新的NewTest()原生函数。没有宏,没有技巧,直截了当。

现在,heade文件是可选的,但它可以用于使用C ++本机签名(例如wchar_t *而不是Stirng ^)公开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
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH

0
额外