我无法弄清楚如何在Visual Studio 2008中设置和使用测试框架,C++
可能与内置的单元测试套件一起使用。
任何链接或教程将不胜感激。
我无法弄清楚如何在Visual Studio 2008中设置和使用测试框架,C++
可能与内置的单元测试套件一起使用。
任何链接或教程将不胜感激。
这个页面可能会有所帮助,它回顾了很多 C++ 单元测试框架:
CPPUnitLite由 Michael Feathers 创建,他最初将 Java 的 JUnit 作为 CPPUnit 移植到 C++(CPPUnit 尝试模仿 JUnit 的开发模型 - 但 C++ 缺乏 Java 的特性 [例如反射] 使其易于使用)。
CPPUnitLite 试图创建一个真正的 C++ 风格的测试框架,而不是移植到 C++ 的 Java 框架。(我是从 Feather 的《有效地使用旧代码》一书中转述的)。CPPUnitLite2似乎是另一个重写,具有更多功能和错误修复。
我还偶然发现了UnitTest++,其中包括来自 CPPUnitLite2 和其他一些框架的东西。
微软发布了WinUnit。
有一种方法可以使用 Visual Studio 2008 中的内置测试框架来测试非托管 C++。如果使用 C++/CLI 创建 C++ 测试项目,则可以调用非托管 DLL。如果要测试用非托管 C++ 编写的代码,则必须将公共语言运行时支持从 /clr:safe 切换到 /clr。
我在我的博客上有一步一步的详细信息:http: //msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/
这是我在 Microsoft 测试 IIS URL Rewrite 模块的方法(它是基于命令行的,但也适用于 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++ 原生中完成,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)
高温高压
就个人而言,我更喜欢WinUnit ,因为它不需要我写任何东西,除了我的测试(我构建一个 .dll 作为测试,而不是一个 exe)。我只是构建了一个项目,并将 WinUnit.exe 指向我的测试输出目录,它会运行它找到的所有内容。您可以在此处下载 WinUnit 项目。(MSDN 现在要求您下载整个问题,而不是文章。WinUnit 包含在其中。)
VS9 包含的框架是.NET,但您可以使用 C++/CLI 编写测试,因此只要您能够自如地学习一些 .NET 主义,您应该能够测试大多数 C++ 代码。
boost.test 和googletest 看起来非常相似,但适用于稍微不同的用途。这两个都有一个二进制组件,因此您的解决方案中需要一个额外的项目来编译和运行测试。
我们使用的框架是CxxTest,它更轻量级;它只是标题,并使用 Perl (!) 脚本从标题中抓取测试套件信息(套件继承自 CxxTest::Base,所有测试方法的名称都以“test”开头)。显然,这要求您从一个或另一个来源获取 Perl ,这会增加构建环境设置的开销。
我使用UnitTest++。
自从我发表这篇文章以来的几年里,源代码已经从 SourceForge 转移到了 github。此外,示例教程现在更加不可知 - 根本不涉及任何配置或项目设置。
我怀疑它仍然适用于 Visual Studio 6,因为项目文件现在是通过 CMake 创建的。如果您仍然需要旧版本支持,您可以在SourceForge分支下获得最后一个可用版本。
这里提到的工具都是命令行工具。如果您正在寻找更集成的解决方案,请查看cfix studio,它是用于 C/C++ 单元测试的 Visual Studio 插件。它与 TestDriven.Net 非常相似,但用于(非托管)C/C++ 而不是 .NET。
我已经将CppUnit与 VS2005 和 Eclipse 一起使用。wiki 非常详尽(特别是如果您熟悉 JUnit)。
我不是 100% 确定 VS2008,但我知道微软在 VS2005 中作为 Team Suite 的一部分提供的单元测试框架仅适用于 .NET,而不适用于 C++
我也用过 CppUnit,没问题。与 NUnit/JUnit/等非常相似。
如果你用过 boost,他们还有一个单元测试库
boost 背后的人有一些严重的编码印章,所以我想说他们的框架应该相当不错,但它可能不是最用户友好的 :-)
据我所知,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中的步骤让您的测试类正常工作。
出于同样的原因,我也喜欢 CxxTest。它只是一个头文件,因此不需要链接。你不会被 Perl 困住,因为还有一个 Python 运行器。我将很快审查谷歌图书馆。Boost 的东西带来了太多的其他包袱。
我在使用 Visual Studio 在 Windows 环境中为非托管 C++ 应用程序实施单元测试时遇到了困难。所以我设法克服并写了一篇文章作为非托管 C++ 应用程序单元测试的分步指南。我希望它可以帮助你。