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

DSh*_*ook 92 c++ testing unit-testing visual-studio

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

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

Aar*_*ark 56

这个页面可能有所帮助,它回顾了不少C++单元测试框架:

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

查看CPPUnitLiteCPPUnitLite2.

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

CPPUnitLite试图建立一个真正的C++风格的测试框架,而不是一个移植到C++的Java框架.(我从"羽毛的有效工作与遗产代码"一书中解释).CPPUnitLite2似乎是另一个重写,具有更多功能和错误修复.

我也偶然发现了UnitTest ++,其中包括来自CPPUnitLite2和其他一些框架的东西.

微软发布了WinUnit.

还要结帐CatchDoctest

  • 我很惊讶[Catch](https://github.com/philsquared/Catch)这里没有提到.另外checkout [doctest](https://github.com/onqtam/doctest) - 我重新实现了Catch,重点关注编译速度 - 查看[FAQ](https://github.com/onqtam/doctest/blob /master/doc/markdown/faq.md#how-is-doctest-different-from-catch)看看两者之间有什么不同 (3认同)
  • Googletest与boost :: test非常相似,但更容易集成到VS中 (2认同)

Jar*_*red 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/


ara*_*ido 9

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

  1. 通过将源代码移动到cpp文件并使用前向声明(如果需要),确保您的头文件可以使用.
  2. 编译代码以测试为库(.lib)
  3. 使用CLR支持将您的UnitTest项目创建为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();
  }
};
Run Code Online (Sandbox Code Playgroud)

使用这种方法,人们不必学习太多C++/CLI的东西,所有真正的测试都将在C++ native中完成,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)
Run Code Online (Sandbox Code Playgroud)

HTH


mos*_*ald 6

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