X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=tests%2Frun_tests.sh;h=94f0b6b7f6d4372ad316c7336085f1cec3a8cad7;hb=a778719a55da82f5a3d1ca5cecd9041530d4d6e9;hp=9623f1b2f1a12dcfebf2a207d36a2ea6faad27ca;hpb=4c315e387f18010ba0b5661744ad3c792f21d2d1;p=python_utils.git diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 9623f1b..94f0b6b 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -7,6 +7,10 @@ DOCTEST=0 UNITTEST=0 INTEGRATION=0 FAILURES=0 +TESTS_RUN=0 +COVERAGE=0 +PERF_TESTS=("string_utils_test.py") + dup() { if [ $# -ne 2 ]; then @@ -37,6 +41,18 @@ make_header() { echo } +function usage() { + echo "Usage: $0 [-a]|[-i][-u][-d] [--coverage]" + echo + echo "Runs tests under ${ROOT}. Options control which test types:" + echo + echo " -a | --all . . . . . . . . . . . . Run all types of tests" + echo " -d | --doctests . . . . . . . . . Run doctests" + echo " -u | --unittests . . . . . . . . . Run unittests" + echo " -i | --integration . . . . . . . . Run integration tests" + echo + exit 1 +} while [[ $# -gt 0 ]]; do key="$1" @@ -55,35 +71,49 @@ while [[ $# -gt 0 ]]; do -i|--integration) INTEGRATION=1 ;; + --coverage) + COVERAGE=1 + ;; *) # unknown option - echo "Usage: $0 [-a]|[-i][-u][-d]" - echo - echo "Runs tests under ${ROOT}. Options control which test types:" - echo - echo " -a | --all . . . . . . . . . . . . Run all types of tests" - echo " -d | --doctests . . . . . . . . . Run doctests" - echo " -u | --unittests . . . . . . . . . Run unittests" - echo " -i | --integration . . . . . . . . Run integration tests" - echo echo "Argument $key was not recognized." + echo + usage exit 1 ;; esac shift done +if [ $(expr ${DOCTEST} + ${UNITTEST} + ${INTEGRATION}) -eq 0 ]; then + usage + exit 2 +fi + +if [ ${COVERAGE} -eq 1 ]; then + coverage erase +fi + +FAILED_TESTS="" if [ ${DOCTEST} -eq 1 ]; then - for doctest in $(grep -lR doctest ${ROOT}/*.py); do - BASE=$(basename ${doctest}) - BASE="${BASE} (doctest)" - make_header "${BASE}" "${CYAN}" - OUT=$( python3 ${doctest} 2>&1 ) - FAILED=$( echo "${OUT}" | grep '\*\*\*Test Failed\*\*\*' | wc -l ) - if [ $FAILED == 0 ]; then - echo "OK" - else - echo -e "${FAILED}" - FAILURES=$((FAILURES+1)) + for doctest in $(grep -lR doctest ${ROOT}/*); do + if [[ ${doctest} == *.py ]]; then + BASE=$(basename ${doctest}) + BASE="${BASE} (doctest)" + make_header "${BASE}" "${CYAN}" + 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} (python3 ${doctest})" + fi fi done fi @@ -91,33 +121,70 @@ fi if [ ${UNITTEST} -eq 1 ]; then for test in $(find ${ROOT} -name "*_test.py" -print); do BASE=$(basename ${test}) - BASE="${BASE} (unittest)" - make_header "${BASE}" "${GREEN}" - ${test} + HDR="${BASE} (unittest)" + make_header "${HDR}" "${GREEN}" + if [ ${COVERAGE} -eq 1 ]; then + coverage run --source ${HOME}/lib --append ${test} --unittests_ignore_perf + if [[ " ${PERF_TESTS[*]} " =~ " ${BASE} " ]]; then + echo "(re-running w/o coverage to record perf results)." + ${test} + fi + else + ${test} + fi if [ $? -ne 0 ]; then FAILURES=$((FAILURES+1)) + FAILED_TESTS="${FAILED_TESTS},${BASE} (python3 ${test})" fi + TESTS_RUN=$((TESTS_RUN+1)) done fi if [ ${INTEGRATION} -eq 1 ]; then for test in $(find ${ROOT} -name "*_itest.py" -print); do BASE=$(basename ${test}) - BASE="${BASE} (integration test)" - make_header "${BASE}" "${ORANGE}" - ${test} + HDR="${BASE} (integration test)" + make_header "${HDR}" "${ORANGE}" + 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} (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,*_test.py,*_itest.py --sort=-cover + echo + echo "To recall this report w/o re-running the tests:" + echo + echo " $ coverage report --omit=config-3.8.py,*_test.py,*_itest.py --sort=-cover" + echo + echo "...from the 'tests' directory. Note that subsequent calls to " + echo "run_tests.sh with --coverage will klobber previous results. See:" + echo + echo " https://coverage.readthedocs.io/en/6.2/" + echo +fi + if [ ${FAILURES} -ne 0 ]; then + 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.${NC}" + echo -e "${RED}There was ${FAILURES}/${TESTS_RUN} failure:" else - echo -e "${RED}There were ${FAILURES} failures.${NC}" + echo -e "${RED}There were ${FAILURES}/${TESTS_RUN} failures:" fi + echo "${FAILED_TESTS}" + echo -e "${NC}" + exit ${FAILURES} else - echo -e "${GREEN}Everything looks good.${NC}" + echo -e "${BLACK}${ON_GREEN}All (${TESTS_RUN}) test(s) passed.${NC}" + exit 0 fi