单元测试和CppStub介绍

Download Report

Transcript 单元测试和CppStub介绍

LOGO
单元测试和CppStub介绍
2009年4月
陈国栋
目录
1
测试框架
2
打桩/mock工具
3
CppStub介绍
4
Mockcpp简介
测试框架
1
CppUnit: 使用最广泛.
只能在被测类中声明测
试类/函数为它的友元,
才能访问被测类的私有
成员。(还是要为了测试
改变正式代码,有更好
的方法吗?)
2
UnitTest++: 开源的
一个轻量级的CppUnit,
非常小巧而容易使用.
缺陷:无法在被测类中
声明测试类/函数为它的
友元。
#include <UnitTest++.h>
TEST(TestCaseName)
{
int ret = TestFunction();
CHECK(ret ==OK);
}
Company Logo
Mock与打桩工具
支持C函数打桩
的工具,xxx也
做过一些利用到
vxWorks下的研
究。
支持C/C++
全局函数/类
非虚成员函数
打桩的工具。
支持C++虚
成员函数
Mock(打桩)
的工具。
支持C/C++
的Mock(打
桩)工具。试
验中。
CppStub简介
功能描述:
1 C函数/静态成员函数/一般库函数均可以用SET_STUB打桩。
P2ADDR宏把类成员函数指针转换为DWORD类型的地址,
类的成员函数通过类似下面例子的方法打桩。(目前只支持非虚成员。而且
该类还不能从有虚函数的类继承,否则它的任何非静态成员都不能打桩。)
2 可以用CStub类更方便的进行打桩,清除桩的操作在析构中自动完成。如:
CStub stub(P2ADDR(CSimple::SimpleMethod), Simple_stub);
3 库函数VirtualProtect和四个临界区互斥函数
[Initialize/Delete/Enter/Leave]CriticalSection由于在STUB模块内部使用不
能被打桩。
4 C文件中使用时包含IStub.h,CPP文件中使用时可以包含功能更强的
ICppStub.h。
5 在包含IStub.h/ICppStub.h之前,根据使用的测试框架定义宏
USE_CPPUNIT/USE_UNITTESTCPP可以方便的检查SET_STUB打桩是否成功。
6 默认同时存在的桩函数个数为,可以通过SET_STUB_NUM(num)宏重设这个值
,重设的时候会把原有的桩全清除。
7 本模块运行中的错误信息保存在可执行文件目录中的CppStub.log中。
8 本模块提供的打桩功能为覆盖桩。插入桩用得较少,不支持。
9 重载的函数的地址不能方便的得到,不能打桩。
CppStub使用举例
//待测类:
class CSimple
{
public:
void SimpleMethod();
void ParamMethod(int a);
virtual void VirtualMethod();
};
//写的桩类:(不需要实现待测类的所有方法,不能从有虚函数的类派生,最好不要从任何类派生)
class CSimpleStub
{
public:
void ParamMethod_stub(int a)
{
g_bInStub = TRUE;
}
};
//测试代码:
TEST(TestParamMethod)
{
CStub stub(P2ADDR(CSimple::ParamMethod), P2ADDR(CSimpleStub::ParamMethod_stub));
g_bInStub = FALSE;
InvokeParamMethod(); // 它里面会调用CSimple的ParamMethod
CHECK(TRUE == g_bInStub);
}
mockcpp
全局函数
• MOCKABLE+MOCKER+普通调用
• MOCKER+MCALL调用
静态成员函数
虚成员函数
• MOCKABLE+MOCKER+普通调用(编译错误)
• MOCKER+MCALL调用
• MOCK类+ method("MethodName")+普
通调用
Company Logo
LOGO
测试工具是个流行事物,最近Google Test
测试框架和Google mock也非常受欢迎。