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
Goose 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++) {
Goose 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(...))(对应带结果校验的 query)进行断言。以该方式新增的每个测试都需要加入对应 CMakeLists.txt。