当前位置: 首页 > 知识库问答 >
问题:

如何使用“测试”包在Go测试中打印?

钱飞翼
2023-03-14

我在Go中运行一个测试,用一个语句打印一些东西(例如,用于测试的调试),但是它没有打印任何东西。

func TestPrintSomething(t *testing.T) {
    fmt.Println("Say hi")
}

当我对此文件运行go测试时,输出如下:

ok      command-line-arguments  0.004s

据我所知,真正让它打印出来的唯一方法是通过t.Error()打印出来,如下所示:

func TestPrintSomethingAgain(t *testing.T) {
    t.Error("Say hi")
}

其输出如下:

Say hi
--- FAIL: TestPrintSomethingAgain (0.00 seconds)
    foo_test.go:35: Say hi
FAIL
FAIL    command-line-arguments  0.003s
gom:  exit status 1

我用谷歌搜索并查看了手册,但没有找到任何东西。

共有3个答案

马哲
2023-03-14

t.Log() 在测试完成之前不会显示,因此,如果您尝试调试挂起或性能不佳的测试,则似乎需要使用 fmt

是:截至Go 1.13(2019年8月)都是如此。

接下来是第24929期golang.org

考虑以下(愚蠢的)自动化测试:

func TestFoo(t *testing.T) {
  t.Parallel()

  for i := 0; i < 15; i++ {
      t.Logf("%d", i)
      time.Sleep(3 * time.Second)
  }
}

func TestBar(t *testing.T) {
  t.Parallel()

  for i := 0; i < 15; i++ {
      t.Logf("%d", i)
      time.Sleep(2 * time.Second)
  }
}

func TestBaz(t *testing.T) {
  t.Parallel()

  for i := 0; i < 15; i++ {
      t.Logf("%d", i)
      time.Sleep(1 * time.Second)
  }
}

如果我运行 go test -v,在完成所有 TestFoo 之前,我不会得到任何日志输出,那么在完成所有 TestBar 之前,我不会得到任何输出,在完成所有 TestBaz 之前,我也不会再得到任何输出。
如果测试正在运行,这很好,但是如果存在某种错误,则在一些情况下,缓冲日志输出是有问题的:

    < li >在本地迭代时,我希望能够做出更改,运行我的测试,立即查看日志中发生的情况以了解发生了什么,如果需要,按CTRL+C键提前关闭测试,做出另一个更改,重新运行测试,等等。< br >如果< code>TestFoo很慢(例如,它是一个集成测试),我直到测试结束时才得到日志输出。这大大降低了迭代的速度。 < li >如果< code>TestFoo有一个错误导致它挂起并且永远无法完成,我将不会得到任何日志输出。在这些情况下,< code>t.Log和< code>t.Logf根本没有用。< br >这使得调试非常困难。 < li >此外,我不仅得不到日志输出,而且如果测试挂起的时间太长,或者Go test超时在10分钟后终止测试,或者如果我增加超时,许多CI服务器也会在一定时间后(例如CircleCI中的10分钟)没有日志输出时终止测试。< br >所以现在我的测试被终止了,日志中没有任何东西告诉我发生了什么。

但是对于(可能)Go 1.14 (Q1 2020): CL 127120

现在的输出是:

=== RUN   TestFoo
=== PAUSE TestFoo
=== RUN   TestBar
=== PAUSE TestBar
=== RUN   TestBaz
=== PAUSE TestBaz
=== CONT  TestFoo
=== CONT  TestBaz
    main_test.go:30: 0
=== CONT  TestFoo
    main_test.go:12: 0
=== CONT  TestBar
    main_test.go:21: 0
=== CONT  TestBaz
    main_test.go:30: 1
    main_test.go:30: 2
=== CONT  TestBar
    main_test.go:21: 1
=== CONT  TestFoo
    main_test.go:12: 1
=== CONT  TestBaz
    main_test.go:30: 3
    main_test.go:30: 4
=== CONT  TestBar
    main_test.go:21: 2
=== CONT  TestBaz
    main_test.go:30: 5
=== CONT  TestFoo
    main_test.go:12: 2
=== CONT  TestBar
    main_test.go:21: 3
=== CONT  TestBaz
    main_test.go:30: 6
    main_test.go:30: 7
=== CONT  TestBar
    main_test.go:21: 4
=== CONT  TestBaz
    main_test.go:30: 8
=== CONT  TestFoo
    main_test.go:12: 3
=== CONT  TestBaz
    main_test.go:30: 9
=== CONT  TestBar
    main_test.go:21: 5
=== CONT  TestBaz
    main_test.go:30: 10
    main_test.go:30: 11
=== CONT  TestFoo
    main_test.go:12: 4
=== CONT  TestBar
    main_test.go:21: 6
=== CONT  TestBaz
    main_test.go:30: 12
    main_test.go:30: 13
=== CONT  TestBar
    main_test.go:21: 7
=== CONT  TestBaz
    main_test.go:30: 14
=== CONT  TestFoo
    main_test.go:12: 5
--- PASS: TestBaz (15.01s)
=== CONT  TestBar
    main_test.go:21: 8
=== CONT  TestFoo
    main_test.go:12: 6
