Skip to content

testing: printing in tests without newline and running with -v -json omits a "run" action #72924

Closed as duplicate

Description

@macabu

Go version

go version go1.24.1 darwin/arm64

Output of go env in your module/workspace:

AR='ar'
CC='clang'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='clang++'
GCCGO='gccgo'
GO111MODULE=''
GOARCH='arm64'
GOARM64='v8.0'
GOAUTH='netrc'
GOBIN='/Users/macabu/go/bin'
GOCACHE='/Users/macabu/Library/Caches/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/Users/macabu/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/1j/6_mdph416630zgmq_7pl7j8m0000gn/T/go-build4105026236=/tmp/go-build -gno-record-gcc-switches -fno-common'
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMOD='/Users/macabu/Projects/gotestcovjson/go.mod'
GOMODCACHE='/Users/macabu/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/macabu/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/nix/store/ja4jxx60lh1qfqfl4z4p2rff56ia1c3c-go-1.24.1/share/go'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/Users/macabu/Library/Application Support/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/nix/store/ja4jxx60lh1qfqfl4z4p2rff56ia1c3c-go-1.24.1/share/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.24.1'
GOWORK=''
PKG_CONFIG='pkg-config'

What did you do?

With the following test file: https://go.dev/play/p/6WawLVaiaFW

package main

import (
	"fmt"
	"testing"
)

func Foo(v bool) {
	if v {
		fmt.Printf("value: %v", v)
	}
}

func TestFooSubTest(t *testing.T) {
	t.Run("true", func(t *testing.T) {
		Foo(true)
	})

	t.Run("false", func(t *testing.T) {
		Foo(false)
	})
}

What did you see happen?

Running:

go test -json ./...

Correctly outputs 3 run actions:

