Improve run_tests.sh
[python_utils.git] / tests / run_tests.sh
index 57fea2862e04f314e7bc2e93469f058ec3793619..7ab316c88151bd309c0160b60b394f60ef7b823a 100755 (executable)
@@ -7,6 +7,7 @@ DOCTEST=0
 UNITTEST=0
 INTEGRATION=0
 FAILURES=0
+TESTS_RUN=0
 
 dup() {
     if [ $# -ne 2 ]; then
@@ -27,7 +28,7 @@ make_header() {
     local title="$1"
     local title_len=${#title}
     title_len=$((title_len + 4))
-    local width=70
+    local width=76
     local left=4
     local right=$(($width-($title_len+$left)))
     local color="$2"
@@ -38,7 +39,7 @@ make_header() {
 }
 
 function usage() {
-    echo "Usage: $0 [-a]|[-i][-u][-d]"
+    echo "Usage: $0 [-a]|[-i][-u][-d] [--coverage]"
     echo
     echo "Runs tests under ${ROOT}.  Options control which test types:"
     echo
@@ -67,6 +68,9 @@ while [[ $# -gt 0 ]]; do
         -i|--integration)
             INTEGRATION=1
             ;;
+        --coverage)
+            COVERAGE=1
+            ;;
         *)    # unknown option
             echo "Argument $key was not recognized."
             echo
@@ -82,6 +86,9 @@ if [ $(expr ${DOCTEST} + ${UNITTEST} + ${INTEGRATION}) -eq 0 ]; then
     exit 2
 fi
 
+if [ ${COVERAGE} -eq 1 ]; then
+    coverage erase
+fi
 
 FAILED_TESTS=""
 if [ ${DOCTEST} -eq 1 ]; then
@@ -90,14 +97,19 @@ if [ ${DOCTEST} -eq 1 ]; then
             BASE=$(basename ${doctest})
             BASE="${BASE} (doctest)"
             make_header "${BASE}" "${CYAN}"
-            OUT=$( python3 ${doctest} 2>&1 )
+            if [ ${COVERAGE} -eq 1 ]; then
+                OUT=$( coverage run --source ${HOME}/lib --append ${doctest} 2>&1 )
+            else
+                OUT=$( python3 ${doctest} 2>&1 )
+            fi
+            TESTS_RUN=$((TESTS_RUN+1))
             FAILED=$( echo "${OUT}" | grep '\*\*\*Test Failed\*\*\*' | wc -l )
             if [ $FAILED == 0 ]; then
                 echo "OK"
             else
                 echo -e "${FAILED}"
                 FAILURES=$((FAILURES+1))
-                FAILED_TESTS="${FAILED_TESTS}, ${BASE}"
+                FAILED_TESTS="${FAILED_TESTS},${BASE} (python3 ${doctest})"
             fi
         fi
     done
@@ -108,11 +120,16 @@ if [ ${UNITTEST} -eq 1 ]; then
         BASE=$(basename ${test})
         BASE="${BASE} (unittest)"
         make_header "${BASE}" "${GREEN}"
-        ${test}
+        if [ ${COVERAGE} -eq 1 ]; then
+            coverage run --source ${HOME}/lib --append ${test} --unittests_ignore_perf
+        else
+            ${test}
+        fi
         if [ $? -ne 0 ]; then
             FAILURES=$((FAILURES+1))
-            FAILED_TESTS="${FAILED_TESTS}, ${BASE}"
+            FAILED_TESTS="${FAILED_TESTS},${BASE} (python3 ${test})"
         fi
+        TESTS_RUN=$((TESTS_RUN+1))
     done
 fi
 
@@ -121,23 +138,41 @@ if [ ${INTEGRATION} -eq 1 ]; then
         BASE=$(basename ${test})
         BASE="${BASE} (integration test)"
         make_header "${BASE}" "${ORANGE}"
-        ${test}
+        if [ ${COVERAGE} -eq 1 ]; then
+            coverage run --source ${HOME}/lib --append ${test}
+        else
+            ${test}
+        fi
         if [ $? -ne 0 ]; then
             FAILURES=$((FAILURES+1))
-            FAILED_TESTS="${FAILED_TESTS}, ${BASE}"
+            FAILED_TESTS="${FAILED_TESTS},${BASE} (python3 ${test})"
         fi
+        TESTS_RUN=$((TESTS_RUN+1))
     done
 fi
 
+if [ ${COVERAGE} -eq 1 ]; then
+    make_header "Code Coverage Report" "${GREEN}"
+    coverage report --omit=config-3.8.py --sort=-cover
+    echo
+    echo "Note: to recall this report without run-running the tests, invoke:"
+    echo
+    echo "    $ coverage report --omit=config-3.8.py --sort=-cover"
+    echo
+fi
+
 if [ ${FAILURES} -ne 0 ]; then
-    FAILED_TESTS=$(echo ${FAILED_TESTS} | sed 's/^, //g')
+    FAILED_TESTS=$(echo ${FAILED_TESTS} | sed 's/^,/__/g')
+    FAILED_TESTS=$(echo ${FAILED_TESTS} | sed 's/,/\n__/g')
     if [ ${FAILURES} -eq 1 ]; then
-        echo -e "${RED}There was ${FAILURES} failure:"
+        echo -e "${RED}There was ${FAILURES}/${TESTS_RUN} failure:"
     else
-        echo -e "${RED}There were ${FAILURES} failures:"
+        echo -e "${RED}There were ${FAILURES}/${TESTS_RUN} failures:"
     fi
     echo "${FAILED_TESTS}"
     echo -e "${NC}"
+    exit ${FAILURES}
 else
-    echo -e "${BLACK}${ON_GREEN}Everything looks good.${NC}"
+    echo -e "${BLACK}${ON_GREEN}All (${TESTS_RUN}) test(s) passed.${NC}"
+    exit 0
 fi