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

Go 如何在指定的文件中运行测试用例?,go,Go,我的包测试用例分散在多个文件中,如果我运行go test它将运行包中的所有测试用例 不过,没有必要全部运行它们。是否有一种方法可以指定要运行的文件,以便只运行文件中定义的测试用例?有两种方法。最简单的方法是使用-run标志并提供 模式匹配要运行的测试的名称。例如: go test packageName -run NameOfTest 有关更多信息,请参阅。 请注意,-run标志也可以运行其他测试,如果它们包含字符串 NameOfTest,因为-run标志与regexp匹配。所以要确保只有 运

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


不过,没有必要全部运行它们。是否有一种方法可以指定要运行的文件,以便只运行文件中定义的测试用例?

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

go test packageName -run NameOfTest
有关更多信息,请参阅。 请注意,
-run
标志也可以运行其他测试,如果它们包含字符串
NameOfTest
,因为
-run
标志与regexp匹配。所以要确保只有 运行名为“NameOfTest”的测试时,必须使用regexp
^NameOfTest$

go test -run "^NameOfTest$" 
另一种方法是命名包含要运行的测试的特定文件:

go test -v foo_test.go
但有一个陷阱。如果:

  • foo.go
    程序包foo
  • foo_test.go
    位于
    程序包foo_test
    中,并导入“foo”
如果
foo_test.go
foo.go
是同一个包(常见情况),那么您 必须命名生成
foo\u测试所需的所有其他文件。在本例中
将是:

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

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

go test packageName -run TestName
请注意,您希望传入测试的名称,而不是测试所在的文件名

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

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

运行单个测试时,我通常会执行以下操作:

go test-运行testsomething reallycool./folder1/folder2/-v-计数1
-count 1
还确保每次都运行测试,而不是缓存测试。当您在比赛条件下进行测试并且测试有时失败时,此功能非常有用。在Go版本中,可以通过设置
GOCACHE=off
来实现不使用相同的功能,但这与Go模块的交互很差。

Go测试-v-超时30s-运行^(TestFuncRegEx)
go test -v -timeout 30s <path_to_package> -run ^(TestFuncRegEx)
  • TestFunc必须位于该包中的
    go
    测试文件中
  • 我们可以提供一个正则表达式来匹配一组测试用例,或者只提供精确的测试用例函数来运行单个测试用例。例如
    -运行TestCaseFunc
进行测试-v./-运行测试
防止缓存测试结果

go test -count=1 ./<package_name> -run Test
go测试-计数=1./-运行测试

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

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

运行工具:C:\Go\bin\Go.exe测试-超时30s-运行^(TestFoo | TestBar | TestBaz)$rootpackage\mypackage


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

您是否介意详细说明
-run
的第一种(简单)方法?我找不到任何手动参考。当我使用命令
go test utils.go utils\u test.go
时,您还可以使用
go help testflag
查找有关它的信息。输出为
ok命令行参数0.002s
。它不运行测试。我之所以要使用这种测试模式,是因为包中包含许多文件,除了utils之外,它们还没有编译。所以我想在处理其他文件之前完成UTIL。我该怎么做?值得注意的是,包名是完整的包名,例如“github.com/you/stuff/a/b/c”1.9.3也接受包的相对路径。不确定原因,但出于某种原因,我应该在包名之前指定“/”,您还可以将
-race
标志添加到不同的go命令,如
go test
,要帮助检测竞态条件发生的位置:请快速注意,如果cmd行与*\u test.go文件处于同一级别,则需要在包名前面加上
。/
前缀,而不是
go test -v ./<package_name> -run Test
go test -count=1 ./<package_name> -run Test