从单元测试到BDD:Catch2测试框架实战指南

从单元测试到BDD:Catch2测试框架实战指南

【免费下载链接】Catch2 A modern, C++-native, test framework for unit-tests, TDD and BDD - using C++14, C++17 and later (C++11 support is in v2.x branch, and C++03 on the Catch1.x branch) 【免费下载链接】Catch2 项目地址: https://gitcode.com/GitHub_Trending/ca/Catch2

你是否还在为C++项目选择合适的测试框架而烦恼?是否觉得传统测试代码冗长难维护?本文将通过两个实战案例,带你快速掌握Catch2(C++原生测试框架)的核心用法,从简单的单元测试到行为驱动开发(BDD),让测试代码变得简洁而强大。读完本文,你将能够:

  • 使用Catch2编写基础单元测试
  • 掌握BDD风格的测试用例设计
  • 理解测试断言的不同类型及应用场景
  • 学会编译和运行Catch2测试程序

Catch2简介

Catch2是一个现代化的C++原生测试框架,支持单元测试(Unit Testing)、测试驱动开发(TDD)和行为驱动开发(BDD)。它使用C++14、C++17及更高版本特性(C++11支持在v2.x分支,C++03在Catch1.x分支),无需外部依赖,只需包含头文件即可使用。

Catch2 Logo

官方文档:docs/tutorial.md

快速开始:第一个单元测试

让我们从经典的阶乘函数测试开始,了解Catch2的基本用法。以下是完整的测试文件:

examples/010-TestCase.cpp

#include <catch2/catch_test_macros.hpp>

static int Factorial( int number ) {
    return number <= 1 ? number : Factorial( number - 1 ) * number;  // fail
// return number <= 1 ? 1      : Factorial( number - 1 ) * number;  // pass
}

TEST_CASE( "Factorial of 0 is 1 (fail)", "[single-file]" ) {
    REQUIRE( Factorial(0) == 1 );
}

TEST_CASE( "Factorials of 1 and higher are computed (pass)", "[single-file]" ) {
    REQUIRE( Factorial(1) == 1 );
    REQUIRE( Factorial(2) == 2 );
    REQUIRE( Factorial(3) == 6 );
    REQUIRE( Factorial(10) == 3628800 );
}

代码解析

  1. 包含头文件#include <catch2/catch_test_macros.hpp> 引入Catch2测试宏

  2. 测试函数Factorial函数实现了阶乘计算,当前版本有一个故意的错误(0的阶乘返回0而非1)

  3. 测试用例

    • TEST_CASE 宏定义一个测试用例,第一个参数是测试名称,第二个是可选的标签(用于分组)
    • REQUIRE 宏是断言宏,如果条件不满足则测试失败并停止当前测试用例

编译与运行

g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 010-TestCase 010-TestCase.cpp && 010-TestCase --success

或在Windows上:

cl -EHsc -I%CATCH_SINGLE_INCLUDE% 010-TestCase.cpp && 010-TestCase --success

预期输出

使用紧凑报告器运行时:

prompt> 010-TestCase --reporter compact --success
010-TestCase.cpp:14: failed: Factorial(0) == 1 for: 0 == 1
010-TestCase.cpp:18: passed: Factorial(1) == 1 for: 1 == 1
010-TestCase.cpp:19: passed: Factorial(2) == 2 for: 2 == 2
010-TestCase.cpp:20: passed: Factorial(3) == 6 for: 6 == 6
010-TestCase.cpp:21: passed: Factorial(10) == 3628800 for: 3628800 (0x375f00) == 3628800 (0x375f00)
Failed 1 test case, failed 1 assertion.

这个例子展示了测试失败和成功的情况,通过注释掉错误行并取消正确行的注释,可以修复测试。

行为驱动开发(BDD)风格测试

Catch2支持BDD风格的测试用例编写,使用SCENARIOGIVENWHENTHEN等宏,使测试更具可读性。以下是一个向量调整大小的BDD测试示例:

