报告测试失败时,为什么golang测试包会用下划线替换空格?

时间:2018-09-19 16:56:10

标签: testing go

当我运行此测试时,它失败了:

func TestCaseA(t *testing.T){
    t.Run("my name with spaces", func (t *testing.T){
        t.Error("some error message")
    })
}

然后在输出中修改测试名称(空格更改为下划线):

--- FAIL: TestCaseA (0.00s)
    --- FAIL: TestCaseA/my_name_with_spaces (0.00s)
        main.go:10: some error message
FAIL

为什么要这样做?

这是一个有效的示例:https://play.golang.org/p/viZjC60Dazg

2 个答案:

答案 0 :(得分:3)

我在代码本身中找到了我能找到的最明确的答案。 rewrite函数注释为

  

rewrite将一个子名称重写为仅具有可打印字符且没有空格。

https://golang.org/src/testing/match.go#L133

为什么?我猜JimB用他的评论打在了头上。

  

为什么,也许是因为在cli中没有空格的情况下引用名称更容易?

空格对cli不利。

答案 1 :(得分:2)

此博客文章对此进行了解释:https://blog.golang.org/subtests

  

子测试或子基准的全名是其名称及其所有父代名称的斜杠列表,从顶层开始。该名称是顶级测试和基准测试的对应函数名称,否则为Run的第一个参数。为避免显示和解析问题,可以使用下划线替换空格并转义不可打印的字符来对名称进行清理。传递给-run或-bench标志的正则表达式也采用相同的清除方法。

一些示例可能是为了简化自动化工具处理测试输出的过程,以避免外壳产生正则表达式参数(其中包含空格显示为多个参数)的问题。我宁愿避免使用空格而不是处理这种魔术重命名