tests: print failed test numbers at the end of the test run
RFC PATCH 1/1 tests: print failed test numbers at the end of the test run
On modern multi-core processors "make test" is often run in multiple jobs. If one of them fails the test run does stop, but the concurrently running tests finish their run. Finding out what test is broken involves a lot of scrolling. That gets even worse when the -i option is used.
If one or more tests failed, print a list of them before the test summary:
failed test(s): t1000 t6500
fixed 0
success 7638
failed 3 broken 49 total 7723
This makes it possible to just run the test suite with -i and collect all failed test scripts at the end for further examination.
---
Maybe I'm missing something completely obvious, but I always have a hard time finding out which test scripts did fail in a test run with -j30.
t/aggregate-results.sh | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
t/aggregate-results.sh +11 -1
@@ -1,5 +1,6 @@ #!/bin/sh +failed_tests= fixed=0 success=0 failed=0
@@ -18,7 +19,12 @@ do success) success=$(($success + $value)) ;; failed) - failed=$(($failed + $value)) ;; + failed=$(($failed + $value)) + if test $value != 0; then + testnum=$(echo $file | cut -b 14-18) + failed_tests="$failed_tests $testnum" + fi + ;; broken) broken=$(($broken + $value)) ;; total)
@@ -27,6 +33,10 @@ do done <"$file" done +if [ -n "$failed_tests" ]; then + printf "\nfailed test(s):$failed_tests\n\n" +fi + printf "%-8s%d\n" fixed $fixed printf "%-8s%d\n" success $success printf "%-8s%d\n" failed $failed
Signature · 1 line
1.7.6.346.g750efc
Quoted 2 lines · Jens Lehmann
Maybe I'm missing something completely obvious, but I always have a hard time finding out which test scripts did fail in a test run with -j30.
I run "ls -d t/trash*" for that ;-)
t/aggregate-results.sh do · line 26
Quoted 4 lines
t/aggregate-results.sh +4
-0+ if test $value != 0; then + testnum=$(echo $file | cut -b 14-18) + failed_tests="$failed_tests $testnum" + fi
Somehow "cut" here feels dirty, as it hardcodes a mysterious offset that cannot be guessed without knowing what string it is cutting from by looking at t/Makefile.
testnum=$(expr "$file" : 'test-results/\(t[0-9]*\)-')
PATCH v2 1/1 tests: print failed test numbers at the end of the test run
On modern multi-core processors "make test" is often run in multiple jobs. If one of them fails the test run does stop, but the concurrently running tests finish their run. It is rather easy to find out which test failed by doing a "ls -d t/trash*". But that only works when you don't use the "-i" option to "make test" because you want to get an overview of all failing tests. In that case all thrash directories are deleted end and the information which tests failed is lost.
If one or more tests failed, print a list of them before the test summary:
failed test(s): t1000 t6500
fixed 0
success 7638
failed 3 broken 49 total 7723
This makes it possible to just run the test suite with -i and collect all failed test scripts at the end for further examination.
---
Am 24.07.2011 09:41, schrieb Junio C Hamano:
Quoted 6 lines
Quoted 2 lines · Jens Lehmann
Maybe I'm missing something completely obvious, but I always have a hard time finding out which test scripts did fail in a test run with -j30.
I run "ls -d t/trash*" for that ;-)
Yup. But that won't work when you use "-i" to continue to run all tests even when some fail, as all trash directories get deleted in the end. Or did I manage to overlook an option which stops that? ;-)
I rephrased the commit message to make it clear my patch only changes the behavior when "-i" is used and one or more tests fail, as the code in question isn't executed otherwise.
Quoted 10 lines
Review
Quoted 4 lines
(quoted diff) +4
-0+ if test $value != 0; then + testnum=$(echo $file | cut -b 14-18) + failed_tests="$failed_tests $testnum" + fiSomehow "cut" here feels dirty, as it hardcodes a mysterious offset that cannot be guessed without knowing what string it is cutting from by looking at t/Makefile.
testnum=$(expr "$file" : 'test-results/\(t[0-9]*\)-')
Thanks, this version is using that expression.
t/aggregate-results.sh | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
t/aggregate-results.sh +11 -1
@@ -1,5 +1,6 @@ #!/bin/sh +failed_tests= fixed=0 success=0 failed=0
@@ -18,7 +19,12 @@ do success) success=$(($success + $value)) ;; failed) - failed=$(($failed + $value)) ;; + failed=$(($failed + $value)) + if test $value != 0; then + testnum=$(expr "$file" : 'test-results/\(t[0-9]*\)-') + failed_tests="$failed_tests $testnum" + fi + ;; broken) broken=$(($broken + $value)) ;; total)
@@ -27,6 +33,10 @@ do done <"$file" done +if [ -n "$failed_tests" ]; then + printf "\nfailed test(s):$failed_tests\n\n" +fi + printf "%-8s%d\n" fixed $fixed printf "%-8s%d\n" success $success printf "%-8s%d\n" failed $failed
Signature · 1 line
1.7.6.346.g940def.dirty
Quoted 11 lines · Jens Lehmann
Am 24.07.2011 09:41, schrieb Junio C Hamano:
Quoted 6 lines
Quoted 2 lines · Jens Lehmann
Maybe I'm missing something completely obvious, but I always have a hard time finding out which test scripts did fail in a test run with -j30.
I run "ls -d t/trash*" for that ;-)
Yup. But that won't work when you use "-i" to continue to run all tests even when some fail, as all trash directories get deleted in the end. Or did I manage to overlook an option which stops that? ;-)
I used to use:
make -k -j30
grep 'failed [^0]' test-results/*
but these days I use the "prove" tool, which has much nicer output. You can get Makefile support for it with:
GIT_PROVE_OPTS = -j30
DEFAULT_TEST_TARGET = prove
in your config.mak.
-Peff
Am 24.07.2011 17:39, schrieb Jeff King:
Quoted 10 lines · Jens Lehmann
Quoted 9 lines
Am 24.07.2011 09:41, schrieb Junio C Hamano:
Quoted 6 lines
Quoted 2 lines · Jens Lehmann
Maybe I'm missing something completely obvious, but I always have a hard time finding out which test scripts did fail in a test run with -j30.
I run "ls -d t/trash*" for that ;-)
Quoted 8 lines
Quoted 3 lines
Yup. But that won't work when you use "-i" to continue to run all tests even when some fail, as all trash directories get deleted in the end. Or did I manage to overlook an option which stops that? ;-)
I used to use:
make -k -j30
grep 'failed [^0]' test-results/*
Ah, now I understand how I managed to shoot myself in the foot when I tried
that: I used "-i" instead of "-k" for make, so the test-results directory always was deleted after the tests ran.
Quoted 7 lines
but these days I use the "prove" tool, which has much nicer output. You can get
Makefilesupport for it with:
GIT_PROVE_OPTS= -j30
DEFAULT_TEST_TARGET= provein your config.mak.
Thanks, the output really is nicer and it even runs a bit faster! :-)
Heya,
Quoted 3 lines · Jens Lehmann
Ah, now I understand how I managed to shoot myself in the foot when I tried
that: I used "-i" instead of "-k" for make, so the test-results directory always was deleted after the tests ran.
Regardless, I like your patch. I don't use prove, and I'm always afraid that when I run the test suite I'll find a test that failed with no way to find out which :).
Signature · 3 lines
Cheers, Sverre Rabbelier
Quoted 3 lines · Jens Lehmann
On modern multi-core processors "make test" is often run in multiple jobs. If one of them fails the test run does stop, but the concurrently running tests finish their run.
Somewhat related (or not). I change something. I know it breaks things and want to know _all_ tests it breaks, but "make test" would stop early. Is there anyway to make it keep going through all tests even if some fails? "make -j<big number>" improves the situation but does not really solve it.
Signature · 1 line
Duy
Quoted 10 lines · Nguyen Thai Ngoc Duy
Quoted 3 lines · Jens Lehmann
On modern multi-core processors "make test" is often run in multiple jobs. If one of them fails the test run does stop, but the concurrently running tests finish their run.
Somewhat related (or not). I change something. I know it breaks things and want to know _all_ tests it breaks, but "make test" would stop early. Is there anyway to make it keep going through all tests even if some fails? "make -j<big number>" improves the situation but does not really solve it.
Try "make -k", which will keep running rules that don't have failed dependencies (in this case, all of the tests are independent, so it will run all of them).
Or use "prove", which can do fancy things like putting the last-failed (so you can see the likely failures immediately and start to probe them while the rest of the suite runs).
-Peff
Quoted 3 lines · Jeff King
Or use "prove", which can do fancy things like putting the last-failed (so you can see the likely failures immediately and start to probe them while the rest of the suite runs).
Oops, that should read "...putting the last-failed tests at the beginning".
-Peff