跳到主要内容

调试

测试的目标是尽早发现系统在哪些情况下会出错。系统变更不可避免会导致某些测试失败,而失败后就需要进入调试流程。

首先,始终建议在 debug 模式下运行。可通过 make debug 编译。其次,建议只运行失败的那条测试。可将失败测试文件名作为命令行参数传给测试套件(例如 build/debug/test/unittest test/sql/projection/test_simple_projection.test)。更多“如何只跑部分测试”的方式见触发要运行的测试

之后可附加调试器进行调试。sqllogictest 中通常很难精准断在某条查询上,但我们扩展了测试框架:每次执行查询时都会调用 query_break(line)。这样就可以按行号打条件断点。例如要断在测试文件第 43 行,可设置:

gdb: break query_break if line==43
lldb: break s -n query_break -c line==43

你也可以在文件中使用 mode skip(可选再加 mode unskip)来跳过一段查询。两者之间的查询都不会执行。

触发要运行的测试

运行 unittest 时,默认执行全部快速测试。可通过参数指定单个测试。对于 sqllogictest,该参数即测试文件的相对路径。 只运行单个测试:

build/debug/test/unittest test/sql/projection/test_simple_projection.test

可通过方括号参数运行某目录下全部测试。 例如运行 “projection” 目录下所有测试:

build/debug/test/unittest "[projection]"

使用星号可运行全部测试(含慢测)。 例如:

build/debug/test/unittest "*"

可通过 --start-offset--end-offset 运行测试子区间。 例如运行 200..250:

build/debug/test/unittest --start-offset=200 --end-offset=250

也支持百分比区间。运行 10% - 20%:

build/debug/test/unittest --start-offset-percentage=10 --end-offset-percentage=20

也可从文件加载测试集合(每行一个测试名),并用 -f 传入。

cat test.list
test/sql/join/full_outer/test_full_outer_join_issue_4252.test
test/sql/join/full_outer/full_outer_join_cache.test
test/sql/join/full_outer/test_full_outer_join.test

只运行文件中列出的测试:

build/debug/test/unittest -f test.list