我无法弄清楚如何在Visual Studio 2008 for C ++中设置和使用测试框架,可能是内置的单元测试套件。
任何链接或教程都将不胜感激。
答案 0 :(得分:56)
This page可能有所帮助,它会审查相当多的C ++单元测试框架:
查看 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 。
答案 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):
以下是一个例子:
// 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 source或another获取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 ++应用程序单元测试的分步指导。我希望它可以帮助你。