Make runtests.py a little more versatile: support -x, and arbitrary flags
authorGuido van Rossum <guido@python.org>
Mon, 20 Aug 2007 20:17:57 +0000 (20:17 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 20 Aug 2007 20:17:57 +0000 (20:17 +0000)
to be passed to regrtest.py.  Also add -h for help, and summarize the
BAD/GOOD/SKIPPED files at the end.

runtests.sh

index adaa2fc6515883f415e98022a93ee83787301f4e..5d31276a219f6d1d6729b8c6912db1b925aa8d4d 100755 (executable)
@@ -1,11 +1,19 @@
 #!/bin/sh
 
-# A script that runs each unit test independently, with output
-# directed to a file in OUT/$T.out.  If command line arguments are
-# given, they are tests to run; otherwise every file named
-# Lib/test/test_* is run (via regrtest).  A summary of failing,
-# passing and skipped tests is written to stdout and to the files
-# GOOD, BAD and SKIPPED.
+HELP="Usage: ./runtests.py [-h] [-x] [flags] [tests]
+
+Runs each unit test independently, with output directed to a file in
+OUT/<test>.out.  If no tests are given, all tests are run; otherwise,
+only the specified tests are run, unless -x is also given, in which
+case all tests *except* those given are run.
+
+Standard output shows the name of the tests run, with 'BAD' or
+'SKIPPED' added if the test didn't produce a positive result.  Also,
+three files are created, named 'BAD', 'GOOD' and 'SKIPPED', to which
+are written the names of the tests categorized by result.
+
+Flags (arguments starting with '-') are passed transparently to
+regrtest.py, except for -x, which is processed here."
 
 # Reset PYTHONPATH to avoid alien influences on the tests.
 unset PYTHONPATH
@@ -25,20 +33,29 @@ mkdir -p OUT
 >BAD
 >SKIPPED
 
-# The -u flag.
-UFLAG=""
-case $1 in
--u)
-    UFLAG="$1 $2"; shift; shift;;
--u*)
-    UFLAG="$1"; shift;;
-esac
+# Process flags (transparently pass these on to regrtest.py)
+FLAGS=""
+EXCEPT=""
+while :
+do
+    case $1 in
+    -h|--h|-help|--help) echo "$HELP"; exit;;
+    --) FLAGS="$FLAGS $1"; shift; break;;
+    -x) EXCEPT="$1"; shift;;
+    -*) FLAGS="$FLAGS $1"; shift;;
+    *)  break;;
+    esac
+done
 
 # Compute the list of tests to run.
-case $# in
+case "$#$EXCEPT" in
 0) 
     TESTS=`(cd Lib/test; ls test_*.py | sed 's/\.py//')`
     ;;
+*-x)
+    PAT="^(`echo $@ | sed 's/\.py//' | sed 's/ /|/'`)$"
+    TESTS=`(cd Lib/test; ls test_*.py | sed 's/\.py//' | egrep -v "$PAT")`
+    ;;
 *)
     TESTS="$@"
     ;;
@@ -49,20 +66,23 @@ for T in $TESTS
 do
     echo -n $T
     if   case $T in
-         *curses*) echo; $PYTHON Lib/test/regrtest.py $UFLAG $T 2>OUT/$T.out;;
-         *) $PYTHON Lib/test/regrtest.py $UFLAG $T >OUT/$T.out 2>&1;;
+         *curses*) echo; $PYTHON Lib/test/regrtest.py $FLAGS $T 2>OUT/$T.out;;
+         *) $PYTHON Lib/test/regrtest.py $FLAGS $T >OUT/$T.out 2>&1;;
          esac
     then
-       if grep -q "1 test skipped:" OUT/$T.out
-       then
-           echo " SKIPPED"
+        if grep -q "1 test skipped:" OUT/$T.out
+        then
+            echo " SKIPPED"
             echo $T >>SKIPPED
-       else
-           echo
+        else
+            echo
             echo $T >>GOOD
-       fi
+        fi
     else
-       echo " BAD"
+        echo " BAD"
         echo $T >>BAD
     fi
 done
+
+# Summarize results
+wc -l BAD GOOD SKIPPED