gotestyourself / gotestsum

'go test' runner with output optimized for humans, JUnit XML for CI integration, and a summary of the test results.
Apache License 2.0
1.99k stars 118 forks source link

`--rerun-fails` doesn't work when `--packages` specifies a source file #398

Open martijnvans opened 3 months ago

martijnvans commented 3 months ago

The error message is an opaque package command-line-arguments is not in std. Here's a simple repro:

$ cat go.mod
module my_module

go 1.23
$ cat my_test.go
package my

import  "testing"

func TestFail(t *testing.T) {
        t.Fatalf("msg")
}

$ gotestsum --debug --packages=my_module --rerun-fails=2 # works
$ gotestsum --debug --packages=my_test.go --rerun-fails=2 # fails, see below output
exec: [go test -json my_test.go]
go test pid: 2695782
✖  command-line-arguments (15ms)

DONE 1 tests, 1 failure in 0.347s

exec: [go test -json -test.run=^TestFail$ command-line-arguments]
go test pid: 2695942
package command-line-arguments is not in std (/usr/lib/<snip>/command-line-arguments)

=== Failed
=== FAIL: command-line-arguments TestFail (0.00s)
    my_test.go:8: msg

=== Errors
package command-line-arguments is not in std (/usr/lib/<snip>/command-line-arguments)

DONE 2 runs, 1 tests, 1 failure, 1 error in 0.355s
ERROR rerun aborted because previous run had errors

It looks to me like the error comes from https://github.com/gotestyourself/gotestsum/blob/e9677fb405a5c0dc0b9d7217a7c73c3a20c5cb66/cmd/rerunfails.go#L33, in which the package that a particular failure occurs in gets pulled out of the test JSON, incorrectly in this case.

I'm not sure what the right fix is. Naively, you could just stop setting pkg: tc.Package, and that would fall back to the set of packages set on the command line and would probably fix my issue. However, it might cause issues in cases where you have multiple tests with the same name across the list of packages. You'd end up rerunning all of them instead of just rerunning that test within an individual package. I'll leave it up to you to decide whether that's worth it.

Right now my automation is trying to use --rerun-fails but it can't, not without restructuring to put each source file into its own subdirectory to work around this issue.

dnephin commented 1 month ago

Thank you for the bug report! I did not realize that go test also accepted file namess, but I tried it and it does attempt to run them. All the files I have fail because they require symbols from other files in the package, but I can imagine this works in some cases.

I think at the very least gotestsum could notice when the arg is a filename and give a better error, but it may also be possible to make this work.