examples/120-Bdd-ScenarioGivenWhenThen.cpp

#include <catch2/catch_test_macros.hpp>
#include <vector>

SCENARIO( "vectors can be sized and resized", "[vector]" ) {

    GIVEN( "A vector with some items" ) {
        std::vector<int> v( 5 );

        REQUIRE( v.size() == 5 );
        REQUIRE( v.capacity() >= 5 );

        WHEN( "the size is increased" ) {
            v.resize( 10 );

            THEN( "the size and capacity change" ) {
                REQUIRE( v.size() == 10 );
                REQUIRE( v.capacity() >= 10 );
            }
        }
        WHEN( "the size is reduced" ) {
            v.resize( 0 );

            THEN( "the size changes but not capacity" ) {
                REQUIRE( v.size() == 0 );
                REQUIRE( v.capacity() >= 5 );
            }
        }
        WHEN( "more capacity is reserved" ) {
            v.reserve( 10 );

            THEN( "the capacity changes but not the size" ) {
                REQUIRE( v.size() == 5 );
                REQUIRE( v.capacity() >= 10 );
            }
        }
        WHEN( "less capacity is reserved" ) {
            v.reserve( 0 );

            THEN( "neither size nor capacity are changed" ) {
                REQUIRE( v.size() == 5 );
                REQUIRE( v.capacity() >= 5 );
            }
        }
    }
}

BDD宏解析

  • SCENARIO:定义一个场景,相当于一个测试用例集合
  • GIVEN:设置测试的初始条件
  • WHEN:描述执行的操作
  • THEN:定义预期结果

这种结构使非技术人员也能理解测试的意图,非常适合与产品经理或业务分析师沟通。

编译与运行

g++ -std=c++14 -Wall -I$(CATCH_SINGLE_INCLUDE) -o 120-Bdd-ScenarioGivenWhenThen 120-Bdd-ScenarioGivenWhenThen.cpp && 120-Bdd-ScenarioGivenWhenThen --success

运行后,所有断言都应通过,输出类似:

Passed 1 test case with 16 assertions.

断言类型

Catch2提供了多种断言宏,适应不同场景:

描述失败时行为
REQUIRE检查条件,如果失败则停止当前测试用例停止测试用例
CHECK检查条件,如果失败继续执行当前测试用例继续执行
REQUIRE_FALSE检查条件为false停止测试用例
CHECK_FALSE检查条件为false继续执行

更多断言类型请参考:docs/assertions.md

安装与配置

获取Catch2

可以通过以下方式获取Catch2:

git clone https://gitcode.com/GitHub_Trending/ca/Catch2.git

CMake集成

Catch2提供了CMake配置文件,可以方便地集成到CMake项目中:

CMakeLists.txt

基本集成步骤:

  1. 在项目中包含Catch2目录
  2. 使用add_subdirectory(Catch2)
  3. 链接Catch2库:target_link_libraries(your_target Catch2::Catch2)

详细配置指南:docs/cmake-integration.md

总结

Catch2作为一个现代化的C++测试框架,提供了简洁的API和丰富的功能,支持单元测试和BDD风格测试。通过本文介绍的两个示例,你已经了解了Catch2的基本用法和优势。

要深入学习Catch2,可以参考:

希望本文能帮助你在C++项目中更好地应用测试驱动开发,提高代码质量和可靠性!

点赞收藏本文,关注更多C++测试技巧和最佳实践!下期我们将介绍Catch2的高级特性:参数化测试和自定义断言。

【免费下载链接】Catch2 A modern, C++-native, test framework for unit-tests, TDD and BDD - using C++14, C++17 and later (C++11 support is in v2.x branch, and C++03 on the Catch1.x branch) 【免费下载链接】Catch2 项目地址: https://gitcode.com/GitHub_Trending/ca/Catch2

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值