首页 > 其他分享 >private函数如何单元测试

private函数如何单元测试

时间:2024-06-10 15:02:42浏览次数:23  
标签:函数 Factorial void 单元测试 private protected public pm

private函数如何单元测试

类的private函数相比public函数,测试套件定义的对象无法直接访问;相比protected函数,亦无法通过 前文(protected函数如何单元测试) 提到的FRIENT_TEST来使用,那么我们要怎么才能解决这个问题呢?

下面来看看具体如何实施。

1.首先构建测试套件,定义一个继承自testing::Test的类

class modelTest : public testing::Test {
protected:

};

2.同样需要复写SetUp/TearDown两个函数

class modelTest : public testing::Test {
protected:
    **void SetUp() override {**

    **}**

    **void TearDown() override {**

    **}**
};

3.定义想要测试单元测试需要用到的数据,并在SetUp进行初始化,在TearDown中进行清理或析构。

class modelTest : public testing::Test {
protected:
    void SetUp() override {
        **pm = new model;**
    }

    void TearDown() override {
        **if (pm) {**
            **delete pm;**
            **pm = NULL;**
        **}**
    }

    **model* pm;**
};

4.通过TEST_F宏定义想要测试的类的private函数的测试用例

// Tests factorial of negative numbers.
TEST_F(modelTest, Negative) {
  // This test is named "Negative", and belongs to the "FactorialTest"
  // test case.
  
 EXPECT_EQ(1, pm->Factorial(-5));
 EXPECT_EQ(1, pm->Factorial(-1));
 EXPECT_GT(pm->Factorial(-10), 0);
}

// Tests factorial of 0.
TEST_F(modelTest, Zero) {
 EXPECT_EQ(1, pm->Factorial(0));
}

// Tests factorial of positive numbers.
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));
}

此时运行的话,系统会报错:
image.png

PS:请见谅直接使用了前文protected的函数,这里仅仅将访问权限protected修改为了private……

class model
{
private:
    device* _pdevice;
    network* _pnetwork;

public:
    model();
    ~model();
    void printmodelinfo();
    void printmodelverion();
    void printmodeldeviceinfo();
    void printmodeldeviceversion();
    void printmodeldeviceserial();
    void printallinfo();
    bool showImg();
    bool showData();
    bool IsPrime(int n);

private:
    int Factorial(int n);
};

面对这个问题,第一,我们可以先使用 [[3-protected函数如何单元测试|前文(protected函数如何单元测试)]] 提到private宏定义为public的方式

#ifdef UT
#define protected public
#define private public
#endif  // UT

简单、直接、粗暴,有效。

但是这个几行代码虽然简单,但如果有很多个类并且没有一个都被包含了的头文件的话,加起来还是有工作量的。那么可以使用一个python脚本来执行这个处理,如果使用到了独立脚本进行处理这个事情,则可以有另一个粗暴的方法:

private:

修改为

// private:

单测运行后再次运行脚本将’‘//private:’‘转为’‘private:’’
这样后台将在编译前会进行privatepublic处理,编译完成后恢复privated的访问权限

<<end_unittest.py>>
<<pre_unittest.py>>

附编译前private处理脚本及编译后private还原处理的脚本【请到文末的github连接下载俩脚本】。

当然,官方还有一种方法,需要重构代码,将privated的函数都转移到一个新建的文件中实现,简称pimpl,私有实现,详细查看 官方教程

但是这种方式,如果在前期没考虑到,后期修改成本较高;而第一第二种方案,虽然没第三种优雅,但其成本较低而且不用修改到源工程的功能代码。可以根据实际情况,按需使用。

对应的demo源码,请点击 privateFunc

也可扫码关注博主同名公众号"不解之榬",回复 “private” 获取
不解之榬

标签:函数,Factorial,void,单元测试,private,protected,public,pm
From: https://blog.csdn.net/LT450196683/article/details/139566725

相关文章

  • python常用函数
    python常用函数一、进制转换#字符串与ASCII码转换print(ord("A"))#65print(chr(65))#A#进制转换print(bin(78))#0b1001110print(oct(78))#0o116print(hex(78))#0x4eprint(int('4e',16))二、数学函数函数返回值(描述)abs(x)返......
  • 字符相关函数的使用以及模拟实现
    库函数中有许多函数与字符串有关,一些常见的有strlen测量字符串的长度,strcpy拷贝字符串到新的字符串下,strcat进行字符串的追加等等,这篇文章会详细实现上述字符串函数的模拟实现。1.strlen的模拟实现首先我们先了解一下strlen函数,strlen是统计字符串内字符的数量的,而字符串的数......
  • C语言——使用函数创建动态内存
    一、堆和栈的区别1)栈(Stack):栈是一种自动分配和释放内存的数据结构,存储函数的参数值、局部变量的值等。栈的特点是后进先出,即最后进入的数据最先出来,类似于我们堆盘子一样。栈的大小和生命周期是由系统自动管理的,不需要程序员手动释放。2)堆(Heap):堆是由程序员手动分配和释......
  • 嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属
    目录1文件的时间属性简介2utime()函数2.1 utime()函数简介2.2示例程序3 utimes()函数3.1 utimes()函数简介3.2示例程序 4  futimens()函数4.1 futimens()函数简介4.2示例程序5 utimensat()函数5.1 utimensat()函数简介5.2 示例程序1文件的时间......
  • 模版初阶【泛型编程】【函数模版】【类模版】
    模版初阶1.泛型编程如何实现一个通用的交换函数呢?我们先来看一个情景:假设我们需要一个交换的函数,在C语言,我们需要对每一个类型都重新编写一个不同的函数,名字也不能相同。而在c++支持重载后,虽然函数名可以相同,但是我们仍然要对每一种类型都编写一个函数。比如int类要交......
  • 请编写函数fun,它的功能是:求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有
    //请编写函数fun,它的功能是:求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。#include<stdio.h>intfun(int*a){intresult[100];intcount=0;for(inti=1;i<=100;i++){......
  • 封装一个Promise.all 的函数
    //1.准备三个异步函数constpromise1=Promise.resolve('prom11ise1');constpromise2=newPromise(function(resolve,reject){setTimeout(resolve,2000,'promise2');});constpromise3=newPromise(function(resolve......
  • Linux c fread/fseek 函数
    函数:freadsize_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);参数说明:参数buffer指向要读取的数组中首个对象的指针size每个对象的大小(单位是字节)count要读取的对象个数stream输入流函数:fseekintfseek(FILE*stream,longintoffse......
  • 1奇函数偶函数
    文章目录自变量有理化奇偶性周期性初等函数自变量自变量是x,这个还挺奇怪,记住就好y=f(e......
  • mm-qcamera-daemon主函数分析
    目录main函数核心main函数核心  main函数的主要任务包含在一个do{}while(1)循环中.while循环中主要是监听文件描述符,故mai函数是由文件的读写来进行驱动的。  所有的文件描述符被封装成结构体read_fd_info_t.其定义如下:/**read_fd_info_t *@type--ei......