clm5/python/ctsm/run_ctsm_py_tests.py
2024-05-09 15:14:01 +08:00

87 lines
2.6 KiB
Python

"""Runner for the python unit tests defined here
This is the main implementation of the run_ctsm_py_tests script contained in the
parent directory
"""
import unittest
import os
import argparse
import logging
from ctsm import unit_testing
logger = logging.getLogger(__name__)
def main(description):
"""Main function called when run_tests is run from the command-line
Args:
description (str): description printed to usage message
"""
args = _commandline_args(description)
verbosity = _get_verbosity_level(args)
if args.pattern is not None:
pattern = args.pattern
elif args.unit:
pattern = "test_unit*.py"
elif args.sys:
pattern = "test_sys*.py"
else:
pattern = "test*.py"
# This setup_for_tests call is the main motivation for having this wrapper script to
# run the tests rather than just using 'python -m unittest discover'
unit_testing.setup_for_tests(enable_critical_logs=args.debug)
mydir = os.path.dirname(os.path.abspath(__file__))
testsuite = unittest.defaultTestLoader.discover(start_dir=mydir, pattern=pattern)
# NOTE(wjs, 2018-08-29) We may want to change the meaning of '--debug'
# vs. '--verbose': I could imagine having --verbose set buffer=False, and --debug
# additionally sets the logging level to much higher - e.g., debug level.
testrunner = unittest.TextTestRunner(buffer=(not args.debug), verbosity=verbosity)
testrunner.run(testsuite)
def _commandline_args(description):
"""Parse and return command-line arguments
Note that run_ctsm_py_tests is not intended to be
used without argument specifications
"""
parser = argparse.ArgumentParser(
description=description, formatter_class=argparse.RawTextHelpFormatter
)
output_level = parser.add_mutually_exclusive_group()
output_level.add_argument(
"-v", "--verbose", action="store_true", help="Run tests with more verbosity"
)
output_level.add_argument(
"-d", "--debug", action="store_true", help="Run tests with even more verbosity"
)
test_subset = parser.add_mutually_exclusive_group()
test_subset.add_argument("-u", "--unit", action="store_true", help="Only run unit tests")
test_subset.add_argument("-s", "--sys", action="store_true", help="Only run system tests")
test_subset.add_argument(
"-p", "--pattern", help="File name pattern to match\n" "Default is test*.py"
)
args = parser.parse_args()
return args
def _get_verbosity_level(args):
if args.debug or args.verbose:
verbosity = 2
else:
verbosity = 1
return verbosity