如何在 Go 中编写使用 -short 标志的测试,它可以与 -benchmark 标志结合使用吗?

2024-04-02

我该如何使用-short给出的标志go test -short?

是否可以结合-short and -benchmark flags?

我对 Go 语言还很陌生,但我正在努力让自己适应它的一些常见做法。其中一部分是尝试确保我的代码不仅以某种方式添加了单元测试go test系统可以工作但是go test -benchmark也以有用的方式发挥作用。

目前我有一个基准测试,其中包括一系列基于不同大小的输入数据的子测试。运行 15 个排列需要很长时间,因此最好能提供缩短测试时间的选项。

我计划编写的下一组测试可能包括一系列数据输入示例。我希望运行其中的一个可以作为短期测试的健全性检查,但如果可以选择在较长(或正常)的测试运行中运行多个,那就太好了。

当我看着测试标志的 GoLang 文档 https://golang.org/cmd/go/#hdr-Testing_flags它说“告诉长时间运行的测试缩短其运行时间。”这听起来像是我想要的,但我无法弄清楚如何在测试代码中选取这个标志。


如何使用 go test -short 中给出的 -short 标志?

在命令行上使用短标志会导致testing.Short()返回的函数true。您可以使用它来添加测试用例或跳过它们:

if testing.Short() == false {
    // Extra test code here
}

上面的内容可能有点不常见,可能更常见的是:

func TestThatIsLong(t *testing.T) {
    if testing.Short() {
        t.Skip()
    }
}

确保有足够的测试用例供您使用-short运行至少进行最低限度的检查。有些人建议使用-short运行主要的持续集成和预提交检查,同时为计划的每日或每周构建或合并保留较长的测试运行。

The Go 编程语言网站的文档部分 https://golang.org/doc/简要提到了如何编写测试代码,但有关该主题的大部分信息都在Go 测试包的包文档 https://golang.org/pkg/testing/。对于大多数主题,大部分文档都可以在包中找到,而不是单独的。这可能与其他语言有很大不同,在其他语言中,类和包文档通常很差。


是否可以组合 -short 和 -benchmark 标志?

这是可能的,因为testing.Short()范围是全球性的。但是,建议基准测试不要广泛使用-short标志来控制他们的行为。运行基准测试的人更常见的是改变-benchtime每个基准测试用例都允许。

默认情况下,基准时间设置为一秒。如果您有 60 个基准测试用例,则完成运行至少需要 60 秒(设置时间 + 执行时间)。如果将替补时间设置得更短:

go test -benchmem -benchtime 0.5s -bench=. <package_names>

总体执行时间将成比例下降。

各种测试 clags 中描述go 命令文档的测试标志部分 https://golang.org/cmd/go/#hdr-Testing_flags(不是没有提到工作时间的包文档)。您不需要在基准测试代码中做任何不同的事情来使基准时间有效,只需使用标准for i := 0; i < b.N; i++ {框架会根据需要调整N的值。

虽然不推荐,但我用过-short在基准测试中,当改变函数的输入以指示其功能时,可以减少测试用例的数量大O表示法 https://en.wikipedia.org/wiki/Big_O_notation。对于所有基准测试运行(短期和正常),我为输入保留代表性数据大小以跟踪长期趋势。对于较长的运行,我包含了几个小型和较大尺寸的数据集,以允许函数资源需求的近似值。与单元测试用例一样,我选择始终在 CI 中运行短版本,并按计划运行较长版本。


无论您对 Go 有何疑问,强烈建议您尝试仔细阅读both the https://golang.org/doc/ https://golang.org/doc/和相关的https://golang.org/pkg/ https://golang.org/pkg/文件。最有用的文档通常位于包文档中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Go 中编写使用 -short 标志的测试,它可以与 -benchmark 标志结合使用吗? 的相关文章