runtests.sh 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #!/bin/bash
  2. # Parse command line
  3. VERBOSE=0
  4. HELP=0
  5. ERR=0
  6. NOINPUT=""
  7. while [[ $# > 0 ]]
  8. do
  9. key="$1"
  10. case $key in
  11. -h|--help)
  12. HELP=1
  13. ;;
  14. -v|--verbose)
  15. VERBOSE=1
  16. ;;
  17. --noinput)
  18. NOINPUT="--noinput"
  19. ;;
  20. *)
  21. echo "Unknown option '$key'"
  22. ERR=1
  23. HELP=1
  24. ;;
  25. esac
  26. shift
  27. done
  28. if [ $HELP -eq 1 ]
  29. then
  30. echo "$0 [-vh] - Run django-nose integration tests."
  31. echo " -v/--verbose - Print output of test commands."
  32. echo " -h/--help - Print this help message."
  33. exit $ERR
  34. fi
  35. export PYTHONPATH=.
  36. HAS_HOTSHOT=$(python -c "\
  37. try:
  38. import hotshot
  39. except ImportError:
  40. print('0')
  41. else:
  42. print('1')
  43. ")
  44. reset_env() {
  45. unset TEST_RUNNER
  46. unset NOSE_PLUGINS
  47. unset REUSE_DB
  48. }
  49. echo_output() {
  50. STDOUT=$1
  51. STDERR=$2
  52. if [ $VERBOSE -ne 1 ]
  53. then
  54. echo "stdout"
  55. echo "======"
  56. cat $STDOUT
  57. echo
  58. echo "stderr"
  59. echo "======"
  60. cat $STDERR
  61. fi
  62. rm $STDOUT $STDERR
  63. }
  64. django_test() {
  65. COMMAND=$1
  66. TEST_COUNT=$2
  67. DESCRIPTION=$3
  68. CAN_FAIL=${4:-0}
  69. if [ $VERBOSE -eq 1 ]
  70. then
  71. echo "================"
  72. echo "Django settings:"
  73. ./manage.py diffsettings
  74. echo "================"
  75. fi
  76. if [ -n "$COVERAGE" ]
  77. then
  78. TEST="coverage run -p $COMMAND"
  79. else
  80. TEST="$COMMAND"
  81. fi
  82. # Temp files on Linux / OSX
  83. TMP_OUT=`mktemp 2>/dev/null || mktemp -t 'django-nose-runtests'`
  84. TMP_ERR=`mktemp 2>/dev/null || mktemp -t 'django-nose-runtests'`
  85. RETURN=0
  86. if [ $VERBOSE -eq 1 ]
  87. then
  88. echo $TEST
  89. $TEST > >(tee $TMP_OUT) 2> >(tee $TMP_ERR >&2)
  90. else
  91. $TEST >$TMP_OUT 2>$TMP_ERR
  92. fi
  93. if [ $? -gt 0 ]
  94. then
  95. echo "FAIL (test failure): $DESCRIPTION"
  96. echo_output $TMP_OUT $TMP_ERR
  97. if [ "$CAN_FAIL" == "0" ]
  98. then
  99. exit 1
  100. else
  101. return
  102. fi
  103. fi
  104. OUTPUT=`cat $TMP_OUT $TMP_ERR`
  105. echo $OUTPUT | grep "Ran $TEST_COUNT test" > /dev/null
  106. if [ $? -gt 0 ]
  107. then
  108. echo "FAIL (count!=$TEST_COUNT): $DESCRIPTION"
  109. echo_output $TMP_OUT $TMP_ERR
  110. if [ "$CAN_FAIL" == "0" ]
  111. then
  112. exit 1
  113. else
  114. return
  115. fi
  116. else
  117. echo "PASS (count==$TEST_COUNT): $DESCRIPTION"
  118. fi
  119. rm $TMP_OUT $TMP_ERR
  120. # Check that we're hijacking the help correctly.
  121. $TEST --help 2>&1 | grep 'NOSE_DETAILED_ERRORS' > /dev/null
  122. if [ $? -gt 0 ]
  123. then
  124. echo "FAIL (--help): $DESCRIPTION"
  125. if [ "$CAN_FAIL" == 0 ]
  126. then
  127. exit 1;
  128. else
  129. return
  130. fi
  131. else
  132. echo "PASS ( --help): $DESCRIPTION"
  133. fi
  134. }
  135. TESTAPP_COUNT=6
  136. reset_env
  137. django_test "./manage.py test $NOINPUT" $TESTAPP_COUNT 'normal settings'
  138. reset_env
  139. export TEST_RUNNER="django_nose.NoseTestSuiteRunner"
  140. django_test "./manage.py test $NOINPUT" $TESTAPP_COUNT 'test runner from environment'
  141. reset_env
  142. django_test "testapp/runtests.py testapp.test_only_this" 1 'via run_tests API'
  143. reset_env
  144. export NOSE_PLUGINS="testapp.plugins.SanityCheckPlugin"
  145. django_test "./manage.py test testapp/plugin_t $NOINPUT" 1 'with plugins'
  146. reset_env
  147. django_test "./manage.py test unittests $NOINPUT" 4 'unittests'
  148. reset_env
  149. django_test "./manage.py test unittests --verbosity 1 $NOINPUT" 4 'argument option without equals'
  150. reset_env
  151. django_test "./manage.py test unittests --nose-verbosity=2 $NOINPUT" 4 'argument with equals'
  152. reset_env
  153. django_test "./manage.py test unittests --testrunner=testapp.custom_runner.CustomNoseTestSuiteRunner $NOINPUT" 4 'unittests with testrunner'
  154. reset_env
  155. django_test "./manage.py test unittests --attr special $NOINPUT" 1 'select by attribute'
  156. reset_env
  157. export REUSE_DB=1
  158. # For the many issues with REUSE_DB=1, see:
  159. # https://github.com/django-nose/django-nose/milestones/Fix%20REUSE_DB=1
  160. django_test "./manage.py test $NOINPUT" $TESTAPP_COUNT 'with REUSE_DB=1, call #1' 'can fail'
  161. django_test "./manage.py test $NOINPUT" $TESTAPP_COUNT 'with REUSE_DB=1, call #2' 'can fail'
  162. if [ "$HAS_HOTSHOT" = "1" ]
  163. then
  164. # Python 3 doesn't support the hotshot profiler. See nose#842.
  165. reset_env
  166. django_test "./manage.py test $NOINPUT --with-profile --profile-restrict less_output" $TESTAPP_COUNT 'with profile plugin'
  167. fi