注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

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

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

  下载LOFTER 我的照片书  |

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

用C++/CLI做C++项目的单元测试 - 秒大刀 - 秒大刀的城堡

     测试项目创建完后如下:

用C++/CLI做C++项目的单元测试 - 秒大刀 - 秒大刀的城堡

     然后需要将公共语言运行时支持改为/clr类型,否则#include非托管C++头文件时会报C4959编译错误。  

用C++/CLI做C++项目的单元测试 - 秒大刀 - 秒大刀的城堡

    在测试项目默认生成的测试文件中添加下面的测试代码:

  [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++/CLI做C++项目的单元测试 - 秒大刀 - 秒大刀的城堡

    结果如下: 

用C++/CLI做C++项目的单元测试 - 秒大刀 - 秒大刀的城堡

    大功告成!

    有了好用的单元测试,以后写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是不同的
  评论这张
 
阅读(5957)| 评论(6)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017