软件测试技能Skill testing

本技能提供了全面的软件测试指南,涵盖如何编写.sqltest、TCL和Rust测试,测试运行命令,以及测试最佳实践。适用于开发人员和测试工程师,确保软件质量。关键词:软件测试,测试编写,测试运行,SQL测试,Rust测试,自动化测试。

测试 0 次安装 0 次浏览 更新于 3/25/2026

名称: 测试 描述: 如何编写测试,何时使用每种测试类型,以及如何运行它们。包含关于将 .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.dbusersproducts 表。有关架构,请参阅 docs/testing.md

测试期间的日志记录

RUST_LOG=none,turso_core=trace make test

输出: testing/system/test.log。警告:非常详细。