C++那些事之项目篇Catch2

C++那些事之项目篇Catch2

今天推荐一个值得学习的开源项目"Catch2" ,之前写过如何使用google的googletest编写单元测试,你会发现需要编译生成lib库,比较麻烦,而Catch2是一个Header only库,能够快速使用,只需要引入header file,便可以直接使用,本节的练习代码将会在星球提供,已在星球的阅读下载即可,不在的可以扫末尾二维码加入哦。

本节对应的视频教程:

C++那些事之项目篇Catch2_第1张图片

任何一个大型项目都需要单元测试,那么本节就来引入项目篇之快速单元测试系列之一Catch2。

Catch2是一个功能丰富的C++测试框架,用于编写单元测试、集成测试和功能测试。它是一个开源项目,旨在提供简洁、直观和强大的测试编写和执行体验。

使用Catch2可以轻松编写和组织测试用例,并提供丰富的断言和测试宏来验证代码的行为和预期输出。它具有清晰的测试报告输出,支持标记和过滤测试用例,以及灵活的测试配置选项。

https://github.com/catchorg/Catch2/tree/v2.13.10

C++那些事之项目篇Catch2_第2张图片

Catch2支持TDD (Test-Driven Development) 和 BDD (Behavior-Driven Development) 。

TDD 的核心理念是在编码之前先编写测试用例,这有助于开发者更清楚地了解所需的功能,并在开发过程中提供反馈和验证。

BDD(行为驱动开发)是一种从用户行为的角度出发的开发方法。它强调使用自然语言来描述系统的行为,并将这些描述转化为可执行的测试用例。

TDD示例:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

// 阶乘函数
int factorial(int n) {
    if (n <= 0)
        return 1;
    else
        return n * factorial(n - 1);
}

TEST_CASE("Factorial Calculation") {
    SECTION("Factorial of positive integer") {
        REQUIRE(factorial(5) == 120);
        REQUIRE(factorial(6) == 720);
        REQUIRE(factorial(10) == 3628800);
    }

    SECTION("Factorial of zero") {
        REQUIRE(factorial(0) == 1);
    }

    SECTION("Factorial of negative integer") {
        REQUIRE(factorial(-5) == 1);
        REQUIRE(factorial(-10) == 1);
    }
}

BDD示例:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

// 阶乘函数
int factorial(int n) {
    if (n <= 0)
        return 1;
    else
        return n * factorial(n - 1);
}

SCENARIO("Factorial Calculation", "[factorial]") {
    GIVEN("A positive integer") {
        int n = 5;

        WHEN("Factorial function is called") {
            int result = factorial(n);

            THEN("The result should be the factorial of the input number") {
                int expected = 120;
                REQUIRE(result == expected);
            }
        }
    }

    GIVEN("Zero as the input") {
        int n = 0;

        WHEN("Factorial function is called") {
            int result = factorial(n);

            THEN("The result should be 1") {
                int expected = 1;
                REQUIRE(result == expected);
            }
        }
    }

    GIVEN("A negative integer") {
        int n = -5;

        WHEN("Factorial function is called") {
            int result = factorial(n);

            THEN("The result should be 1") {
                int expected = 1;
                REQUIRE(result == expected);
            }
        }
    }
}

可以看到以上示例的写法完全不一样!

最后,值得一提的是Catch2 v3版本出来了,最大的变化是Catch2不再是一个单头库,因此如果想只用一个header file,就下载v2版本吧。本节完!

C++那些事之项目篇Catch2_第3张图片

你可能感兴趣的:(c++,单元测试,驱动开发,开发语言)