单元测试是现代软件工程中的重要实践。测试驱动开发(Test-driven development, TDD)能让人从另一个角度去考虑问题。
C++单元测试常常苦于没有好用的框架,虽然CppUnit也还不错,但尚未达到C#中那么让人爽的地步。项目中也曾引入过各种各样的C++单元测试框架,但都是几个倡导者三分钟热度的写一些。后来则被自然冷却,无人问津,以至年久失修,惨遭遗弃。要么是这帮守旧的C++程序员不喜欢UnitTest,要么是还真是测试框架用的太DT。
Visual Studio 2003时代,微软推出了用于Native C++和.net交互的胶合语言Managed C++,狰狞的语法让很多人望而却步。Visual Studio 2005 中推出C++/CLI技术,全面革了Managed C++的命。将C++这种强大的没一个人类敢说全会的语言和.net框架优雅的结合起来了。
如今已经到了Visual Studio 2010世纪,CLI也更加舒爽平润。本文尝试采用托管的C++/CLI作非托管C++项目的单元测试,所有的事情都在同一个IDE中完成,可以很好的提高程序员体验。
示例如下:
假设解决方案中已经存在一个非托管的C++项目Application,其生成配置类型为“静态库(.lib)”。
在Application中添加Target类,代码如下:
int Add(int a, int b)
{
return a + b;
}
class Target
{
public:
int Add(int a, int b)
{
return ::Add(a, b);
}
};
再在解决方案中添加一个Visual C++的测试项目,该项目会自动成为CLI类型的。
测试项目创建完后如下:然后需要将公共语言运行时支持改为/clr类型,否则#include非托管C++头文件时会报C4959编译错误。
在测试项目默认生成的测试文件中添加下面的测试代码:
[TestMethod]
void TestGlobalAdd()
{
Assert::AreEqual(3, Add(1, 2));
}
[TestMethod]
void TestError()
{
Assert::AreEqual(0, Add(1, 2));
}
[TestMethod]
void TestTargetlAdd()
{
Target target;
Assert::AreEqual(3, target.Add(1, 2));
}
运行测试:
结果如下:
大功告成!
有了好用的单元测试,以后写C++代码就有点靠谱的安全感了。
注:
文中Demo基于Visual Studio Team System 2008 - 9.0.30729.1 SP完成。
推荐阅读:
GoogleTest也是一个不错的C++单元测试框架。
如果项目引入了boost,还可以考虑boost.test库。
联系客服