1.首先构建测试套件,定义一个继承自testing::Test的类
classmodelTest:publictesting::Test{
protected:
};
2.同样需要复写SetUp/TearDown两个函数
voidSetUp()override{
}
voidTearDown()override{
3.定义想要测试单元测试需要用到的数据,并在SetUp进行初始化,在TearDown中进行清理或析构。
pm=newmodel;
if(pm){
deletepm;
pm=NULL;
model*pm;
4.通过TEST_F宏定义想要测试的类的private函数的测试用例
//Testsfactorialofnegativenumbers.
TEST_F(modelTest,Negative){
//Thistestisnamed"Negative",andbelongstothe"FactorialTest"
//testcase.
EXPECT_EQ(1,pm->Factorial(-5));
EXPECT_EQ(1,pm->Factorial(-1));
EXPECT_GT(pm->Factorial(-10),0);
//Testsfactorialof0.
TEST_F(modelTest,Zero){
EXPECT_EQ(1,pm->Factorial(0));
//Testsfactorialofpositivenumbers.
TEST_F(modelTest,Positive){
EXPECT_EQ(1,pm->Factorial(1));
EXPECT_EQ(2,pm->Factorial(2));
EXPECT_EQ(6,pm->Factorial(3));
EXPECT_EQ(40320,pm->Factorial(8));
此时运行的话,系统会报错:
classmodel
{
private:
device*_pdevice;
network*_pnetwork;
public:
model();
~model();
voidprintmodelinfo();
voidprintmodelverion();
voidprintmodeldeviceinfo();
voidprintmodeldeviceversion();
voidprintmodeldeviceserial();
voidprintallinfo();
boolshowImg();
boolshowData();
boolIsPrime(intn);
intFactorial(intn);
#ifdefUT
#defineprotectedpublic
#defineprivatepublic
#endif//UT
简单、直接、粗暴,有效。
但是这个几行代码虽然简单,但如果有很多个类并且没有一个都被包含了的头文件的话,加起来还是有工作量的。那么可以使用一个python脚本来执行这个处理,如果使用到了独立脚本进行处理这个事情,则可以有另一个粗暴的方法:
修改为
//private:
单测运行后再次运行脚本将''//private:''转为''private:''
这样后台将在编译前会进行private的public处理,编译完成后恢复privated的访问权限
附编译前private处理脚本及编译后private还原处理的脚本【请到文末的github连接下载俩脚本】。
但是这种方式,如果在前期没考虑到,后期修改成本较高;而第一第二种方案,虽然没第三种优雅,但其成本较低而且不用修改到源工程的功能代码。可以根据实际情况,按需使用。