【问题标题】:How to set up unit testing for Visual Studio C++如何为 Visual Studio C++ 设置单元测试
【发布时间】:2010-09-05 09:54:33
【问题描述】:

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

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

【问题讨论】:

  • Google 发布了与 xUnit 框架非常相似的 C++ 测试框架。 http://code.google.com/p/googletest/
  • 你最终使用了什么框架?
  • 其实我还没用过。我决定我正在做的单元测试并不是最有效地利用时间。

标签: c++ unit-testing testing visual-studio-2008 frameworks


【解决方案1】:

This page 可能会有所帮助,它回顾了很多 C++ 单元测试框架:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • 单元++
  • CxxTest

查看 CPPUnitLiteCPPUnitLite2

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

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

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

微软已发布WinUnit

也可以查看 CatchDoctest

【讨论】:

  • Googletest 与 boost::test 非常相似,但更容易集成到 VS 中
  • 我很惊讶这里没有提到Catch。还可以查看doctest——我重新实现了 Catch,非常注重编译速度——查看FAQ 看看两者之间有什么不同
  • @onqtam 不要太惊讶,这个问题/答案来自 2008 年!添加了您建议的链接。
【解决方案2】:

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

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

【讨论】:

  • 这确实对您的 C++ 代码施加了某些限制,我至少有一个代码库,其中尝试将其标头包含到 C++/CLI 代码中比它的价值更麻烦。使用 C++/CLI 对我来说最大的好处是你可以在 mbUnit/NUnit/xUnit.Net 中使用带有 RowTest 等属性的时髦参数化测试
【解决方案3】:

这是我在 Microsoft 测试 IIS URL Rewrite 模块的方法(它是基于命令行的,但也适用于 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();} 方法和一个新的 void NewTest() 本机函数。没有宏,没有技巧,直截了当。

现在,头文件是可选的,但它可以用来暴露带有 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)

HTH

【讨论】:

    【解决方案4】:

    就个人而言,我更喜欢WinUnit,因为它不需要我write anything except for my tests(我构建了一个.dll 作为测试,而不是一个exe)。我只是构建了一个项目,并将 WinUnit.exe 指向我的测试输出目录,它会运行它找到的所有内容。你可以download the WinUnit project here。 (MSDN 现在要求您下载整个问题,而不是文章。WinUnit 包含在其中。)

    【讨论】:

      【解决方案5】:

      VS9 包含的框架 .NET,但你可以用 C++/CLI 编写测试,所以只要你能自如地学习一些 .NET 主义,你应该能够测试大多数任何 C++ 代码。

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

      我们使用的框架是CxxTest,轻了很多;它只是标题,并使用 Perl (!) 脚本从标题中抓取测试套件信息(套件继承自 CxxTest::Base,所有测试方法的名称都以“test”开头)。显然,这需要您从 one sourceanother 获取 Perl,这会增加构建环境设置的开销。

      【讨论】:

      • CxxTest 可以用python代替perl
      • 您还需要注意代码所需的任何 DLL - 我在使用 NUnit 和 mbUnit 测试 C++/CLI 代码时遇到问题,试图加载 DLL。
      【解决方案6】:

      我使用UnitTest++

      自从我发表这篇文章以来,源代码已经从 SourceForge 转移到了 github。此外,example tutorial 现在更加不可知 - 根本不进入任何配置或项目设置。

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            我也用过 CppUnit,没问题。与 NUnit/JUnit/等非常相似。

            如果你用过 boost,他们also have a unit testing library

            boost 背后的人有一些严重编码能力,所以我想说他们的框架应该不错,但它可能不是最友好的:-)

            【讨论】:

              【解决方案10】:

              出于同样的原因,我也喜欢 CxxTest。它只是一个头文件,因此不需要链接。你不会被 Perl 困住,因为还有一个 Python 运行器。我将很快审查谷歌图书馆。 Boost 的东西带来了太多的其他包袱。

              【讨论】:

                【解决方案11】:

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

                我在 Visual Studio 2005 上使用了 CppUnit,发现它非常好。

                据我所知,设置过程相对轻松。只需确保在您的测试项目中链接器(链接器 → 输入 → 附加依赖项)包括 cppunitd.lib。

                然后,#include &lt;cppunit/extensions/HelperMacros.h&gt; 在您的标题中。

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

                【讨论】:

                  【解决方案12】:

                  我很难在 Windows 环境中使用 Visual Studio 为非托管 C++ 应用程序实施单元测试。所以我设法克服并写了一篇文章作为非托管 C++ 应用程序单元测试的分步指南。希望对你有帮助。

                  Unit test for unmanaged C++ in Visual Studio

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-08-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-18
                    • 2011-06-30
                    相关资源
                    最近更新 更多