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 테스트 작성 방법을 확인해요.