博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单元测试
阅读量:6947 次
发布时间:2019-06-27

本文共 2618 字,大约阅读时间需要 8 分钟。

cppunit是apache著名的单元测试工具junit的c++版本。

ubuntu安装方式如下:

sudo apt-get install libcppunit-dev

redhat需要下载并编译安装。

valgrind是一个著名的内存缺陷检查工具,可以检查并定位内存泄露、越界等问题。

ubuntu安装方式如下:

sudo apt-get install valgrind

  • main函数绝对不应当成为测试的地方
  • 除了utest目录下,其它所有源码目录都不允许出现测试代码
  • 除了utest目录下,其它所有源码目录都不允许出现包含test的文件名。

  • 每一个项目都应当包含一个名为utest,并位于项目根目录下的单元测试目录,用于存放 所有的单元测试用例。
  • utest目录下只应当有一个cpp文件,名称为project_utest.cpp,project根据不 同项目而异。这是单元测试函数的入口函数。
  • 单元测试由于不发布安装,因此所有源码都在头文件中实现,简化开发工作。
  • 每个类或模拟类的结构都应当对应一个单元测试类,并位于一个独立的头文件中。
  • 单元测试的类名为,要测试的类或模拟类的结构名加上Test后缀。如需要测试的结构为 ImChsLexAnalyzer,则单元测试的类名为ImChsLexAnalyzerTest。
  • 每个测试测试的方法,代表了一组测试用例,并以小写test开头。

单元测试的目的有两个:

  • 发现功能性的问题,如函数的返回不正确。(cppunit)
  • 发现内存问题,如内存没有释放。(valgrind)

单元测试入口函数:project_utest

// 被测试的类或结构的头文件   #include "../myproject.h"// cppunit 必须的头文件#include 
#include
#include
#include
#include
#include
// 入口函数int main(){ // 宏的参数为需要测试的类名,如有多个类需要测试则写多行。 CPPUNIT_TEST_SUITE_REGISTRATION(ImEmbedJsTest); // 以下代码直到结束,不用做任何修改。 CppUnit::TextUi::TestRunner runner; CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest(registry.makeTest()); runner.run(); return 0;}

测试用例样例:

#ifndef _IM_EMBED_JS_TEST_H_#define _IM_EMBED_JS_TEST_H_// 由于cppunit是C++写的,因此在编译C源码的测试用例时,需要加上extern "C"关键词#ifdef __cplusplusextern "C"{#endif// 需要测试的类或结构名,引用相对路径。    #include <../spider/embedjs/ImEmbedJs.h>#ifdef __cplusplus}#endif// 引入断言宏#include 
#include
using namespace std;// 修改类名为相应的测试类,类名以被测的类或结构名加上Testclass ImEmbedJsTest: public CppUnit::TestFixture{ // 宏参数为类名 CPPUNIT_TEST_SUITE(ImEmbedJsTest); // 测试方法,一个方法一行 CPPUNIT_TEST(testScript); CPPUNIT_TEST_SUITE_END();public: // 数据准备函数,由TestFixture定义,并由测试类override。用以准备测试初始数据。 void setUp() { } // 数据清理函数,由TestFixture定义,并由测试类override。用以清除测试初始数据。 void tearDown() { } // 测试函数,以test开头。用CPPUNIT_ASSERT断言结果是否符合预期。 void testScript() { ImEmbedJs* p_js = ImEmbedJs_new(); char p_content[] = "Published by Justin Wang, Ape Co.ltd,"; ImEmbedJs_init(p_js, p_content); char* lpsz_value; char lpsz_script[] = "function f(){return content.toUpperCase();} f();"; ImEmbedJs_eval(p_js, lpsz_script, strlen(lpsz_script), &lpsz_value); printf("%s\n", lpsz_value); CPPUNIT_ASSERT(strcmp("PUBLISHED BY JUSTIN WANG, APE CO.LTD,", lpsz_value) == 0); free(lpsz_value); ImEmbedJs_delete(p_js); return ; }};#endif

转载地址:http://nihnl.baihongyu.com/

你可能感兴趣的文章
ITK 4.8.1 Qt 5.4 MinGW 4.9.1 Configuration 配置
查看>>
短网址算法原理
查看>>
kvm 性能调优
查看>>
OC 实例变量(Instance Var)和成员变量(member var)区别
查看>>
hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!
查看>>
ssh 登录出现的几种错误以及解决办法
查看>>
Win7 OpenCV 3.0.0 VS2013 环境配置
查看>>
Deep Learning 深度学习 学习教程网站集锦(转)
查看>>
[转]"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的解决方案...
查看>>
构建自己的Java并发模型框架
查看>>
fusionchart实现ZoomLine 源码 破解版 能够导出
查看>>
iframe动态创建及释放内存
查看>>
ORACLE工作原理小结
查看>>
LeetCode - Populating Next Right Pointers in Each Node
查看>>
管理团队时,怎样保证一直做正确的事?
查看>>
如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。...
查看>>
Oozie入门
查看>>
myeclipse一直bulid workspace 的解决
查看>>
表单元素之搭车系
查看>>
mysql+redis
查看>>