ChatGPT解决这个技术问题 Extra ChatGPT

如何在指定文件中运行测试用例?

go

我的包测试用例分散在多个文件中,如果我运行 go test <package_name>,它会运行包中的所有测试用例。

但是,没有必要运行所有这些。有没有办法为 go test 指定要运行的文件,以便它只运行文件中定义的测试用例?


Z
Zombo

有两种方法。最简单的方法是使用 -run 标志并提供与您要运行的测试名称匹配的模式。例子:

go test packageName -run NameOfTest

有关详细信息,请参阅 docs。请注意,如果 -run 标志包含字符串 NameOfTest,则它们也可以运行其他测试,因为 -run 标志与正则表达式匹配。因此,为了确保只运行一个名为“NameOfTest”的测试,必须使用正则表达式 ^NameOfTest$

go test -run "^NameOfTest$" 

另一种方法是命名特定文件,其中包含您要运行的测试:

go test -v foo_test.go

但有一个问题。如果:

foo.go 在包 foo 中。

foo_test.go 在包 foo_test 中并导入“foo”。

如果 foo_test.gofoo.go 是同一个包(常见情况),那么您必须命名构建 foo_test 所需的所有其他文件。在此示例中,它将是:

go test foo_test.go foo.go

我建议使用 -run 模式。或者,在可能的情况下,始终运行所有包测试。


您介意用 -run 详细说明第一种(简单)方法吗?我找不到关于那个的任何手册参考。
您还可以通过 go help testflag 找到有关它的信息
当我使用命令 go test utils.go utils_test.go 时,输出为 ok command-line-arguments 0.002s。它不运行测试。我想使用这种测试模式的原因是因为包包含许多文件,除了 utils 之外它们还没有编译。所以我想在处理其他文件之前完成 utils。我怎样才能做到这一点 ?
T
TomDotTom

@zzzz 的答案大部分是完整的,但只是为了避免其他人不得不挖掘引用的 documentation,您可以在包中运行单个测试,如下所示:

go test packageName -run TestName

请注意,您要传入测试的名称,而不是测试所在的文件名。

-run 标志实际上接受正则表达式,因此您可以将测试运行限制为一类测试。从文档:

-run regexp
    Run only those tests and examples matching the regular
    expression.

值得注意的是包名是完整的包名,例如“github.com/you/stuff/a/b/c”
1.9.3 也接受包的相对路径。
不知道为什么,但由于某种原因,我应该在包名之前指定“./”
F
Francesco Casula

在运行单个测试时,我通常会这样做:

go test -run TestSomethingReallyCool ./folder1/folder2/ -v -count 1

-count 1 还确保每次都运行测试而不是缓存。当您针对竞争条件进行测试并且测试有时会失败时很有用。在不使用 modules 的 Go 版本中,可以通过设置 GOCACHE=off 来实现相同的效果,但这与 Go 模块的交互很差。


您还可以将 -race 标志添加到不同的 go 命令(如 go test),以帮助检测发生竞争条件的位置:golang.org/doc/articles/race_detector.html
D
Dele
go test -v ./<package_name> -run Test

防止缓存测试结果。

go test -count=1 ./<package_name> -run Test

快速注意,如果您的 cmd 行与 *_test.go 文件处于同一级别,则需要在包名称前加上 ../<package_name> 而不是 ./<package_name>
u
user2865442
alias testcases="sed -n 's/func.*\(Test.*\)(.*/\1/p' | xargs | sed 's/ /|/g'"

go test -v -run $(cat coordinator_test.go | testcases)

T
Tim Macinta

Visual Studio Code 在 Go 测试文件的顶部显示一个链接,您可以在该文件中运行所有测试。

https://i.stack.imgur.com/Nyq69.png

在“输出”窗口中,您可以看到它自动生成一个正则表达式,其中包含当前文件中的所有测试名称:

Running tool: C:\Go\bin\go.exe test -timeout 30s -run ^(TestFoo|TestBar|TestBaz)$ rootpackage\mypackage

注意:第一次在 VS Code 中打开 Go 文件时,它会自动为您安装一些 Go 扩展。我假设上述要求您之前已经接受了安装报价。


A
Abhishek Srivastava
go test -v -timeout 30s <path_to_package> -run ^(TestFuncRegEx)

TestFunc 必须在该包中的 go 测试文件中

我们可以提供正则表达式来匹配一组测试用例,或者只提供精确的测试用例函数来运行单个测试用例。例如 -run TestCaseFunc


A
ARIF MAHMUD RANA

我在从我的包中运行单个特定测试时遇到了一些问题,这就是我解决的方法

go test -v -race ./parsers/xml2csv/stld/ -timeout 30s -run '^Test_stldItemParser_readNodes$'

如果我在没有单引号的情况下运行它不起作用我在 Ubuntu-20.04 中使用 oh-my-zsh

这里

-v             for verbosity
-race          to detect race condition
-timeout       for the timeout of the test

这是可选的,可以省略,但很好添加。