=== CONT  TestBar
    main_test.go:21: 9
    main_test.go:21: 10
=== CONT  TestFoo
    main_test.go:12: 7
=== CONT  TestBar
    main_test.go:21: 11
=== CONT  TestFoo
    main_test.go:12: 8
=== CONT  TestBar
    main_test.go:21: 12
    main_test.go:21: 13
=== CONT  TestFoo
    main_test.go:12: 9
=== CONT  TestBar
    main_test.go:21: 14
=== CONT  TestFoo
    main_test.go:12: 10
--- PASS: TestBar (30.01s)
=== CONT  TestFoo
    main_test.go:12: 11
    main_test.go:12: 12
    main_test.go:12: 13
    main_test.go:12: 14
--- PASS: TestFoo (45.02s)
PASS
ok      command-line-arguments  45.022s

正如戴夫·切尼在“< code > Go test-v streaming output”中所证明的那样,Go 1.14中确实包含了这一点:

在Go 1.14中,go test-v将在发生时流式传输t.Log输出,而不是将其囤积到测试运行结束。

Go 1.14下的< code>fmt。Println和< code>t.Log行是交错的,而不是等待测试完成,表明使用< code>go test -v时测试输出是流式的。

戴夫认为,优势在于:

对于集成式测试来说,这是一个很大的生命质量改进,当测试失败时,这些测试通常会重试很长时间
流媒体t。日志输出将帮助Gophers调试这些测试失败,而无需等到整个测试超时才能接收其输出。

邹学民
2023-03-14

例如

package verbose

import (
    "fmt"
    "testing"
)

func TestPrintSomething(t *testing.T) {
    fmt.Println("Say hi")
    t.Log("Say bye")
}
go test -v
=== RUN TestPrintSomething
Say hi
--- PASS: TestPrintSomething (0.00 seconds)
    v_test.go:10: Say bye
PASS
ok      so/v    0.002s

命令go

测试标志说明

-v
Verbose output: log all tests as they are run. Also print all
text from Log and Logf calls even if the test succeeds.

包装测试

函数(*T)日志

func (c *T) Log(args ...interface{})

Log使用默认格式设置其参数的格式,类似于Println,并将文本记录在错误日志中。对于测试,只有当测试失败或设置了-test.v标志时,才会打印文本。对于基准测试,总是打印文本,以避免性能依赖于-test.v标志的值。

廖绍辉
2023-03-14

结构测试。T测试。B 两者都有一个 .日志.Logf方法听起来就是你正在寻找的。。日志.洛格调频器相似。打印调频器。分别打印。

在这里查看更多详细信息:http://golang.org/pkg/testing/#pkg-index

fmt. Xprint语句在测试中确实有效,但您会发现它们的输出可能不在您期望找到它的屏幕上,因此,您应该在test中使用日志记录方法。

如果像您的情况一样,要查看未失败的测试的日志,则必须提供 go 测试 -v 标志(v 表示详细程度)。有关测试标志的更多详细信息,请参阅此处:https://golang.org/cmd/go/#hdr-Testing_flags

 类似资料:
  • 我在Go中运行一个测试,用一个语句打印一些东西(例如,用于测试的调试),但是它没有打印任何东西。 当我对此文件运行go测试时,输出如下: 据我所知,真正让它打印出来的唯一方法是通过t.Error()打印出来,如下所示: 其输出如下: 我用谷歌搜索并查看了手册,但没有找到任何东西。

  • 问题内容: 我有以下代码: 我想为此编写测试,但不确定如何使用httptest包。 问题答案: 在这里看看: https://golang.org/pkg/net/http/httptest/#example_Server 基本上,您可以使用函数创建一个新的“模拟” http服务器。 您可以让模拟服务器返回测试所需的任何响应,还可以让模拟服务器存储函数发出的请求以对其进行断言。

  • 我有一个Gradle Intellij创意项目,我正在使用ratpack。我在试着用鼠笼。测试库来测试我的API,但是它似乎找不到ratpack。测试包。 编译时,它说包ratpack.test不存在。 Gradle:io.ratpack: ratpack-test 1.7.5在我的外部库和模块中。 如果我把鼠标悬停在鼠笼上就会出错。测试导入它显示添加库的Gradle:io。ratpack:rat

  • spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试、打包到最后的投产上线。 开发阶段 单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了。 1、在pom包中添加spring-boot-starter-test包引用 <dependency> <groupId>org.

  • 我想在@DataMongoTest中使用。我不能在@ContextConfiguration中添加它,因为它是一个接口。 我最后做了以下几件事: 这是可行的,但是我不喜欢我需要设置基本包的这个String值的事实。有趣的是,仅靠是行不通的。 在单元测试中是否有另一种方法来实例化?

  • 问题内容: 说,我有以下代码打印一些日志消息。我将如何测试已记录正确的消息?由于通话失败,测试失败。 以下是假设检验: 问题答案: 这类似于“ 如何在Go中测试场景”:您需要实现自己的记录器,默认情况下,该记录器重定向到,但在测试时为您提供了将函数替换为您自己的记录器(不会调用)的机会。 我在测试电话中也做了同样的事情: (在这里,我的“退出”功能是一个空的,什么也不做)