我在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
我用谷歌搜索并查看了手册,但没有找到任何东西。
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
之前,我也不会再得到任何输出。
如果测试正在运行,这很好,但是如果存在某种错误,则在一些情况下,缓冲日志输出是有问题的:
但是对于(可能)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调试这些测试失败,而无需等到整个测试超时才能接收其输出。
例如
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标志的值。
结构测试。T
和测试。B
两者都有一个 .日志
和 .Logf
方法听起来就是你正在寻找的。。日志
和 .洛格
与调频器相似。打印
和调频器。分别打印。
在这里查看更多详细信息:http://golang.org/pkg/testing/#pkg-index
fmt. X
print语句在测试中确实有效,但您会发现它们的输出可能不在您期望找到它的屏幕上,因此,您应该在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中测试场景”:您需要实现自己的记录器,默认情况下,该记录器重定向到,但在测试时为您提供了将函数替换为您自己的记录器(不会调用)的机会。 我在测试电话中也做了同样的事情: (在这里,我的“退出”功能是一个空的,什么也不做)