Buffalo 框架不内置 test 生成器,因其坚持“显式优于隐式”哲学,测试需手动编写或借助 grift 等工具生成骨架;测试文件须置于 actions/ 或 models/ 下、以 _test.go 结尾、用 pop.Connect("test") 连接测试库,并确保数据隔离。

Buffalo 框架本身不提供 buffalo generate test 或类似命令来一键生成测试文件——它默认不生成任何测试桩,所有测试需手动编写或借助第三方工具补充。
为什么没有内置 test 生成器
Buffalo 的设计哲学是“显式优于隐式”,测试结构和断言方式高度依赖项目实际需求(如用 pop 还是 sqlc、是否 mock DB、是否跑集成还是单元),框架不预设测试模板。官方生成器只覆盖 resource、model、action、migration 等运行时必需项,测试留白由开发者自主决定。
手动创建测试文件的最小可行路径
Buffalo 项目中测试文件必须放在 actions/ 或 models/ 目录下,且文件名以 _test.go 结尾,才能被 go test 自动识别:
- 给
actions/users.go写测试:新建actions/users_test.go,包名保持actions - 给
models/user.go写测试:新建models/user_test.go,包名保持models - 测试函数必须以
Test开头,接收*testing.T参数 - 务必在测试前调用
pop.Connect("test")获取测试数据库连接,不能复用app.Pop()
避免在 TestMain 中重复执行迁移
常见错误是在 TestMain 里无条件调用 migrate.Up,导致多次 go test 运行时提示 “migration already applied”。正确做法是:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 先用
migrate.Reset清空schema_migrations表(仅限测试库) - 再调用
migrate.Up,确保每次测试都从干净 schema 开始 - 测试数据库连接必须显式指定为
"test",不能依赖环境变量误连开发库
用 grift 快速生成测试骨架(非官方但实用)
虽然 Buffalo 不带 test 生成器,但你可以用 grift(Buffalo 的任务系统)写一个轻量脚本,自动创建带基础 setup 的测试文件:
在 grifts/test_scaffold.go 中写:
package grifts
import (
"os"
"text/template"
"github.com/gobuffalo/buffalo"
)
var _ = buffalo.Group(func(r buffalo.RouteRegister) {
r.GET("/grifts/test-scaffold/{name}", func(c buffalo.Context) error {
name := c.Param("name")
tpl := template.Must(template.New("").Parse(
`package {{.Name}}\n\nimport "testing"\n\nfunc Test{{.Name|title}}(t *testing.T) {\n\t// TODO: add test logic\n}`))
f, _ := os.Create(name + "_test.go")
tpl.Execute(f, map[string]string{"Name": name})
return nil
})
})
然后运行 buffalo task test-scaffold users 就能生成 users_test.go 骨架——这只是辅助,仍需你填入真实逻辑。
真正关键的是测试数据隔离:别让多个测试共用同一张表或同一组 ID,否则并发 go test -race 会失败。最稳的方式是每个测试用独立事务回滚,而不是依赖 truncate 表。

















