老宋的地盘

 找回密码
 我要加入
搜索
查看: 3069|回复: 0

利用cppunit做模块测试

[复制链接]
发表于 2013-4-20 10:06:53 | 显示全部楼层 |阅读模式
都是一淘的文章不错,
利用cppunit做模块测试
最近在K2的测试项目中做了一些利用cppunit做接口测试的工作,总结了一篇使用简介,里面有实际测试用例的svn地址,希望对有兴趣的同学有所帮助。
一:下载:
版本:最新版1.12.1
二:编译配置
解压后进入cppunit-1.12.1目录执行以下操作:
  • ./configure
  • make
  • make check
  • make install(sudo make install):自动将生成的.a和.so文件安装到usr/local/lib 目录。
  • 手动将cppunit-1.12.1/include/下的cppunit目录,拷贝到/usr/local/include目录下。
三:如何写testcase
  • 概念理解
Testcase:一次测试,一般可以看做一次输入,对应一次确定的输出;
TestSuite:多个TestCase可以嵌套在一个TestSuite中,多个TestSuite又可以嵌套在更上层的TestSuite中;
  • 一个简单的测试实现
被测功能(只提供了加法功能的算数类):
///Math.h
// a class will be tested
class Math
{
public:
Math(){}
~Math(){}
int add(int,int);
};
算数类的实现
///Math.cpp
//implement of Math.h
#include <stdlib.h>
#include “Math.h”
int Math::add(int x,int y)
{
return x+y;
}
-----------------------------------------------华丽的分割线-----------------------------------------------------------------
为了测试Math类的测试类:
/// MathTest.h
// A TestFixture subclass.
#include “cppunit/TestFixture.h”
#include “cppunit/extensions/HelperMacros.h”
class MathTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(MathTest); //声明一个TestSuite
CPPUNIT_TEST(testAdd); //添加TestCase到TestSuite
/*定义新的测试用例需要在这儿声明一下
// … 可以添加更多testcase
*/
CPPUNIT_TEST_SUITE_END();// TestSuite声明完成
public:
MathTest(){}
~MathTest(){}
void eard(){};//初始化函数,此例没有用到
void eardown(){};//清理函数,此例没有用到
void testAdd ();// 测试加法的测试函数
/*可以添加更多测试函数
// …
*/
};
测试类MathTest的实现:
/// MathTest.cpp
// implement of MathTest.h
#include "MathTest.h"
#include "Math.h"
#include "cppunit/TestAssert.h"
//把这个TestSuite注册到名字为"alltest"的TestSuite中
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" );
//实现测试,测试中的核心部分
void MathTest::testAdd()
{
Math M;//实例化
int ret = M.add(-1,3); //调用add方法对其进行测试;
CPPUNIT_ASSERT(ret==2); //用cppunit提供的方法对ret与预期结果作比较
}
Main函数:
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
// 如果不更改TestSuite, 本文件后期不需要更改.
int main()
{
CppUnit::TextUi::TestRunner runner;
//从注册的TestSuite中获取特定的TestSuite
CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry("alltest");
//添加这个TestSuite到TestRunner中
runner.addTest( registry.makeTest() );
// 运行测试
runner.run();
}
编译:
g++ Math.cpp MathTest.cpp main.cpp -lcppunit -ldl -lm -lpthread -o mathTest
运行:
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
./mathTest
显示:
通过的情况:OK (1 tests)
失败的情况:会显示那个测试类中的哪行测试不通过
!!!FAILURES!!!
Test Results:
Run: 1 Failures: 1 Errors: 0
1) test: MathTest::testAdd (F) line: 15 MathTest.cpp
assertion failed
- Expression: ret==4
四:实际应用
之前组内讨论时,有些模块考虑到开发测试代码时间,以及新人上手慢的问题,我觉得也有道理,后面有时间会继续完善测试过程,总结下什么样的模块适合做单元测试,以及怎么减少这种代价和风险。
五:什么样的模块适合做类单元测试
  • 不能单独运行的模块,必须依赖上级模块的输出结果等情形;
  • 提供给别的模块做调用的,提供头文件,.so动态库或者.a静态库;
  • Api测试,基础组件(kfc、mmdb)的api接口;
  • 以上情形中,被测函数参数个数、类型不发生变化或者变化不频繁;
  • 测试过程中,使用了开发包装过的工具去测试的,也可以考虑下是否可行;
  • 待补充。

六:对开发的要求
模块测试的提测标准:
  • 需要有被测功能的头文件;
  • 需要一份简单的文档,说明该功能怎么调用,以及对传入的参数有什么样的要求(比如广告的featureWordHash要事先排序等这类问题);

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

歌名 - 歌手
0:00

    QQ|手机版|小黑屋|老宋 ( 备案中... )

    GMT+8, 2024-4-29 23:35 , Processed in 0.054023 second(s), 26 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表