test_expect_success HAVEIT,DONTHAVEIT 'unmet prerequisites causes test to be skipped' '
     donthaveit=no
 '
-if test $haveit$donthaveit != yesyes
+donthaveiteither=yes
+test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' '
+    donthaveiteither=no
+'
+if test $haveit$donthaveit$donthaveiteither != yesyesyes
 then
        say "bug in test framework: multiple prerequisite tags do not work reliably"
        exit 1
 
        IFS=,
        set -- $*
        IFS=$save_IFS
+
+       total_prereq=0
+       ok_prereq=0
+       missing_prereq=
+
        for prerequisite
        do
+               total_prereq=$(($total_prereq + 1))
                case $satisfied in
                *" $prerequisite "*)
-                       : yes, have it ;;
+                       ok_prereq=$(($ok_prereq + 1))
+                       ;;
                *)
-                       ! : nope ;;
+                       # Keep a list of missing prerequisites
+                       if test -z "$missing_prereq"
+                       then
+                               missing_prereq=$prerequisite
+                       else
+                               missing_prereq="$prerequisite,$missing_prereq"
+                       fi
                esac
        done
+
+       test $total_prereq = $ok_prereq
 }
 
 # You are not expected to call test_ok_ and test_failure_ directly, use
        case "$to_skip" in
        t)
                say_color skip >&3 "skipping test: $@"
-               say_color skip "ok $test_count # skip $1 (prereqs: $prereq)"
+               say_color skip "ok $test_count # skip $1 (missing $missing_prereq of $prereq)"
                : true
                ;;
        *)