Flo*_*ish 8 testing unit-testing go
我用 测试我的代码go test ./... -v -short。
不幸的是,-v它只在每次测试发生时将其打印出来,而不会像 Java 那样在底部留下结果摘要。这意味着,如果顶部某处的任何测试失败,我必须向上滚动并查找该单词FAIL或在文本编辑器中搜索它。
这-failfast标志也没有帮助,因为我的一些测试在第一次测试失败后由于某种原因仍然被打印。
我真的不在乎测试在初始测试失败后是否运行。我只是希望能够轻松判断是否有任何测试失败,最好只在一个地方(例如,有多少测试通过或失败的摘要,或者通过查看所有测试是否通过的标志)。
有没有一种方法可以轻松判断是否存在测试失败,因为如果仍然存在测试失败,我不想意外地继续编码。
我使用的是 Windows 10 64 位。
更新:非常感谢@icza 的提示findstr。后来我意识到我还想看到错误描述以及测试失败,但不想运行go test两次。这是我为 CMD 提出的(不适用于 Powershell):
go test ./... -v -short > test-results.txt & findstr "FAIL _test" test-results.txt
Run Code Online (Sandbox Code Playgroud)
现在findstr应该报告测试失败以及错误描述。如果您想查看完整的测试结果,只需打开test-results.txt.
FAIL失败的测试在输出中用指示。因此,您所要做的就是过滤该单词的输出。
在 Unix 系统上:
go test ./... |grep FAIL
Run Code Online (Sandbox Code Playgroud)
在 Windows 上:
go test ./... |findstr FAIL
Run Code Online (Sandbox Code Playgroud)
请注意,这纯粹是文本处理,它不知道有关 go 测试及其结果的任何信息。FAIL这意味着如果测试输出该单词,即使测试成功,您也可能会得到“误报” 。但实际上,这几乎可以完成您想要的工作。
实现此目的的一种更复杂、更准确的方法是将-json标志传递给go test,因此它会生成 JSON 输出,您可以使用程序对其进行处理(例如用 Go 本身编写)。失败的测试由具有字段的 JSON 对象指示"Action":"fail",例如
{"Time":"2019-03-01T12:06:21.108544405+01:00","Action":"fail",
"Package":"some/package","Test":"TestSomething","Elapsed":0.01}
Run Code Online (Sandbox Code Playgroud)
即使您不想为此编写程序,过滤 JSON 输出也会减少误报的可能性(过滤"Action":"fail"):
Unix:
go test ./... -json |grep '"Action":"fail"'
Run Code Online (Sandbox Code Playgroud)
视窗:
go test ./... -json |findstr /C:"\"Action\":\"fail\""
Run Code Online (Sandbox Code Playgroud)
我发现安装gotestsum并在最后得到简洁的摘要是很轻松的。
go install gotest.tools/gotestsum@latest
gotestsum --format testname # Or dots
Run Code Online (Sandbox Code Playgroud)
如果您只关心计数,另一种选择是:
go test |grep FAIL |wc -l
Run Code Online (Sandbox Code Playgroud)