是否可以跳过/排除一些正在运行的测试go test?
go test
我有相当多的集成类型测试,它们调用作为标准 go 测试编写的休息服务,并使用go test. 当开发新功能时,有时可以跳过一些测试很有用,例如,如果新功能尚未部署在测试服务器上,而我仍然想运行所有现有测试(除了那些测试的新测试)新功能)。
我知道-run,但我不想指定我想运行的所有测试,那将是一个很长的列表。同时,我无法编写用于排除测试的正则表达式。
-run
另一种选择是不提交不在同一分支中运行的测试,但如果我可以指定要排除的内容会更容易。
你可以使用+build标签
+build
┌─ oneofone@Oa [/t/tst-tag] └──➜ ls a_test.go b_test.go c_test.go
a_test.go :
package tags import "testing" func TestA(t *testing.T) {}
b_test.go :
// +build !feature1 package tags import "testing" func TestB(t *testing.T) {}
c_test.go :
// +build !feature1 // +build !feature2 package tags import "testing" func TestC(t *testing.T) {}
然后使用-tags参数运行测试:
-tags
┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v . | grep PASS: --- PASS: TestA (0.00 seconds) --- PASS: TestB (0.00 seconds) --- PASS: TestC (0.00 seconds) ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v -tags feature1 . | grep PASS: --- PASS: TestA (0.00 seconds) ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v -tags feature2 . | grep PASS: --- PASS: TestA (0.00 seconds) --- PASS: TestB (0.00 seconds)
// 更新:不同的逻辑:
a_test.go:
// +build all package tags import "testing" func TestA(t *testing.T) {}
b_test.go:
// +build all feature1 package tags import "testing" func TestB(t *testing.T) {}
c_test.go:
// +build all feature2 package tags import "testing" func TestC(t *testing.T) {} ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v -tags all | grep PASS: --- PASS: TestA (0.00 seconds) --- PASS: TestB (0.00 seconds) --- PASS: TestC (0.00 seconds) ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v -tags feature1 | grep PASS: --- PASS: TestB (0.00 seconds) ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -v -tags="feature1 feature2" | grep PASS: --- PASS: TestB (0.00 seconds) --- PASS: TestC (0.00 seconds)
或者您按名称调用特定测试,例如:
d_test.go:
package tags import "testing" func TestA1(t *testing.T) {} func TestB1(t *testing.T) {} func TestC1(t *testing.T) {} func TestD1(t *testing.T) {}
输出:
┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -run="(A|B)1" -v | grep PASS: --- PASS: TestA1 (0.00 seconds) --- PASS: TestB1 (0.00 seconds) ┌─ oneofone@Oa [/t/tst-tag] └──➜ go test -run="D1" -v | grep PASS: --- PASS: TestD1 (0.00 seconds)
测试包有SkipNow()和Skip()方法。因此,可以在单个测试之前添加以下内容:
SkipNow()
Skip()
func skipCI(t *testing.T) { if os.Getenv("CI") != "" { t.Skip("Skipping testing in CI environment") } } func TestNewFeature(t *testing.T) { skipCI(t) }
然后,您可以设置环境变量或运行CI=true go test以设置CI为命令局部变量。
CI=true go test
CI
另一种方法是使用短模式。将以下守卫添加到测试中
if testing.Short() { t.Skip("skipping testing in short mode") }
然后执行你的测试 go test -short
go test -short