最近看《软件项目成功之道》,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单元测试环境,用于测试工作中编写的C函数。下面就来介绍整个搭建过程,整个过程分为四步:前期准备——需要的库;环境配置——VC++6.0配置;实例演示——可复现的Demo;拓展——后续学习资料。

  一、前期准备;

  • CppUTest下载

    • 官网:http://cpputest.github.io/
    • 历史版本:https://github.com/cpputest/cpputest/releases

  在我的项目中,采用的是老版本V3.3;

  二、环境配置;

  1、利用VC++6.0,新建一个用于测试的工程CppUTestLearning;

  2、选择Project——>Settings,配置Code Generation,选择“Debug Multithreaded DLL”;

  

  3、配置链接库,其中CppUTest.lib是测试框架的核心,winmm.lib用于解决问题“error LNK2001: unresolved external symbol __imp__timeGetTime”;

  

  4、编译时,需要忽略“libcmtd.lib”这个库;Project——>Setting——>Link,选择Category->Input,在Ignore libraries中填入libcmtd;

  

  5、设置CppUTest的公共头文件存放路径,选择Tools——>Options——Directories,添加\CPPUTEST和\PLATFORMS\VISUALCPP两个目录;

  

  三、实例演示

  1、编写用于测试的开发程序MyProgram.h和MyProgram.c

MyProgram.h

#ifndef MY_PROGRAM_H
#define MY_PROGRAM_H
/*
* Description: 整数加法函数
* Function: add
* Parameter: first --[in] 第一个参数
* second --[in] 第二参数
*
* Return: 执行后的结果
*
* Other:
*
*/
int add(int first,int second);
#endif

MyProgram.c

#include "MyProgram.h"

/*
* Description: 整数加法函数
* Function: add
* Parameter: first --[in] 第一个参数
* second --[in] 第二参数
*
* Return: 执行后的结果
*
* Other:
*
*/
int add(int first,int second)
{
return first+second;
}

  2、搭建测试环境,创建文件MainTest.cpp和FirstTestGroup.cpp文件,其中MainTest.cpp启动“入口函数”的作用,而FirstTestGroup.cpp即一个单元测试组;

MainTest.cpp

#include "D:\\cpputest-3.3\\include\\CppUTest\\CommandLineTestRunner.h"
int main(int ac, const char** av)
{
/* These checks are here to make sure assertions outside test runs don't crash */
CHECK(true);
LONGS_EQUAL(1, 1);
return CommandLineTestRunner::RunAllTests(ac, av);
}

FirstTestGroup.cpp

#include "D:\\cpputest-3.3\\include\\CppUTest\\TestHarness.h"
#include "D:\\cpputest-3.3\\include\\CppUTest\\TestOutput.h"
extern "C"{
#include "MyProgram.h"
} TEST_GROUP(MyProgram)
{
}; TEST(MyProgram, add)
{
LONGS_EQUAL(2,add(1,2));
}

  3、进行编译,链接,然后执行,其结果如图

  四、拓展

  上述实例,仅演示了整数类型数据比对LONGS_EQUAL,更多数据类型数据比对参见README_CppUTest.txt。

最新文章

  1. Linux 上的常用文件传输方式介绍与比较
  2. 修改Android系统字号(一)
  3. Struts2国际化文件乱码解决
  4. Java - 反射机制(Reflection)
  5. 基于JAVA语言的多线程技术
  6. 使用curl模拟ip和来源进行网站采集的实现方法
  7. 关于python使用threadpool中的函数单个参数和多个参数用法举例
  8. Git版本控制:Git冲突解决 相关错误总结
  9. Django学习笔记(2)——模型,后台管理和视图的学习
  10. 高可用Redis(二):字符串类型
  11. Access denied for user 'root'@'localhost' (using password:YES) Mysql5.7
  12. GitLab CI .NET 部署中的几个坑
  13. Android assets res 文件夹的区别
  14. odoo 权限设置
  15. DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)
  16. Ng第四课:多变量线性回归(Linear Regression with Multiple Variables)
  17. AlexNet详解3
  18. 清除float的方法
  19. Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)
  20. An ac a day,keep wa away

热门文章

  1. Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(info)
  2. C#的选择语句练习
  3. Linux中的入口函数main
  4. Java JDBC链接数据库
  5. 给linux 授权一个可以远程登录的账户
  6. 使用cordova插件barcodescanner遇到的坑
  7. kuangbin_SegTree I (HDU 1540)
  8. 网易Ubuntu镜像使用帮助(ubuntu15.10 修改源)
  9. 0x00linux32位汇编初入--前期准备
  10. Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]