你正在使用哪个版本的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 ./..." 这一行几分钟,这并不方便。
你完全不知道测试是否卡在了某个地方,或者它们只是太慢了。
我知道这种行为可能与并行运行测试有关,但我们能做些什么吗?
3条答案
按热度按时间tv6aics11#
@gopherbot please, add label Testing.
myss37ts2#
与 #24929 相关。
6g8kf2rb3#
一个禁用stdout缓冲区的标志可能会有所帮助。或者,至少要记录-p(和-count ?)标志对输出缓冲的影响。
需要注意的是,这个bug与#24929并不完全相同,因为它影响了所有的stdout,而不仅仅是t.Log的使用(也许底层机制是相同的,我不知道)。
我们也关心stdout,因为在TestMain中进行了大量的初始化,而t.Log不可用,我们希望看到进度消息的发生。