Golang中如何将测试编译为二进制文件并运行单个测试

Golang中如何将测试编译为二进制文件并运行单个测试 我正在开发一个玩具模糊测试工具,希望将测试编译成二进制文件,并且每次只运行单个测试

我使用的是 go1.17 版本,并且已经知道可以使用以下命令来获取二进制文件:

go test -c /path/to/src -o output_name

但是,当我运行这个命令时:

.\pkg.test.exe -test.run TestDemo

或者任何其他 -test 选项(例如 -test.list),它都会失败并输出以下信息:

flag provided but not defined: -test
Usage of pkg.test:
  -test.bench regexp
        run only benchmarks matching regexp
  -test.benchmem
...

有人能帮忙吗?我将不胜感激。


更多关于Golang中如何将测试编译为二进制文件并运行单个测试的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

已解决,是我环境的问题。

更多关于Golang中如何将测试编译为二进制文件并运行单个测试的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个常见的问题,原因是编译后的测试二进制文件在调用时,其命令行参数格式与 go test 命令不同。

当你使用 go test -c 编译测试二进制文件后,运行该二进制文件时,必须省略 -test 前缀。二进制文件内部的标志名称已经包含了 test. 前缀。

正确用法:

对于你的情况,应该这样运行:

# 编译测试二进制文件
go test -c -o pkg.test.exe

# 运行单个测试(注意:使用 -run,而不是 -test.run)
.\pkg.test.exe -run TestDemo

# 列出所有测试
.\pkg.test.exe -list ".*"

# 运行基准测试
.\pkg.test.exe -bench .

# 设置详细输出
.\pkg.test.exe -run TestDemo -v

# 设置测试超时(例如10秒)
.\pkg.test.exe -run TestDemo -timeout 10s

完整示例:

假设你有以下测试文件 math_test.go

package math

import "testing"

func TestAdd(t *testing.T) {
    if Add(1, 2) != 3 {
        t.Error("1 + 2 should be 3")
    }
}

func TestSubtract(t *testing.T) {
    if Subtract(5, 3) != 2 {
        t.Error("5 - 3 should be 2")
    }
}

func TestFuzzMe(t *testing.T) {
    // 你的模糊测试逻辑
    t.Log("Fuzzing test running")
}

编译并运行单个测试:

# 编译
go test -c -o math.test.exe

# 只运行 TestAdd
.\math.test.exe -run TestAdd -v

# 运行所有以 TestFuzz 开头的测试
.\math.test.exe -run TestFuzz -v

# 使用正则表达式运行多个测试
.\math.test.exe -run "Test(Add|Subtract)" -v

对于模糊测试工具的特殊情况:

如果你正在开发模糊测试工具,可能需要更精细的控制。Go 1.17 已经支持原生模糊测试,但如果你需要自定义二进制文件运行,可以这样:

# 编译包含模糊测试的包
go test -c -fuzztime=30s -o fuzzer.exe ./mypackage

# 运行特定的模糊测试
.\fuzzer.exe -run=FuzzMyFunction -test.timeout=1m

关键点:编译后的测试二进制文件直接使用标志名称(如 -run-bench-v),而不需要 -test 前缀。这是因为二进制文件内部的 flag 包已经将这些标志注册为 test.runtest.bench 等,但命令行解析时只需要基础名称。

回到顶部