名称: 测试
描述: 如何编写测试,何时使用每种测试类型,以及如何运行它们。包含关于将 .test 转换为 .sqltest 的信息,以及如何编写 .sqltest 和 Rust 测试。
测试指南
测试类型 & 何时使用
| 类型 | 位置 | 用例 |
|---|---|---|
.sqltest |
testing/runner/tests/ |
SQL 兼容性。新测试的首选 |
TCL .test |
testing/ |
遗留 SQL 兼容(正在逐步淘汰) |
| Rust 集成 | tests/integration/ |
回归测试,复杂场景 |
| Fuzz | tests/fuzz/ |
复杂功能,边缘情况发现 |
注意: TCL 测试正在逐步淘汰,支持 testing/runner。.sqltest 格式允许相同的测试用例在多个后端(CLI、Rust 绑定等)上运行。
运行测试
# 主测试套件(TCL 兼容,sqlite3 兼容,Python 包装器)
make test
# 单个 TCL 测试
make test-single TEST=select.test
# SQL 测试运行器
make -C testing/runner run-cli
# 或者
cargo run -p test-runner -- run <测试文件或目录>
# Rust 单元/集成测试(完整工作区)
cargo test
编写测试
.sqltest(首选)
@database :default:
test 示例加法 {
SELECT 1 + 1;
}
expect {
2
}
test 示例多行 {
SELECT id, name FROM users WHERE id < 3;
}
expect {
1|alice
2|bob
}
位置: testing/runner/tests/*.sqltest
你必须使用测试运行器的 convert 命令开始转换 TCL 测试(例如 cargo run -- convert <TCL_test_path> -o <out_dir>)。它并不总是准确,但会转换大多数测试。如果转换发出警告,你需要手动编写缺失的部分(例如手动展开 for each 循环)。然后,你需要通过运行 make -C testing/runner run-rust 来验证测试是否工作,如果转换有问题,调整输出。此外,在 TCL 中我们使用硬编码数据库,但在 .sqltest 中我们使用不同的种子生成数据库,所以你可能需要更改预期测试结果以匹配新数据库查询输出。避免更改测试中的 SQL 语句,只更改预期结果。
TCL
do_execsql_test_on_specific_db {:memory:} 测试名称 {
SELECT 1 + 1;
} {2}
位置: testing/*.test
Rust 集成
// tests/integration/test_foo.rs
#[test]
fn test_something() {
let conn = Connection::open_in_memory().unwrap();
// ...
}
关键规则
- 每个功能更改都需要一个测试
- 测试必须在没有更改时失败,有更改时通过
- 首选内存数据库:
:memory:(sqltest)或{:memory:}(TCL) - 不要发明新的测试格式。遵循现有模式
- 尽可能先写测试
测试数据库架构
testing/system/testing.db 有 users 和 products 表。有关架构,请参阅 docs/testing.md。
测试期间的日志记录
RUST_LOG=none,turso_core=trace make test
输出: testing/system/test.log。警告:非常详细。