Catch C/C++ 테스트

Catch C/C++ 테스트

대부분의 기능을 테스트할 때 sqllogic 테스트를 선호하지만, 특정 테스트에서는 SQL만으로는 충분하지 않아요. 이는 보통 C++ API를 테스트하려 할 때 발생해요. 순수 SQL을 사용하는 것이 정말 옵션이 아닐 때는 Catch를 사용한 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에 추가해야 해요.

더 알아보기 (Learn more)

  • sqllogictest 문서에서 SQL 테스트 작성 방법을 확인해요.