/tests/tests.py

https://github.com/ask/puka
Python | 89 lines | 67 code | 20 blank | 2 comment | 19 complexity | a575b41c9e97b316163c5f001c86d1d6 MD5 | raw file
  1. #!/usr/bin/env python
  2. import sys
  3. import glob
  4. import time
  5. import os, os.path
  6. import doctest
  7. import unittest
  8. try:
  9. import coverage
  10. except ImportError:
  11. print "No 'coverage' module found. Try:"
  12. print " sudo apt-get install python-coverage"
  13. sys.exit(1)
  14. import logging
  15. FORMAT_CONS = '%(asctime)s %(name)-12s %(levelname)8s\t%(message)s'
  16. logging.basicConfig(level=logging.DEBUG, format=FORMAT_CONS)
  17. VERBOSE=False
  18. def my_import(name):
  19. mod = __import__(name)
  20. components = name.split('.')
  21. for comp in components[1:]:
  22. mod = getattr(mod, comp)
  23. return mod
  24. def main_coverage(TESTS):
  25. TEST_NAMES = [f.rpartition('.')[0] for f in glob.glob("test_*.py")]
  26. TEST_NAMES.sort()
  27. pwd=os.getcwd()
  28. os.chdir(sys.argv[1])
  29. BAD_MODULES=(sys.argv[3] if len(sys.argv) >= 4 else '').split(',')
  30. MODULE_NAMES=[sys.argv[2] + '.' +f[0:-3] for f in glob.glob("*.py") if f not in BAD_MODULES]
  31. MODULE_NAMES.sort()
  32. os.chdir(pwd)
  33. modulenames = MODULE_NAMES
  34. try:
  35. cov = coverage.coverage(branch=True)
  36. except TypeError:
  37. cov = coverage
  38. cov.erase()
  39. cov.exclude('#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]')
  40. cov.start()
  41. modules = []
  42. for modulename in modulenames:
  43. mod = my_import(modulename)
  44. modules.append(mod)
  45. if 'unittest' in TESTS:
  46. print "***** Unittest *****"
  47. test_args = {'verbosity': 1}
  48. suite = unittest.TestLoader().loadTestsFromNames(TEST_NAMES)
  49. unittest.TextTestRunner(**test_args).run(suite)
  50. if 'doctest' in TESTS:
  51. t0 = time.time()
  52. print "\n***** Doctest *****"
  53. for mod in modules:
  54. doctest.testmod(mod, verbose=VERBOSE)
  55. td = time.time() - t0
  56. print " Tests took %.3f seconds" % (td, )
  57. print "\n***** Coverage Python *****"
  58. cov.stop()
  59. cov.report(modules, ignore_errors=1, show_missing=1)
  60. #cov.html_report(morfs=modules, directory='/tmp')
  61. cov.erase()
  62. if __name__ == '__main__':
  63. main_coverage(['unittest', 'doctest'])
  64. def run_unittests(g):
  65. test_args = {'verbosity': 1}
  66. for t in [t for t in g.keys()
  67. if (t.startswith('Test') and issubclass(g[t], unittest.TestCase)) ]:
  68. suite = unittest.TestLoader().loadTestsFromTestCase(g[t])
  69. unittest.TextTestRunner(**test_args).run(suite)