第十九章 测试策略#
"桌面应用的测试,不该只在发布前靠人点一遍。"
Tauri 应用横跨 Rust、前端、IPC、数据库和系统能力。测试策略必须分层:底层快速、上层真实、关键路径自动化。本章建立 Hive 的测试金字塔。
mindmap
root((测试策略))
单元测试
Rust 纯逻辑
前端组件
错误分支
集成测试
SQLite
migration
IPC 契约
E2E
启动
创建笔记
重启验证
CI
PR 快速检查
nightly matrix
release smoke
19.1 测试金字塔#
flowchart TB
E2E["少量 E2E:真实窗口、关键流程"]
Integration["适量集成测试:IPC、数据库、服务"]
Unit["大量单元测试:Rust 函数、前端组件、纯逻辑"]
E2E --> Integration --> Unit
越靠下越快、越稳定;越靠上越接近用户,但也更慢更脆。不要用 E2E 覆盖所有边界条件,也不要只靠单元测试证明应用可用。
19.2 Rust 单元测试#
把业务逻辑从 Tauri command 中拆出来,才能轻松测试。
pub fn validate_title(title: &str) -> Result<(), String> {
if title.trim().is_empty() {
return Err("title is required".into());
}
if title.len() > 120 {
return Err("title too long".into());
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rejects_blank_title() {
assert!(validate_title(" ").is_err());
}
}
19.3 数据库集成测试#
SQLite 测试要覆盖 migration、事务和查询语义。推荐使用临时目录或内存数据库。
#[tokio::test]
async fn creates_and_lists_notes() {
let db = open_test_db().await;
migrate(&db).await.unwrap();
create_note(&db, "n1", "Hello", "Body").await.unwrap();
let notes = list_notes(&db).await.unwrap();
assert_eq!(notes.len(), 1);
assert_eq!(notes[0].title, "Hello");
}
19.4 前端组件测试#
前端测试关注渲染、交互和状态变化。IPC API 应被 mock 成 typed function。
import { mount } from "@vue/test-utils";
import NotesView from "./NotesView.vue";
it("renders notes", async () => {
const wrapper = mount(NotesView, {
global: {
provide: {
notesApi: { list: async () => [{ id: 1, title: "Hello" }] },
},
},
});
await flushPromises();
expect(wrapper.text()).toContain("Hello");
});
19.5 IPC 契约测试#
IPC 是前后端契约,最怕双方各改各的。可以把请求响应类型放到共享 schema,或生成 TypeScript 类型。
flowchart LR
Rust["Rust structs"] --> Schema["JSON Schema / Type Export"]
Schema --> TS["TypeScript types"]
TS --> UI["Frontend API"]
Rust --> Test["Contract tests"]
契约测试至少覆盖命令名、参数名、错误格式和核心返回字段。
19.6 E2E 测试#
E2E 覆盖用户关键路径:
启动应用。
创建笔记。
重启后笔记仍在。
修改后进入待同步状态。
模拟网络恢复后同步完成。
桌面 E2E 可以通过 WebDriver 或 Playwright 驱动 WebView,系统能力则通过测试替身降低不稳定性。
19.7 CI 集成#
pull request
├── cargo fmt / clippy / test
├── npm typecheck / test
├── migration smoke test
├── sphinx docs build
└── nightly e2e matrix
PR 阶段追求快,nightly 阶段追求覆盖面。跨平台打包测试可以放到 nightly 或 release 分支。
19.8 小结#
Hive 的测试策略不是追求某个覆盖率数字,而是把风险放到合适层级验证:纯逻辑单元测,存储集成测,IPC 做契约测,关键用户流程做 E2E。
下一章我们关注性能优化。