⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
Catch C/C++ 测试

虽然我们更倾向于使用 sqllogic 测试来验证大部分功能,但对于某些测试,仅使用 SQL 是不够的。这种情况通常出现在需要测试 C++ API 时。当纯 SQL 确实无法满足需求时,可能需要使用 Catch 编写 C++ 测试。

Catch 测试同样位于 test 目录下。以下是一个测试系统存储功能的 Catch 测试示例:

#include "catch.hpp"
#include "test_helpers.hpp"

TEST_CASE("Test simple storage", "[storage]") {
    auto config = GetTestConfig();
    unique_ptr<QueryResult> result;
    auto storage_database = TestCreatePath("storage_test");

    // make sure the database does not exist
    DeleteDatabase(storage_database);
    {
        // create a database and insert values
        DuckDB db(storage_database, config.get());
        Connection con(db);
        REQUIRE_NO_FAIL(con.Query("CREATE TABLE test (a INTEGER, b INTEGER);"));
        REQUIRE_NO_FAIL(con.Query("INSERT INTO test VALUES (11, 22), (13, 22), (12, 21), (NULL, NULL)"));
        REQUIRE_NO_FAIL(con.Query("CREATE TABLE test2 (a INTEGER);"));
        REQUIRE_NO_FAIL(con.Query("INSERT INTO test2 VALUES (13), (12), (11)"));
    }
    // reload the database from disk a few times
    for (idx_t i = 0; i < 2; i++) {
        DuckDB db(storage_database, config.get());
        Connection con(db);
        result = con.Query("SELECT * FROM test ORDER BY a");
        REQUIRE(CHECK_COLUMN(result, 0, {Value(), 11, 12, 13}));
        REQUIRE(CHECK_COLUMN(result, 1, {Value(), 22, 21, 22}));
        result = con.Query("SELECT * FROM test2 ORDER BY a");
        REQUIRE(CHECK_COLUMN(result, 0, {11, 12, 13}));
    }
    DeleteDatabase(storage_database);
}

该测试使用 TEST_CASE 包装器来创建每个测试用例。数据库的创建和查询均通过 C++ API 完成。结果检查使用 REQUIRE_FAIL / REQUIRE_NO_FAIL(分别对应 statement ok 和 statement error)或 REQUIRE(CHECK_COLUMN(...))(对应带结果检查的查询)。通过这种方式创建的每个测试都需要添加到相应的 CMakeLists.txt 中。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南