Source code for rez.cli.test

# SPDX-License-Identifier: Apache-2.0
# Copyright Contributors to the Rez Project


'''
Run tests listed in a package's definition file.
'''
from __future__ import print_function


[docs]def setup_parser(parser, completions=False): parser.add_argument( "-l", "--list", action="store_true", help="list package's tests and exit") parser.add_argument( "--dry-run", action="store_true", help="dry-run mode: show what tests would have been run, but do not " "run them") parser.add_argument( "-s", "--stop-on-fail", action="store_true", help="stop on first test failure") parser.add_argument( "--inplace", action="store_true", help="run tests in the current environment. Any test whose requirements " "are not met by the current environment is skipped") PKG_action = parser.add_argument( "--extra-packages", nargs='+', metavar="PKG", help="extra packages to add to test environment") parser.add_argument( "--paths", type=str, default=None, help="set package search path") parser.add_argument( "--nl", "--no-local", dest="no_local", action="store_true", help="don't load local packages") PKG_action = parser.add_argument( "PKG", help="package run tests on") parser.add_argument( "TEST", nargs='*', help="tests to run (run all if not provided)") if completions: from rez.cli._complete_util import PackageCompleter PKG_action.completer = PackageCompleter
[docs]def command(opts, parser, extra_arg_groups=None): from rez.package_test import PackageTestRunner from rez.config import config import os.path import sys # note that argparse doesn't support mutually exclusive arg groups if opts.inplace and (opts.extra_packages or opts.paths or opts.no_local): parser.error( "Cannot use --inplace in combination with " "--extra-packages/--paths/--no-local" ) if opts.paths is None: pkg_paths = (config.nonlocal_packages_path if opts.no_local else None) else: pkg_paths = opts.paths.split(os.pathsep) pkg_paths = [os.path.expanduser(x) for x in pkg_paths if x] # run test(s) runner = PackageTestRunner( package_request=opts.PKG, package_paths=pkg_paths, extra_package_requests=opts.extra_packages, dry_run=opts.dry_run, stop_on_fail=opts.stop_on_fail, use_current_env=opts.inplace, verbose=2 ) test_names = runner.get_test_names() uri = runner.get_package().uri if not test_names: print("No tests found in %s" % uri, file=sys.stderr) sys.exit(0) if opts.list: if sys.stdout.isatty(): print("Tests defined in %s:" % uri) print('\n'.join(test_names)) sys.exit(0) if opts.TEST: run_test_names = opts.TEST else: # if no tests are explicitly specified, then run only those with a # 'default' run_on tag run_test_names = runner.get_test_names(run_on=["default"]) if not run_test_names: print( "No tests with 'default' run_on tag found in %s" % uri, file=sys.stderr ) sys.exit(0) exitcode = 0 for test_name in run_test_names: if not runner.stopped_on_fail: ret = runner.run_test(test_name) if ret and not exitcode: exitcode = ret print("\n") runner.print_summary() print('') sys.exit(exitcode)