gtest概念应用及原理

这篇具有很好参考价值的文章主要介绍了gtest概念应用及原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

gtest是单元测试库可以测试一个函数,也可以测试一个类。

应用和原理

//被测试类
class MyClass{
    FRIEND_TEST(MyClassTest, private); //test private //为了gtest新增加的一行代码
    void init(string);
    void process(void*,void*);
    void release();
}
#define FRIEND_TEST(test_case_name, test_name) \
    friend class test_case_name##_##test_name##_Test
展开之后: friend class MyClassTest_private_test

##############################################
gtest测试代码:

class MyClassTest : public ::testing::Test
{
protected:
    MyClass *_myclass;
    virtual void SetUp()
    {
        cout << __FUNCTION__ << " Enter";
        _myclass = new MyClass("a", "b");
    }
    virtual void TearDown()
    {
        cout << __FUNCTION__ << " Enter";
        delete _myclass;
    }
};
TEST_F(MyClassTest, private)
{
    //_myclass初始化之后,执行3次,销毁
    _myclass->init(R"(...)");
    for (int i = 0; i < 3; i++)
    {
        _myclass->process(NULL, NULL);
    }
    _myclass->release();
}

原理分析:


#define TEST_F(test_fixture, test_name) \
    GTEST_TEST_(test_fixture, test_name, test_fixture, ::testing::internal::GetTypeId<test_fixture>())


#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
    test_suite_name##_##test_name##_Test


#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)        \
    static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1,                \
                  "test_suite_name must not be empty");                         \
    static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1,                      \
                  "test_name must not be empty");                               \
    class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                    \
        : public parent_class                                                   \
    {                                                                           \
    public:                                                                     \
        GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                      \
        () {}                                                                   \
                                                                                \
    private:                                                                    \
        virtual void TestBody();                                                \
        static ::testing::TestInfo *const test_info_ GTEST_ATTRIBUTE_UNUSED_;   \
        GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
                                                               test_name));     \
    };
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
    type(type const &) = delete;              \
    GTEST_DISALLOW_ASSIGN_(type)
#define GTEST_DISALLOW_ASSIGN_(type) \
    void operator=(type const &) = delete
展开之后:
static_assert(sizeof("MyClassTest")) > 1,                
                "MyClassTest must not be empty");                         
static_assert(sizeof("private")) > 1,                              
                "private must not be empty");    


class MyClassTest_private_test
    : public MyClassTest
{                                                                                 
public:
    MyClassTest_private_test() {}                                       


private:
    virtual void TestBody();
    static ::testing::TestInfo *const test_info_ __attribute__((unused));
    MyClassTest_private_test(MyClassTest_private_test const &) = delete;
    void operator=(type const &) = delete;
};

结论

1.通过上面展开分析FRIEND_TEST(MyClassTest, private);和TEST_F(MyClassTest, private)
两对名字相同友缘类才能真正生效。

2.单元测试gtest内置一个main函数,需要搭建main需要的开发环境

3.gtest测试一个类,原理是使用了friend class,这样可以访问private

4.如果没有gtest,被测试类增加一个新建一个类并增加friend class权限,主流程可以执行到这个类,依然可以达到gtest的效果。

5.不知道其中的原理,只是按固定流程走,就是计算机迷信,迷信1和迷信2没有区别。文章来源地址https://www.toymoban.com/news/detail-705202.html

到了这里,关于gtest概念应用及原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软件应用开发】小米便签APP维护开发

    本文主要介绍在小米便签APP原有功能的基础上,设计并实现了便签添加图片的功能,从开发过程、运行界面、源代码三个方面进行详细介绍。 本文引用小米便签社区开源版代码:https://github.com/MiCode/Notes 小米便签APP维护开发完整源代码地址:https://download.csdn.net/download/weixin_

    2024年02月02日
    浏览(86)
  • 软件测试/测试开发丨ChatGPT在软件测试领域的应用

    随着互联网技术的迅速发展,软件已经成为现代社会中不可或缺的一部分。而软件测试作为保障软件质量的关键环节,也越来越受到人们的关注。在这个领域,ChatGPT作为一种新型的人工智能技术,正逐渐应用于软件测试领域,为软件测试带来了诸多创新和改进。 在软件测试

    2024年02月14日
    浏览(63)
  • 系统分析师---论软件开发模型及应用

    论题:论软件开发模型及应用 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发过程包括需求、设计、编码和测试等阶段,有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要任务

    2024年02月04日
    浏览(57)
  • 区块链技术在软件开发中的应用

    如果你是一名软件开发者或者IT从业者,你一定已经听说过区块链技术。区块链是一种基于密码学的分布式账本技术,被广泛应用于数字货币、金融、物联网等领域。但是,除了这些领域之外,区块链技术还可以在软件开发中发挥重要作用。本文将介绍区块链技术在软件开发

    2023年04月27日
    浏览(78)
  • Android 平台应用软件开发(学习中)

    1,LinearLayout(线性布局),RelativeLayout(相对布局),FrameLayout(帧布局),AbsoluteLayout(绝对布局),TableLayout(表格布局)。 2,线性布局中的控件属性说明 ①android:background,设置UI控件的背景,其值可以是资源文件夹中的图片或者是颜色的十六进制值。 ②android:orientation,该属性是线性布局

    2024年02月04日
    浏览(47)
  • 直播软件app开发:如何开发一个可以免费打扑克的直播应用?

    作为一个技术开发人员,我深知直播软件app开发的重要性。在这个数字化时代,越来越多的人选择使用直播软件来分享自己的生活和与朋友互动。而随着技术的发展,直播软件也不断更新和改进,为用户提供更好的体验和功能。 对于开发者来说,以视频直播app源码为基础进行

    2024年02月16日
    浏览(67)
  • 如何应用项目管理软件进行敏捷开发管理

    敏捷开发(Agile Development)是一种软件开发方法论,强调在不断变化的需求和环境下,通过迭代、协作和自适应的方式来开发软件。敏捷方法的目标是提供更快、更灵活、更高质量的软件交付,以满足客户需求并实现项目成功。 在技术研发团队使用敏捷开发来完成一个迭代时

    2024年02月12日
    浏览(59)
  • 微服务:解放软件开发的神器,引领企业级应用的未来

    目录 1、什么是微服务? 1.1 微服务的定义 1.2 微服务架构的特点 2、微服务的优势 2.1 灵活性和可扩展性 2.2 模块化开发和部署 2.3 高可用性和容错性 2.4 技术栈的多样性 3、微服务的挑战 3.1 分布式系统的复杂性 3.2 服务之间的通信和协调 3.3 数据一致性和事务管理 3.4 性能监控

    2024年02月22日
    浏览(54)
  • 麦芯(MachCore)应用开发教程1 --- 设备软件中间件

    黄国强 2024/1/10 acloud@163.com         对任何公司来说,在短时间内开发一款高质量设备专用软件,是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台,让客户快速高效的开发自己的设备专用软件。麦芯

    2024年01月25日
    浏览(42)
  • 中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例

    中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例 软件特色: 1、功能实用,操作简单,不会电脑也会操作,软件免安装,已内置数据库。软件在关闭的时候,可以设置会员数据备份到U盘,数据本机备份一份,U盘备份一份,双重备份数据安全。 2、软件既

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包