Trang tài liệu
Khóa học C++ nền tảng
Chương 21. Khung làm việc (Framework)
Catch2

Catch2

Catch2 là một khung thử nghiệm hiện đại, gốc C++ dành cho các bài thử nghiệm đơn vị, TDD và BDD. Đây là một thư viện tiêu đề đơn, nghĩa là bạn chỉ cần bao hàm một tệp tiêu đề (catch.hpp) để bắt đầu sử dụng nó. Catch2 nhanh, dễ sử dụng và hỗ trợ nhiều kiểu kiểm tra khác nhau.

Tính năng

  • Tiêu đề đơn: Chỉ cần #include "catch.hpp" và bắt đầu viết bài thử nghiệm.
  • Các trường hợp thử nghiệm: Khai báo các trường hợp thử nghiệm bằng cách sử dụng macro TEST_CASE.
  • Phần: Chia các trường hợp thử nghiệm thành các phần bằng cách sử dụng phần macro.
  • BDD: Thiết kế phát triển dựa trên hành vi được hỗ trợ với SCENARIO, GIVEN, WHEN, THEN.
  • Trình so khớp: Sử dụng trình so khớp tích hợp phong phú để kiểm tra biểu thức thành true hơn.
  • Khám phá thử nghiệm: Catch2 tự động phát hiện các phần và trường hợp thử nghiệm của bạn.

Ví dụ mã code

Trường hợp thử nghiệm cơ bản

#define CATCH_CONFIG_MAIN  // Yêu cầu Catch cung cấp hàm main()
#include "catch.hpp"
 
int add(int a, int b) {
    return a + b;
}
 
TEST_CASE("Addition") {
    REQUIRE(add(2, 3) == 5);
}

Phần

TEST_CASE("Sections example") {
    int a = 1;
 
    SECTION("incrementing a") {
        a++;
        REQUIRE(a == 2);
    }
 
    SECTION("decrementing a") {
        a--;
        REQUIRE(a == 0);
    }
}

Thiết kế BDD

SCENARIO("vector can be sized and resized", "[vector]") {
    std::vector<int> v;
 
    GIVEN("A vector with some items") {
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
 
        REQUIRE(v.size() == 3);
 
        WHEN("the size is increased") {
            v.resize(5);
 
            THEN("the size and contents change") {
                REQUIRE(v.size() == 5);
                REQUIRE(v[3] == 0);
                REQUIRE(v[4] == 0);
            }
        }
        WHEN("the size is reduced") {
            v.resize(2);
 
            THEN("the size changes but not the contents") {
                REQUIRE(v.size() == 2);
                REQUIRE(v[0] == 1);
                REQUIRE(v[1] == 2);
            }
        }
    }
}

Trình so khớp

TEST_CASE("Matchers example") {
    std::string str = "Hello, world!";
 
    CHECK_THAT(str, Catch::Matchers::StartsWith("Hello"));
    CHECK_THAT(str, Catch::Matchers::EndsWith("world!"));
    CHECK_THAT(str, Catch::Matchers::Contains("lo, wo"));
}

Để biết thêm thông tin, hãy truy cập kho lưu trữ Catch2 GitHub.