打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VS2005中推出C++/CLI技术,全面革了Managed C++的命

用C++/CLI做C++项目的单元测试  

2011-04-28 15:09:22|  分类: C/C++ |举报 |字号 订阅

    单元测试是现代软件工程中的重要实践。测试驱动开发(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完成。

 

推荐阅读:

C++/CLI 学习笔记


2011-5-15

    GoogleTest也是一个不错的C++单元测试框架。

    如果项目引入了boost,还可以考虑boost.test库。


2011-12-16
    若测试项目运行结果全部为黄色感叹号错误,报错为“System.IO.FileNotFoundException:找不到指定的模块。(异常来自HRESULT:0x8007007E)”,可参考R6034解决方案。

2011-12-27
    VS2010创建的C++/CLI测试项目,Debug下默认的运行时库为“多线程 DLL (/MD)”而不是“多线程调试 DLL (/MDd)”,这可能会造成链接时报LNK2022


2012-3-6
    VS2008下若出现UnitTest长时间挂起,可采用KB970449热修复。


2012-5-19
    VS2010下创建C++/CLI测试项目,默认的“目标文件名”为“DefaultTest”,当同一个解决方案中包含多个测试项目时因目标文件名相同,会冲突!可手工将每个项目的“目标文件名”设置为“$(MSBuildProjectName)”或其他合理值解决。

2012-11-13
    建议VS2012下的C++/CLI UnitTest项目设置如下:
  1. 调整“输出目录”为“$(Configuration)\”,以避免同一个project在多个solution间共享时当前路径错误
  2. 调整“目标文件名”为“$(MSBuildProjectName)”,以避免同一个solution内多个C++/CLI UnitTest项目时目标文件名冲突
    VS2012下CLI UnitTest的CurrentDirectory为项目的输出目录,这和VS2008VS2005是不同的
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VS2005对私有方法的单元进行测试
使用VS2013进行C#程序的单元测试
python 数据驱动(ddt,unpack)
用 VS Code 写 Python,这几个插件是必装的
VS2017 生成DLL 供python 调用
自动化单元测试实践之路
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服