当前位置: 首页 > article >正文

山寨一个Catch2的SECTION

Catch2 是一个 C++ 单元测试库,吹嘘自己比 NUnit 和 xUnit 还要高明, 支持在 TEST_CASE() 中的多个 SECTION, 意思是说 SECTION 外头的代码相当于setup 和 teardown,section 内部则被认为是实际的 test case, 这种写法可以省很多代码,云云:

https://github.com/catchorg/Catch2/blob/v2.x/docs/tutorial.md#test-cases-and-sections
在这里插入图片描述
然而 Catch2 文档里卖关子,不说原理。 我们来山寨一个:

test2.cpp

#include <stdio.h>
#include <vector>

static int section_idx = 0;

void test()
{
    printf("comman setup\n");
    std::vector<int> v(5);

    if (section_idx == 0)
    {
        printf("--- check 1\n");
        v.resize(10);
        printf("v.size() = %d\n", v.size());
    }

    if (section_idx == 1)
    {
        printf("--- check 2\n");
        printf("v.size() = %d\n", v.size());
    }

    if (section_idx == 2)
    {
        printf("--- check 3\n");
        v.resize(20);
        printf("v.size() = %d\n", v.size());
    }

    if (section_idx == 3)
    {
        printf("--- check 4\n");
        printf("v.size() = %d\n", v.size());
    }

    printf("\n");
    section_idx++;
}

int main()
{
    for (int i = 0; i < 4 ; i++)
    {
        test();
    }

    return 0;
}

改进一下:
test3.cpp:

#include <stdio.h>
#include <vector>

static int section_idx = 0;

void test()
{
    printf("comman setup\n");
    std::vector<int> v(5);

    auto f0 = [&]() -> void
    {
        printf("--- check 1\n");
        v.resize(10);
        printf("v.size() = %d\n", v.size());
    };
    if (section_idx == 0)
        f0();

    auto f1 = [&]() -> void
    {
        printf("--- check 2\n");
        printf("v.size() = %d\n", v.size());
    };
    if (section_idx == 1)
        f1();

    auto f2 = [&]() -> void
    {
        printf("--- check 3\n");
        v.resize(20);
        printf("v.size() = %d\n", v.size());
    };
    if (section_idx == 2)
        f2();

    auto f3 = [&]() -> void
    {
        printf("--- check 4\n");
        printf("v.size() = %d\n", v.size());
    };
    if (section_idx == 3)
        f3();

    printf("\n");
    section_idx++;
}

int main()
{
    for (int i = 0; i < 4 ; i++)
    {
        test();
    }

    return 0;
}

再改进一下:

#include <stdio.h>
#include <vector>

static int section_idx = 0;
int section_num = 0;

void test()
{
    static bool inited = false;

    printf("comman setup\n");
    std::vector<int> v(5);

    auto f0 = [&]() -> void
    {
        printf("--- check 1\n");
        v.resize(10);
        printf("v.size() = %d\n", v.size());
    };
    if (!inited)
        section_num++;
    else
    {
        if (section_idx == 0)
            f0();
    }

    auto f1 = [&]() -> void
    {
        printf("--- check 2\n");
        printf("v.size() = %d\n", v.size());
    };
    if (!inited)
        section_num++;
    else
    {
        if (section_idx == 1)
            f1();
    }

    auto f2 = [&]() -> void
    {
        printf("--- check 3\n");
        v.resize(20);
        printf("v.size() = %d\n", v.size());
    };
    if (!inited)
        section_num++;
    else
    {
        if (section_idx == 2)
            f2();
    }

    auto f3 = [&]() -> void
    {
        printf("--- check 4\n");
        printf("v.size() = %d\n", v.size());
    };
    if (!inited)
        section_num++;
    else
    {
        if (section_idx == 3)
            f3();
    }

    printf("\n");
    section_idx++;
    inited = true;
}

int main()
{
    test();
    for (int i = 0; i < section_num ; i++)
    {
        test();
    }

    return 0;
}

结果:

➜  shanzhai_catch2 ./a.out
comman setup

comman setup
--- check 2
v.size() = 5

comman setup
--- check 3
v.size() = 20

comman setup
--- check 4
v.size() = 5

comman setup

成功!


http://www.kler.cn/a/399002.html

相关文章:

  • WEB服务器实现(药品商超)
  • LLMs 训练经验篇
  • 小程序19-微信小程序的样式和组件介绍
  • 蓝桥杯每日真题 - 第15天
  • 通过JS删除当前域名中的全部COOKIE教程
  • 神经网络的正则化(一)
  • python strip() 详解
  • Mysql-DML语句
  • 基于YOLOv8深度学习的城市管理卡车违规倾倒垃圾检测(PyQt5界面+数据集+训练代码)
  • C++11标准模板(STL)- 算法 - 对一个范围内的拥有一定未指定类型的元素排序(qsort, qsort_s)
  • Flutter中的Material Theme完全指南:从入门到实战
  • 深入解析 Vue 3 中的 `v-model` 与相关知识点
  • 架构篇(理解架构的模式1)
  • SSH 与 SSL:主要区别及用途说明
  • 【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
  • Linux dpkg命令详解
  • AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!
  • 给阿里云OSS绑定域名并启用SSL
  • vue3 如何调用第三方npm包内部的 pinia 状态管理库方法
  • Python脚本实现批量文件重命名与清单生成
  • 前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法
  • Spring纯注解开发
  • 【数据库】mysql数据库迁移前应如何备份数据?
  • 机器学习的概览
  • 【金融风控】样本不均衡和异常点检测
  • 随机森林(Random Forest, RF)筛选回归数据(处理异常值)