为了详细说明我对@Ainar-G 出色答案的评论,在过去的一年中,我一直在使用-short
与Integration
命名约定的组合来实现两全其美。
单元和集成测试和谐,在同一个文件中
以前的构建标志迫使我拥有多个文件(services_test.go
,services_integration_test.go
等)。
相反,请看下面这个例子,前两个是单元测试,最后我有一个集成测试:
package services
import "testing"
func TestServiceFunc(t *testing.T) {
t.Parallel()
...
}
func TestInvalidServiceFunc3(t *testing.T) {
t.Parallel()
...
}
func TestPostgresVersionIntegration(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
...
}
请注意,最后一个测试具有以下约定:
Integration
在测试名称中使用。
- 检查是否在
-short
标志指令下运行。
基本上,规范是这样写的:“正常编写所有测试。如果是长时间运行的测试或集成测试,请遵循此命名约定并检查是否-short
对您的同行友好。”
仅运行单元测试:
go test -v -short
这为您提供了一组不错的消息,例如:
=== RUN TestPostgresVersionIntegration
--- SKIP: TestPostgresVersionIntegration (0.00s)
service_test.go:138: skipping integration test
仅运行集成测试:
go test -run Integration
这仅运行集成测试。用于在生产中测试金丝雀的烟雾。
显然,这种方法的缺点是如果有人运行go test
,没有-short
标志,它将默认运行所有测试 - 单元测试和集成测试。
实际上,如果您的项目足够大,可以进行单元和集成测试,那么您很可能正在使用一个Makefile
可以在其中使用简单指令go test -short
的地方。或者,只需将其放入您的README.md
文件中,然后就可以结束了。