“可以只运行一个测试文件吗?”——可以,以下是在Go中实现的方法
您是否曾坐在终端前,输入go test ./...,然后惊恐地看着整个Go项目代码库开始运行数百个测试?而您只需要检查刚刚写完的一个小测试文件。熟悉吗?如果是,您来对地方了。
在本文中,我们将解析Stack Overflow上一个热门问题(顺便说一句,它有数千次浏览):“如何在指定文件中运行测试用例?”。我们将根据Go开发者的实际情况调整答案,不仅展示基本命令,还展示能为您节省数小时工作的小技巧。开始吧!
为什么简单的go test并不总是适用?
在大型项目中,测试分为单元测试、集成测试和端到端测试。如果您运行go test ./...,Go会递归遍历所有子包并执行所有找到的测试。这可能需要几分钟。而且,如果您的测试访问数据库或外部API,它们可能会因您无法控制的原因而失败。因此,掌握在指定文件中运行测试用例不仅是便利,更是专业开发者的技能。
基本命令:go test加文件名
最直接的方法是指定具体的测试文件。但这里有一个细微之处:Go要求您同时指定被测试文件和测试文件。为什么?因为编译器需要编译整个包的代码。
假设您的项目结构如下:
myproject/├── main.go└── math_utils.go└── math_utils_test.go要仅从math_utils_test.go运行测试,请执行:
go test -v math_utils.go math_utils_test.go标志-v(详细模式)会输出每个测试用例的详细信息。没有它,您只会看到结果:PASS或FAIL。
真实代码示例
创建一个简单的文件math_utils.go:
package main
func Sum(a, b int) int { return a + b}
func Multiply(a, b int) int { return a * b}以及测试文件math_utils_test.go:
package main
import "testing"
func TestSum(t *testing.T) { result := Sum(2, 3) if result != 5 { t.Errorf("Sum(2, 3) = %d; want 5", result) }}
func TestMultiply(t *testing.T) { result := Multiply(3, 4) if result != 12 { t.Errorf("Multiply(3, 4) = %d; want 12", result) }}现在运行:
$ go test -v math_utils.go math_utils_test.go=== RUN TestSum--- PASS: TestSum (0.00s)=== RUN TestMultiply--- PASS: TestMultiply (0.00s)PASSok command-line-arguments 0.002s请注意输出:ok command-line-arguments。这意味着Go从指定文件编译了一个临时包。这种方法可行,但有局限性。
同一包中有多个文件的问题
如果您的包由多个文件组成(例如math_utils.go和strings_utils.go),并且math_utils_test.go中的测试调用了strings_utils.go中的函数,那么上述命令会因编译错误而失败。Go会报错说函数未定义。
解决方案是列出所有依赖文件。但这很不方便。最好使用另一种方法。
高级方法:按名称过滤测试(-run)
标志-run允许您仅运行名称与正则表达式匹配的测试用例。这不是绑定到文件,但如果您给测试起了有意义的名称,就很容易过滤出所需的测试。
示例:运行所有以TestSum开头的测试:
go test -v -run T