IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> C单元测试中的Mock使用 -> 正文阅读

[开发测试]C单元测试中的Mock使用

前言

??在进行单元测试时,我们想要测试自己缩写函数A,但是函数A却依赖于函数B,当函数B无法满足预期时就无法对函数A进行测试,主要由于下面几个原因:

  • 函数B依赖于硬件设备
  • 真实的函数B的返回值无法满足我们的预期
  • 团队开发中函数B尚未实现

??这时就需要对函数B进行打桩(仿真mock),使其达到我们预期的效果。

但是如同下面这种类型函数时,则需要深入下去,对基层的函数进行打桩:

typedef struct
{
	int num;
	char *ptr;
	char bot[20];
} ST_OBJ;

int fun_A()
{
	fun_B();
	return 0;
}
void fun_B(ST_OBJ *ptObj)
{
	fun_C(ptObj);
	fun_D(ptObj);
	fun_E(ptObj);
}

1. 下载网址

https://github.com/google/googletest

2. 为什么选择Google Mock

  • 首先当然是我们遇到了在前言中所说的问题。
  • 其次Goole的Mock也是代码,也是工程师写的,自己当然也可以去实现,但费时费力,难以避免出错,对于初学者很难。
  • 再有就是Google Mock使用方便,只要#include"gtest/gtest.h"和"Mockpp.h",你已经准备好了。
  • 且功能强大。

3. C中简单的例子

要测试的函数:

int fun_other(int num)
{
    num += 50;
    return num;
}

int fun_greater100(int num)
{
    if(fun_other(num) <= 100){
        printf("not greate\n");
        return FALSE;
    }
    printf("not greate\n");
    return TRUE;
}

编写TEST_F测试

/* test_f.cc */

#include "gtest.h"
#include "mockpp.h"
//#include "mockcpp.hpp"

class test_class : public testing::Test
{
public:
    virtual void SetUp()  {}
    virtual void TearDown()   {}
};

TEST_F(test_class, mocktest)
{
        MOCKER(fun_other)
            .expects(once())
            .will(returnValue(1));

    int testnum = 88;
    ASSERT_EQ(FALSE, fun_greater100(testnum));
}
/* gtest_main.cc */

#include <gtest.h>

int main(int argc, char **argv)
{
	testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TEST();
}

4. 指定自己的期望

??可以看出Mock和Stub的差异,Mock可以像零件式的个性化定制打桩需求,自己并不需要去实现打桩函数。
??测试中每个用例对打桩函数的预期是不同的,如果采用Stub,则需要定义很多打桩函数并实现他。

/*
1)mock规范:每个MOCKER(function)开始,跟一系列的.stubs、.with、.will等的内容的整体,称为一个mock规范。
(2)核心关键字:指stubs/defaults/expects/before/with/after/will/then/id等这些直接跟在点后面的关键字。
(3)扩展关键字:指once()/eq()/check()/returnValue()/repeat()等这些作为核心关键字参数的关键字。(AMOCK的follow在mockcpp中是check)
*/
TEST(mockcpp simple sample)
{
    MOCKER(function) / MOCK_METHOD(mocker, method)
        .stubs() / defaults() / expects(once())
        [.before("some-mocker-id")]
        [.with(eq(3))]
        [.after("some-mocker-id")]
        .will(returnValue(1)) / .will(repeat(1, 20))
        [.then(returnValue(2))]
        [.id("some-mocker-id")]
}
注:
1、扩展关键字分类:
	expects里面的叫匹配关键字(Matcher);
	with里面的叫约束关键字(Constraint);
	will/then里面的叫桩关键字(Stub)。
2、spy的作用是监视执行该被mock的函数function被调用时传入的值,会保存在var_out中,供用例中其它地方使用。
3、outBound的作用是设置函数function的出参的值。多半是把该值作为后面部分被测代码的输入。(注意与spy区别)
4、outBoundP,与outBound作用相同,只是用于数组的情况。
5、mirror的作用是对数组类型的入参进行检查。(outBoundP是设置出参的值,两者是不同的)
6、check的作用是进行定制化的入参检查,比如只检查结构体的部分成员。可以通过函数指针或者仿函数的方式指定,用仿函数还能预先保存一些值,非常方便。
7、check也能够用于设置出参的情况。

5. 总结

5.1 Mock使用

Mock 普通函数使用MOCKER
Mock 类成员方法先用MOCKER mocker;声明一个mock对象,再用MOCK_METHOD(mocker, method)

5.2 校验

紧跟着MOCKER/MOCK_METHOD之后的是stubs、或者defaults、或者expects,三个必须有一个。这个层次上确定这三个关键字必须有一个,可以让mock语法更清晰)

  • stubs 表示指定函数的行为,不校验次数。
  • expects 与stubs的区别就是校验次数。(.expects(once()) / .expects(never()) / .expects(exactly(123))
  • defaults 表示定义一个默认的mock规范,但它优先级很低;如果后面有stubs或者expects重新指定函数行为,就会按照新指定的来运行。

5.3 期望

  • 用will指定函数的返回值;

  • 如果要指定20次调用都返回1,则用.will(repeat(1, 20));

  • 要指定第一次返回1,第二次返回2,第三次返回3,就用
    .will(returnValue(1))
    .then(returnValue(2))
    .then(returnValue(3))
    如果你指定了前三次的返回值依次为1、2、3,那么第四次、第五次调用,都是返回最后的返回值3。

5.4 顺序

用id给一个mock规范指定一个名字,然后可以用after、before来指定多个mock应该的调用顺序。
注意before在with前,after在with后,id在整个mock规范的最后。

参数解释详见MockC++

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:56:38  更:2022-03-15 22:57:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:20:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码