Skip to content

Instantly share code, notes, and snippets.

@dsoike
Created March 5, 2019 20:47
Show Gist options
  • Save dsoike/4453b06b041dd3df782dc6fbbf8dfbc1 to your computer and use it in GitHub Desktop.
Save dsoike/4453b06b041dd3df782dc6fbbf8dfbc1 to your computer and use it in GitHub Desktop.
Run Python Unit Tests
import os
import sys
import imp
import inspect
import re
import unittest
PWD = os.environ.get('PWD')
def run_unit_tests():
print('Running Unit Tests')
files = _get_unit_test_files()
print('\n'.join(map(lambda x: x.replace(PWD, ''), files)) + '\n')
_run_unit_tests_for_files(files)
def _get_unit_test_files():
all_files = _get_all_unit_test_files()
query = sys.argv[1] if len(sys.argv) > 1 else None
if query is None:
return all_files
else:
return filter(lambda x: re.search(query, x), all_files)
def _get_all_unit_test_files():
# logic here is project specific
unit_test_files = []
src_dir = '{}/workspace/src'.format(PWD)
for package_name in os.listdir(src_dir):
package_dir = '{}/{}'.format(src_dir, package_name)
package_tests_dir = '{}/src/{}_tests'.format(package_dir, package_name)
if os.path.isdir(package_tests_dir):
for test_file_name in os.listdir(package_tests_dir):
if re.search('.unit.py$', test_file_name):
unit_test_files.append('{}/{}'.format(package_tests_dir, test_file_name))
return unit_test_files
def _run_unit_tests_for_files(files):
test_suite = unittest.TestSuite()
for filepath in files:
module = imp.load_source('module', filepath)
classes = inspect.getmembers(module, inspect.isclass)
for name, value in classes:
if re.search('TestCase$', name):
for method in dir(value):
if method.startswith('test'):
test_suite.addTest(value(method))
test_runner = unittest.TextTestRunner(verbosity=2, resultclass=unittest.TextTestResult)
result = test_runner.run(test_suite)
if not result.wasSuccessful():
sys.exit(1)
if __name__ == '__main__':
run_unit_tests()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment