第 5 章:把项目交付出去——测试、构建与复盘
用临时目录完成生命周期测试,再构建跨平台可执行文件,为这个小项目画上可验证的句号。
项目路线Go 本地待办清单 CLI5 / 5
测试真正保护什么
这个项目最重要的不是某个独立函数,而是连续命令共享同一份数据后仍然正确。因此主测试覆盖完整生命周期:添加两条任务、完成第一条、查看列表、删除第一条,再读取文件确认结果。
使用临时目录隔离数据
dataPath := filepath.Join(t.TempDir(), "tasks.json")
fixedTime := time.Date(2026, 9, 4, 10, 0, 0, 0, time.UTC)
app := App{
Store: Store{Path: dataPath},
Now: func() time.Time { return fixedTime },
}
t.TempDir() 为每个测试创建独立目录,并在测试结束后清理。固定时间让 JSON 内容和断言保持稳定。
验证输出和最终状态
for _, arguments := range [][]string{
{"add", "学习", "Go"},
{"add", "编写测试"},
{"done", "1"},
} {
if err := app.Run(arguments, &output); err != nil {
t.Fatalf("Run(%v) error = %v", arguments, err)
}
}
随后检查列表同时包含 [x] #1 和 [ ] #2。删除 #1 后直接通过 Store.Load 检查只剩编号为 2 的任务。
另外两组测试分别保护输入边界和损坏 JSON。它们能防止未来重构时把“错误输入被接受”或“损坏文件被当成空列表”悄悄带回来。
运行质量检查
在项目目录执行:
gofmt -w .
go vet ./...
go test ./...
三条命令分别检查格式、常见静态问题和行为结果。不要只运行最后一条。
构建可执行文件
当前平台:
go build -o todo .
交叉构建示例:
GOOS=linux GOARCH=amd64 go build -o dist/todo-linux-amd64 .
GOOS=darwin GOARCH=arm64 go build -o dist/todo-darwin-arm64 .
PowerShell 构建 Windows:
$env:GOOS="windows"
$env:GOARCH="amd64"
go build -o dist/todo-windows-amd64.exe .
回看这次完整闭环
你已经经历了一个小型但真实的项目过程:
- 用用户故事约束范围。
- 用模型和边界组织代码。
- 用持久化让数据跨进程存在。
- 用错误处理保护用户数据。
- 用测试证明关键行为。
- 用构建产物完成交付。
下一次做 Web API、桌面应用或更复杂系统时,这个顺序仍然成立。技术栈会变,但“先定义完成,再逐步验证”的方法不会变。
JARVIS · 当前文章
有哪里没看懂?可以只问这篇。
Jarvis 会限定在《第 5 章:把项目交付出去——测试、构建与复盘》及其公开关联内容中检索,并把引用定位回原文章节。