DSh*_*ook 92 c++ testing unit-testing visual-studio
我无法弄清楚如何在Visual Studio 2008 for C++中设置和使用测试框架,可能是内置的单元测试套件.
任何链接或教程将不胜感激.
Aar*_*ark 56
这个页面可能有所帮助,它回顾了不少C++单元测试框架:
CPPUnitLite由Michael Feathers创建,他最初将Java的JUnit移植到C++作为CPPUnit(CPPUnit尝试模仿JUnit的开发模型 - 但C++缺乏Java的功能[例如反射]以使其易于使用).
CPPUnitLite试图建立一个真正的C++风格的测试框架,而不是一个移植到C++的Java框架.(我从"羽毛的有效工作与遗产代码"一书中解释).CPPUnitLite2似乎是另一个重写,具有更多功能和错误修复.
我也偶然发现了UnitTest ++,其中包括来自CPPUnitLite2和其他一些框架的东西.
微软发布了WinUnit.
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/
这是我用来测试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();
}
};
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
就个人而言,我更喜欢WinUnit,因为它不需要我写任何东西,除了我的测试(我建立一个.dll作为测试,而不是一个exe).我只是构建一个项目,并将WinUnit.exe指向我的测试输出目录,它运行它找到的所有内容.您可以在此处下载WinUnit项目.(MSDN现在要求您下载整个问题,而不是文章.WinUnit包含在内.)