mirror of https://github.com/golang/go.git
cmd/go: always build _test.go files and link into test
go test's handling of _test.go files when the entire
package's set of files has no Test functions has varied
over the past few releases. There are a few interesting
cases (all contain no Test functions):
(1) x_test.go has syntax errors
(2) x_test.go has type errors
(3) x_test.go has runtime errors (say, a func init that panics)
In Go 1.1, tests with (1) or (2) failed; (3) passed.
In Go 1.2, tests with (1) or (2) failed; (3) passed.
In Go 1.3, tests with (1) failed; (2) or (3) passed.
After this CL, tests with (1), (2), or (3) all fail.
This is clearly a corner case, but it seems to me that
the behavior of the test should not change if you
add or remove a line like
func TestAlwaysPasses(t *testing.T) {}
That implies that the _test.go files must always
be built and always be imported into the test binary.
Doing so means that (1), (2), and (3) must all fail.
Fixes #8337.
LGTM=iant
R=golang-codereviews, iant
CC=adg, golang-codereviews, r
https://golang.org/cl/150980043
This commit is contained in:
parent
bfebf9ea80
commit
754cd5419a
|
|
@ -71,6 +71,20 @@ if ! grep -q "/tool/.*/$linker" $d/err.out; then
|
||||||
fi
|
fi
|
||||||
rm -r $d
|
rm -r $d
|
||||||
|
|
||||||
|
TEST broken tests without Test functions all fail
|
||||||
|
d=$(mktemp -d -t testgoXXX)
|
||||||
|
./testgo test ./testdata/src/badtest/... >$d/err 2>&1 || true
|
||||||
|
if grep -q '^ok' $d/err; then
|
||||||
|
echo test passed unexpectedly:
|
||||||
|
grep '^ok' $d/err
|
||||||
|
ok=false
|
||||||
|
elif ! grep -q 'FAIL.*badtest/badexec' $d/err || ! grep -q 'FAIL.*badtest/badsyntax' $d/err || ! grep -q 'FAIL.*badtest/badvar' $d/err; then
|
||||||
|
echo test did not run everything
|
||||||
|
cat $d/err
|
||||||
|
ok=false
|
||||||
|
fi
|
||||||
|
rm -rf $d
|
||||||
|
|
||||||
TEST 'go build -a in dev branch'
|
TEST 'go build -a in dev branch'
|
||||||
./testgo install math || ok=false # should be up to date already but just in case
|
./testgo install math || ok=false # should be up to date already but just in case
|
||||||
d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
|
d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
|
||||||
|
|
|
||||||
|
|
@ -736,11 +736,13 @@ func (b *builder) test(p *Package) (buildAction, runAction, printAction *action,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
if t.ImportTest || ptest.coverMode != "" {
|
if len(ptest.GoFiles) > 0 {
|
||||||
pmain.imports = append(pmain.imports, ptest)
|
pmain.imports = append(pmain.imports, ptest)
|
||||||
|
t.ImportTest = true
|
||||||
}
|
}
|
||||||
if t.ImportXtest {
|
if pxtest != nil {
|
||||||
pmain.imports = append(pmain.imports, pxtest)
|
pmain.imports = append(pmain.imports, pxtest)
|
||||||
|
t.ImportXtest = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if ptest != p && localCover {
|
if ptest != p && localCover {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package badexec
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
panic("badexec")
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
package badsyntax
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
package badsyntax
|
||||||
|
|
||||||
|
func func func func func!
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
package badvar
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package badvar_test
|
||||||
|
|
||||||
|
func f() {
|
||||||
|
_ = notdefined
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue