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

时间:2008-08-06 07:57:50

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

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

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

12 个答案:

答案 0 :(得分:56)

This page可能有所帮助,它会审查相当多的C ++单元测试框架:

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

查看 CPPUnitLite CPPUnitLite2

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

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

我也偶然发现了 UnitTest++ ,其中包含来自CPPUnitLite2和其他一些框架的内容。

Microsoft已发布 WinUnit

同时结帐 Catch Doctest

答案 1 :(得分: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/

答案 2 :(得分: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代码(可能有拼写错误):
  8. 以下是一个例子:

    // 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 ++ 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)
    

    HTH

答案 3 :(得分:6)

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

答案 4 :(得分:4)

VS9 附带的框架是 .NET,但你可以用C ++ / CLI编写测试,所以只要你习惯学习一些.NET主义,你应该能够测试最多任何C ++代码。

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

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

答案 5 :(得分:2)

我使用UnitTest++

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

我也使用过CppUnit而且没关系。与NUnit / JUnit /基本相同。

如果您使用了提升功能,那么also have a unit testing library

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

答案 9 :(得分: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中的步骤操作,以使您的测试课程正常运行。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

我很痛苦在使用Visual Studio的Windows环境中为非托管C ++应用程序实现单元测试。因此,我设法克服并撰写了一篇文章,作为非托管C ++应用程序单元测试的分步指导。我希望它可以帮助你。

Unit test for unmanaged C++ in Visual Studio