go 测试:测试一组软件包会阻塞实时输出

5lwkijsr  于 4个月前  发布在  Go
关注(0)|答案(3)|浏览(100)

你正在使用哪个版本的Go( go version )?

go version go1.11 darwin/amd64

这个问题在最新版本中是否重现?

是的,在提示- go version devel +ce58a39fca Thu Sep 20 22:52:44 2018 +0000 darwin/amd64 上重现。

你正在使用什么操作系统和处理器架构( go env )?

GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/ikorolev/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/ikorolev/.gvm/pkgsets/go1.11/global:/Users/ikorolev/dev/go"
GOPROXY=""
GORACE=""
GOROOT="/Users/ikorolev/.gvm/gos/go1.11"
GOTMPDIR=""
GOTOOLDIR="/Users/ikorolev/.gvm/gos/go1.11/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/_b/d1934m9s587_8t_6ngv3hnc00000gp/T/go-build880489854=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

go test -v -count=1 ./... ,如果你有子包,它不会实时打印测试输出。

cd `mktemp -d`
go mod init example.com/test
cat <<EOD > main_test.go
package main

import (
	"fmt"
	"testing"
	"time"
)

func TestLong(t *testing.T) {
	fmt.Println("running")
	time.Sleep(2 * time.Second)
	fmt.Println("2 second later")
}
EOD
mkdir subpkg
cat <<EOD > subpkg/main_test.go
package subpkg
EOD
go test -v -count=1 ./...

你期望看到什么?

我期望看到测试运行时逐步输出结果。
如果运行 go test -v -count=1 . ,我会看到它。

你看到了什么?

使用 ./... 并不会产生实时输出。
只有在所有测试完成后才会产生输出。
当你在CI上运行测试时,如果只看到 "go test -v ./..." 这一行几分钟,这并不方便。
你完全不知道测试是否卡在了某个地方,或者它们只是太慢了。
我知道这种行为可能与并行运行测试有关,但我们能做些什么吗?

tv6aics1

tv6aics11#

@gopherbot please, add label Testing.

6g8kf2rb

6g8kf2rb3#

一个禁用stdout缓冲区的标志可能会有所帮助。或者,至少要记录-p(和-count ?)标志对输出缓冲的影响。

需要注意的是,这个bug与#24929并不完全相同,因为它影响了所有的stdout,而不仅仅是t.Log的使用(也许底层机制是相同的,我不知道)。

我们也关心stdout,因为在TestMain中进行了大量的初始化,而t.Log不可用,我们希望看到进度消息的发生。

相关问题