{"Time":"2025-03-18T17:08:10.054122+01:00","Action":"start","Package":"github.com/grafana/gotestcovjson"}
{"Time":"2025-03-18T17:08:10.054156+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest"}
{"Time":"2025-03-18T17:08:10.054158+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"=== RUN   TestFooSubTest\n"}
{"Time":"2025-03-18T17:08:10.054162+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true"}
{"Time":"2025-03-18T17:08:10.054163+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"=== RUN   TestFooSubTest/true\n"}
{"Time":"2025-03-18T17:08:10.054165+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"value: true"}
{"Time":"2025-03-18T17:08:10.05417+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"--- PASS: TestFooSubTest/true (0.00s)\n"}
{"Time":"2025-03-18T17:08:10.054183+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Elapsed":0}
{"Time":"2025-03-18T17:08:10.054186+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false"}
{"Time":"2025-03-18T17:08:10.054187+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Output":"=== RUN   TestFooSubTest/false\n"}
{"Time":"2025-03-18T17:08:10.054189+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Output":"--- PASS: TestFooSubTest/false (0.00s)\n"}
{"Time":"2025-03-18T17:08:10.05419+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Elapsed":0}
{"Time":"2025-03-18T17:08:10.054191+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"--- PASS: TestFooSubTest (0.00s)\n"}
{"Time":"2025-03-18T17:08:10.054195+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Elapsed":0}
{"Time":"2025-03-18T17:08:10.054289+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"PASS\n"}
{"Time":"2025-03-18T17:08:10.05429+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"ok  \tgithub.com/grafana/gotestcovjson\t(cached)\n"}
{"Time":"2025-03-18T17:08:10.054294+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Elapsed":0}

While running:

go test -json -v ./...

Outputs 2 run actions, TestFooSubTest/false missing it:

{"Time":"2025-03-18T17:08:22.035856+01:00","Action":"start","Package":"github.com/grafana/gotestcovjson"}
{"Time":"2025-03-18T17:08:22.035892+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest"}
{"Time":"2025-03-18T17:08:22.035894+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"=== RUN   TestFooSubTest\n"}
{"Time":"2025-03-18T17:08:22.035898+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true"}
{"Time":"2025-03-18T17:08:22.0359+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"=== RUN   TestFooSubTest/true\n"}
{"Time":"2025-03-18T17:08:22.035903+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"value: true=== RUN   TestFooSubTest/false\n"}
{"Time":"2025-03-18T17:08:22.035906+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"--- PASS: TestFooSubTest (0.00s)\n"}
{"Time":"2025-03-18T17:08:22.035919+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"    --- PASS: TestFooSubTest/true (0.00s)\n"}
{"Time":"2025-03-18T17:08:22.035921+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Elapsed":0}
{"Time":"2025-03-18T17:08:22.035925+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Output":"    --- PASS: TestFooSubTest/false (0.00s)\n"}
{"Time":"2025-03-18T17:08:22.035929+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Elapsed":0}
{"Time":"2025-03-18T17:08:22.03593+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Elapsed":0}
{"Time":"2025-03-18T17:08:22.035932+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"PASS\n"}
{"Time":"2025-03-18T17:08:22.035933+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"ok  \tgithub.com/grafana/gotestcovjson\t(cached)\n"}
{"Time":"2025-03-18T17:08:22.035998+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Elapsed":0}

If you tweak the Foo function to print with a newline \n:

func Foo(v bool) {
	if v {
		fmt.Printf("value: %v\n", v)
	}
}

And re-run with:

go test -json -v ./...

It outputs the expected 3 run actions:

{"Time":"2025-03-18T17:09:39.595521+01:00","Action":"start","Package":"github.com/grafana/gotestcovjson"}
{"Time":"2025-03-18T17:09:39.595571+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest"}
{"Time":"2025-03-18T17:09:39.595574+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"=== RUN   TestFooSubTest\n"}
{"Time":"2025-03-18T17:09:39.595577+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true"}
{"Time":"2025-03-18T17:09:39.59558+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"=== RUN   TestFooSubTest/true\n"}
{"Time":"2025-03-18T17:09:39.595585+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"value: true\n"}
{"Time":"2025-03-18T17:09:39.59559+01:00","Action":"run","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false"}
{"Time":"2025-03-18T17:09:39.595592+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Output":"=== RUN   TestFooSubTest/false\n"}
{"Time":"2025-03-18T17:09:39.5956+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Output":"--- PASS: TestFooSubTest (0.00s)\n"}
{"Time":"2025-03-18T17:09:39.595602+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Output":"    --- PASS: TestFooSubTest/true (0.00s)\n"}
{"Time":"2025-03-18T17:09:39.595603+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/true","Elapsed":0}
{"Time":"2025-03-18T17:09:39.595605+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Output":"    --- PASS: TestFooSubTest/false (0.00s)\n"}
{"Time":"2025-03-18T17:09:39.595609+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest/false","Elapsed":0}
{"Time":"2025-03-18T17:09:39.595681+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Test":"TestFooSubTest","Elapsed":0}
{"Time":"2025-03-18T17:09:39.595682+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"PASS\n"}
{"Time":"2025-03-18T17:09:39.595683+01:00","Action":"output","Package":"github.com/grafana/gotestcovjson","Output":"ok  \tgithub.com/grafana/gotestcovjson\t(cached)\n"}
{"Time":"2025-03-18T17:09:39.595689+01:00","Action":"pass","Package":"github.com/grafana/gotestcovjson","Elapsed":0}

What did you expect to see?

The output json to contain 3 run actions in all cases.

Activity

  1. ianlancetaylor commented on Mar 18, 2025

    @ianlancetaylor
    Contributor

    Probably related to the issues discussed in #38063.

  2. changed the title [-]go test: printing in tests without newline and running with -v -json omits a "run" action[/-] [+]testing: printing in tests without newline and running with -v -json omits a "run" action[/+] on Mar 18, 2025
  3. macabu commented on Mar 18, 2025

    @macabu
    Author

    Thanks! We will use the workaround of adding \n

    Perhaps this one can be closed then as duplicate of the one mentioned.

  4. added
    BugReportIssues describing a possible bug in the Go implementation.
    on Mar 18, 2025
  5. locked and limited conversation to collaborators on Mar 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugReportIssues describing a possible bug in the Go implementation.FrozenDueToAge

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions