【问题标题】:Go: Print text after the suite has run?Go:在套件运行后打印文本?
【发布时间】:2019-05-03 03:55:39
【问题描述】:

测试包捕获所有输出并且不会打印它,除非测试失败或详细 (-v) 已打开。有没有办法在套件完成后输出文本而不需要打开详细信息?

例如:

func TestMain(m *testing.M) {
    status := m.Run(m)
    fmt.Println("important line to output")
    os.Exit(status)
}

不会打印该行。


编辑:我发现 fmt.Println 将在您从包内部运行测试 (go test) 时有效,但如果指定一个或多个包 (go test ./...) 则不会,除非 -v 选项已启用。

【问题讨论】:

  • 您是在问如何在测试通过后获得输出,但在没有设置-v 标志的情况下运行?
  • 不,我想在所有测试完成后输出一些文本,而不需要 -v 标志。
  • 测试中的输出通常不会发送到标准输出,以防出错。这很重要,因为如果您在详细模式下运行大型项目的测试,您将获得大量通过测试的不重要输出。

标签: go testing


【解决方案1】:

测试包捕获所有输出并且不会打印它,除非 测试失败或详细 (-v) 已打开

是什么让你说标准输出被捕获?如果我将此代码保存到main_test.go 并运行go test

package main

import (
    "fmt"
    "os"
    "testing"
)

func TestJoe(t *testing.T) {
    fmt.Println("from joe")
}

func TestMain(m *testing.M) {
    fmt.Println("before run")
    s := m.Run()
    fmt.Println("after run")
    os.Exit(s)
}

我明白了:

$ go test
before run
from joe
PASS
after run

关于./... 的输出,这里是go help test 的摘录:

第二种,称为包列表模式,在调用 go test 时发生 带有明确的包参数(例如'go test math'、'go test ./...',甚至'去测试')。在这种模式下, go test 编译并 测试命令行中列出的每个包。如果一个包 测试通过,go test 只打印最后的“ok”摘要行。如果一个 package test 失败,go test 打印完整的测试输出。如果被调用 使用 -bench 或 -v 标志,go test 甚至可以打印完整的输出 通过包测试,以显示请求的基准 结果或详细日志记录。

【讨论】:

  • 我发现了一个问题。如果您从包内运行测试,它将输出 (go test),但如果您从外部运行测试 (go test ./mypackage),则不会。我通常使用go test ./...,除非启用-v,否则不会打印任何内容,但随后会得到大量我不想要的其他详细输出。
  • @ElliotChance:我明白了。我在我的答案 PTAL 中添加了 go help test 的摘录
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 2022-06-15
  • 1970-01-01
  • 2022-11-25
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多