C++那些事之项目篇Catch2
今天推荐一个值得学习的开源项目"Catch2" ,之前写过如何使用google的googletest编写单元测试,你会发现需要编译生成lib库,比较麻烦,而Catch2是一个Header only库,能够快速使用,只需要引入header file,便可以直接使用,本节的练习代码将会在星球提供,已在星球的阅读下载即可,不在的可以扫末尾二维码加入哦。
本节对应的视频教程:
任何一个大型项目都需要单元测试,那么本节就来引入项目篇之快速单元测试系列之一Catch2。
Catch2是一个功能丰富的C++测试框架,用于编写单元测试、集成测试和功能测试。它是一个开源项目,旨在提供简洁、直观和强大的测试编写和执行体验。
使用Catch2可以轻松编写和组织测试用例,并提供丰富的断言和测试宏来验证代码的行为和预期输出。它具有清晰的测试报告输出,支持标记和过滤测试用例,以及灵活的测试配置选项。
https://github.com/catchorg/Catch2/tree/v2.13.10
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版本吧。本节完!