⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
编写测试

开发与测试

至关重要的是,任何新增加的功能都必须有正确的测试,不仅要测试“正常路径”(happy path),还要测试边缘情况和对该功能的错误使用。在本节中,我们将介绍 DuckDB 测试的结构以及如何为 DuckDB 编写新的测试。

可以通过运行位于 test 文件夹中的 unittest 程序来执行测试。对于默认编译,它位于 build/release/test/unittest (发布版) 或 build/debug/test/unittest (调试版)。

设计理念

在测试 DuckDB 时,我们的目标是通过 SQL 来执行所有测试。我们尽量避免单独测试组件,因为这会使这些组件在日后更难进行更改。因此,我们几乎所有的测试都可以(也应该)用纯 SQL 来表达。当然也有一些例外情况,我们将在 Catch 测试中进行讨论。但在大多数情况下,你应该使用纯 SQL 编写测试。

框架

SQL 测试应使用 sqllogictest 框架编写。

C++ 测试可以使用 Catch 框架编写。

客户端连接器测试

DuckDB 还有针对各种客户端连接器的测试。这些测试通常用相应的客户端语言编写,可以在 tools/*/tests 中找到。它们同时也充当了文档,说明了从特定客户端应该能实现哪些操作。

用于生成测试数据的函数

DuckDB 内置了用于生成测试数据的函数。

test_all_types 函数

test_all_types 表函数生成一个表,其列对应各种类型(BOOLTINYINT 等)。该表有三行,分别编码了每种类型的最小值、最大值和 NULL 值。

FROM test_all_types();
┌─────────┬─────────┬──────────┬─────────────┬──────────────────────┬──────────────────────┬───┬──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┐
│  bool   │ tinyint │ smallint │     int     │        bigint        │       hugeint        │ … │        struct        │   struct_of_arrays   │   array_of_structs   │         map          │        union         │
│ boolean │  int8   │  int16   │    int32    │        int64         │        int128        │   │ struct(a integer, …  │ struct(a integer[]…  │ struct(a integer, …  │ map(varchar, varch…  │ union("name" varch…  │
├─────────┼─────────┼──────────┼─────────────┼──────────────────────┼──────────────────────┼───┼──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ false   │    -128 │   -32768 │ -2147483648 │ -9223372036854775808 │  -17014118346046923… │ … │ {'a': NULL, 'b': N…  │ {'a': NULL, 'b': N…  │ []                   │ {}                   │ Frank                │
│ true    │     127 │    32767 │  2147483647 │  9223372036854775807 │  170141183460469231… │ … │ {'a': 42, 'b': 🦆…   │ {'a': [42, 999, NU…  │ [{'a': NULL, 'b': …  │ {key1=🦆🦆🦆🦆🦆🦆…  │ 5                    │
│ NULL    │    NULL │     NULL │        NULL │                 NULL │                 NULL │ … │ NULL                 │ NULL                 │ NULL                 │ NULL                 │ NULL                 │
├─────────┴─────────┴──────────┴─────────────┴──────────────────────┴──────────────────────┴───┴──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┤
│ 3 rows                                                                                                                                                                                    44 columns (11 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

test_vector_types 函数

test_vector_types 表函数接收 n 个参数 col1, …, coln 以及一个可选的 BOOLEAN 参数 all_flat。该函数生成一个包含 n 列的表:test_vector, test_vector2, …, test_vectorn。在每一行中,每个字段都包含符合其各自列类型的值。

FROM test_vector_types(NULL::BIGINT);
┌──────────────────────┐
│     test_vector      │
│        int64         │
├──────────────────────┤
│ -9223372036854775808 │
│  9223372036854775807 │
│                 NULL │
│         ...          │
└──────────────────────┘
FROM test_vector_types(NULL::ROW(i INTEGER, j VARCHAR, k DOUBLE), NULL::TIMESTAMP);
┌──────────────────────────────────────────────────────────────────────┬──────────────────────────────┐
│                             test_vector                              │         test_vector2         │
│                struct(i integer, j varchar, k double)                │          timestamp           │
├──────────────────────────────────────────────────────────────────────┼──────────────────────────────┤
│ {'i': -2147483648, 'j': 🦆🦆🦆🦆🦆🦆, 'k': -1.7976931348623157e+308} │ 290309-12-22 (BC) 00:00:00   │
│ {'i': 2147483647, 'j': goo\0se, 'k': 1.7976931348623157e+308}        │ 294247-01-10 04:00:54.775806 │
│ {'i': NULL, 'j': NULL, 'k': NULL}                                    │ NULL                         │
│                                                  ...                                                │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

test_vector_types 有一个名为 all_flat 的可选参数,类型为 BOOL。它仅影响向量的内部表示。

FROM test_vector_types(NULL::ROW(i INTEGER, j VARCHAR, k DOUBLE), NULL::TIMESTAMP, all_flat = true);
-- the output is the same as above but with a different internal representation
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南