如何轻松找出哪些测试失败

时间:2019-03-01 10:21:05

标签: unit-testing go testing

我用go test ./... -v -short测试我的代码。

不幸的是,-v仅在发生每个测试时将其打印出来,而没有像Java一样在底部保留结果摘要。这意味着,如果任何测试在顶部某处失败,则必须向上滚动并查找单词FAIL或在文本编辑器中进行搜索。

-failfast标志也无济于事,因为由于某些原因,我的某些测试在第一次测试失败后仍然可以打印。

我不太在意最初的测试失败后是否运行测试。我只希望能够轻松地判断 任何 测试是否失败,最好仅在一个地方(例如,通过或失败的测试摘要,或查看标记)如果所有测试都通过了)。

有没有一种方法可以轻松判断是否存在测试失败,因为如果我仍然有测试失败,我不想意外地继续编码。

我在64位Windows 10上。

更新: 非常感谢@icza提供的findstr技巧。后来我意识到,我也想查看错误说明以及测试失败,但是不想运行go test两次。这是我为CMD设计的(在Powershell上不起作用):

go test ./... -v -short > test-results.txt & findstr "FAIL _test" test-results.txt

现在findstr应该报告测试失败以及错误描述。而且,如果您想查看完整的测试结果,只需打开test-results.txt

1 个答案:

答案 0 :(得分:2)

失败测试在输出中以FAIL表示。因此,您要做的就是过滤该单词的输出。

在Unix系统上:

go test ./... |grep FAIL

在Windows上:

go test ./... |findstr FAIL

请注意,这纯粹是文本处理,它对go测试及其结果一无所知。这意味着,即使测试成功,即使输出了单词FAIL,您也可能会得到“误报”。但是实际上,这几乎可以完成您想要的工作。

一种更复杂,更准确的方法是将-json标志传递给go test,以便它生成JSON输出,您可以使用程序进行处理(例如,用Go本身编写) 。失败测试用具有"Action":"fail"字段的JSON对象表示,例如

{"Time":"2019-03-01T12:06:21.108544405+01:00","Action":"fail",
 "Package":"some/package","Test":"TestSomething","Elapsed":0.01}

即使您不想为此编写程序,过滤JSON输出也会减少误报的可能性(过滤"Action":"fail"):

Unix:

go test ./... -json |grep '"Action":"fail"'

Windows:

go test ./... -json |findstr /C:"\"Action\":\"fail\""