Catch-C/C++-Tests
Für die meisten Funktionen bevorzugen wir die sqllogic-Tests. Für bestimmte Tests reicht SQL allein jedoch nicht aus. Das ist typischerweise der Fall, wenn Sie die C++-API testen möchten. Wenn reines SQL wirklich keine Option ist, kann ein C++-Test mit Catch nötig sein.
Catch-Tests liegen ebenfalls im Testverzeichnis. Hier ein Beispiel für einen Catch-Test, der die Speicherung des Systems prüft:
#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);}Der Test verwendet den Wrapper TEST_CASE, um jeden Test anzulegen. Die Datenbank wird über die C++-API erstellt und abgefragt. Ergebnisse werden entweder mit REQUIRE_FAIL / REQUIRE_NO_FAIL (entsprechend statement ok und statement error) oder mit REQUIRE(CHECK_COLUMN(...)) (entsprechend einer Query mit Ergebnisprüfung) geprüft. Jeder so erstellte Test muss in der zugehörigen CMakeLists.txt ergänzt werden.