Merge pull request #73 from inkarkat/testlib-enhancements

Testlib enhancements

As the vast majority of tests uses the todo.sh output to verify its correctness, output differences should always be shown, not just in verbose mode. 

This change removes the output redirection and check for exit code from the command-under-test, so as another benefit, these "housekeeping commands" are now kept off the test log.

Also, by using a separate function for exit code assertion, this can now report both differences in output and exit code (and not suppress the former any more.)

(Note: To see any of this, you need to temporarily introduce some test failures.)

Finally, I've added color highlighting for the aggregate test report (as in test-lib), because it didn't stood out against the colored test results, so that I often missed the crucial summary.
This commit is contained in:
Gina Trapani
2012-02-14 20:55:28 -08:00
2 changed files with 119 additions and 13 deletions

View File

@@ -1,4 +1,57 @@
#!/bin/sh #!/bin/bash
[ "x$TERM" != "xdumb" ] && (
export TERM &&
[ -t 1 ] &&
tput bold >/dev/null 2>&1 &&
tput setaf 1 >/dev/null 2>&1 &&
tput sgr0 >/dev/null 2>&1
) &&
color=t
case "$1" in
--no-color)
color=; shift ;;
esac
if test -n "$color"; then
say_color () {
(
export TERM
case "$1" in
error) tput bold; tput setaf 1;; # bold red
skip) tput bold; tput setaf 2;; # bold green
pass) tput setaf 2;; # green
info) tput setaf 3;; # brown
*) test -n "$quiet" && return;;
esac
shift
printf "* %s" "$*"
tput sgr0
echo
)
}
else
say_color() {
test -z "$1" && test -n "$quiet" && return
shift
echo "* $*"
}
fi
get_color()
{
# Only use the supplied color if there are actually instances of that
# type, so that a clean test run does not distract the user by the
# appearance of the error highlighting.
if [ ${1:?} -eq 0 ]
then
echo 'info'
else
echo "${2:-info}"
fi
}
fixed=0 fixed=0
success=0 success=0
@@ -27,8 +80,8 @@ do
done <"$file" done <"$file"
done done
printf "%-8s%d\n" fixed $fixed say_color 'info' "$(printf "%-8s%d\n" fixed $fixed)"
printf "%-8s%d\n" success $success say_color "$(get_color "$success" 'pass')" "$(printf "%-8s%d\n" success $success)"
printf "%-8s%d\n" failed $failed say_color "$(get_color "$failed" 'error')" "$(printf "%-8s%d\n" failed $failed)"
printf "%-8s%d\n" broken $broken say_color "$(get_color "$broken" 'error')" "$(printf "%-8s%d\n" broken $broken)"
printf "%-8s%d\n" total $total say_color 'info' "$(printf "%-8s%d\n" total $total)"

View File

@@ -180,7 +180,7 @@ test_failure_ () {
test_failure=$(($test_failure + 1)) test_failure=$(($test_failure + 1))
say_color error "FAIL $test_count: $1" say_color error "FAIL $test_count: $1"
shift shift
echo "$@" | sed -e 's/^/ /' echo "$@"
test "$immediate" = "" || { trap - EXIT; exit 1; } test "$immediate" = "" || { trap - EXIT; exit 1; }
} }
@@ -199,8 +199,9 @@ test_debug () {
} }
test_run_ () { test_run_ () {
eval >&3 2>&4 "$1" eval > output 2>&1 "$1"
eval_ret="$?" eval_ret="$?"
cat >&3 output
return 0 return 0
} }
@@ -260,6 +261,57 @@ test_expect_success () {
echo >&3 "" echo >&3 ""
} }
test_expect_output () {
test "$#" = 2 ||
error "bug in the test script: not 2 parameters to test-expect-output"
if ! test_skip "$@"
then
say >&3 "expecting success and output: $2"
test_run_ "$2"
if [ "$?" = 0 -a "$eval_ret" = 0 ]
then
cmp_output=$(test_cmp expect output)
if [ "$?" = 0 ]
then
test_ok_ "$1"
else
test_failure_ "$@" "
$cmp_output"
fi
else
test_failure_ "$@"
fi
fi
echo >&3 ""
}
test_expect_code_and_output () {
test "$#" = 3 ||
error "bug in the test script: not 3 parameters to test-expect-code-and-output"
if ! test_skip "$@"
then
say >&3 "expecting exit code $1 and output: $3"
test_run_ "$3"
if [ "$?" = 0 -a "$eval_ret" = "$1" ]
then
cmp_output=$(test_cmp expect output)
if [ "$?" = 0 ]
then
test_ok_ "$2"
else
test_failure_ "$2" "$3" "
$cmp_output"
fi
else
cmp_output=$(test_cmp expect output)
test_failure_ "$2" "$3" "
* expected exit code $1, actual ${eval_ret}${cmp_output:+
}${cmp_output}"
fi
fi
echo >&3 ""
}
test_expect_code () { test_expect_code () {
test "$#" = 3 || test "$#" = 3 ||
error "bug in the test script: not 3 parameters to test-expect-code" error "bug in the test script: not 3 parameters to test-expect-code"
@@ -271,7 +323,8 @@ test_expect_code () {
then then
test_ok_ "$2" test_ok_ "$2"
else else
test_failure_ "$@" test_failure_ "$2" "$3" "
* expected exit code $1, actual ${eval_ret}"
fi fi
fi fi
echo >&3 "" echo >&3 ""
@@ -542,9 +595,9 @@ test_todo_session () {
"") "")
if [ ! -z "$cmd" ]; then if [ ! -z "$cmd" ]; then
if [ $status = 0 ]; then if [ $status = 0 ]; then
test_expect_success "$1 $subnum" "$cmd > output && test_cmp expect output" test_expect_output "$1 $subnum" "$cmd"
else else
test_expect_success "$1 $subnum" "$cmd > output ; test \$? = $status && test_cmp expect output" test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
fi fi
subnum=$(($subnum + 1)) subnum=$(($subnum + 1))
@@ -560,9 +613,9 @@ test_todo_session () {
done done
if [ ! -z "$cmd" ]; then if [ ! -z "$cmd" ]; then
if [ $status = 0 ]; then if [ $status = 0 ]; then
test_expect_success "$1 $subnum" "$cmd > output && test_cmp expect output" test_expect_output "$1 $subnum" "$cmd"
else else
test_expect_success "$1 $subnum" "$cmd > output ; test \$? = $status && test_cmp expect output" test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
fi fi
fi fi
} }