|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- """A test runner for pywin32"""
- import os
- import site
- import subprocess
- import sys
-
- # locate the dirs based on where this script is - it may be either in the
- # source tree, or in an installed Python 'Scripts' tree.
- this_dir = os.path.dirname(__file__)
- site_packages = [
- site.getusersitepackages(),
- ] + site.getsitepackages()
-
- failures = []
-
-
- # Run a test using subprocess and wait for the result.
- # If we get an returncode != 0, we know that there was an error, but we don't
- # abort immediately - we run as many tests as we can.
- def run_test(script, cmdline_extras):
- dirname, scriptname = os.path.split(script)
- # some tests prefer to be run from their directory.
- cmd = [sys.executable, "-u", scriptname] + cmdline_extras
- print("--- Running '%s' ---" % script)
- sys.stdout.flush()
- result = subprocess.run(cmd, check=False, cwd=dirname)
- print("*** Test script '%s' exited with %s" % (script, result.returncode))
- sys.stdout.flush()
- if result.returncode:
- failures.append(script)
-
-
- def find_and_run(possible_locations, extras):
- for maybe in possible_locations:
- if os.path.isfile(maybe):
- run_test(maybe, extras)
- break
- else:
- raise RuntimeError(
- "Failed to locate a test script in one of %s" % possible_locations
- )
-
-
- def main():
- import argparse
-
- code_directories = [this_dir] + site_packages
-
- parser = argparse.ArgumentParser(
- description="A script to trigger tests in all subprojects of PyWin32."
- )
- parser.add_argument(
- "-no-user-interaction",
- default=False,
- action="store_true",
- help="(This is now the default - use `-user-interaction` to include them)",
- )
-
- parser.add_argument(
- "-user-interaction",
- action="store_true",
- help="Include tests which require user interaction",
- )
-
- parser.add_argument(
- "-skip-adodbapi",
- default=False,
- action="store_true",
- help="Skip the adodbapi tests; useful for CI where there's no provider",
- )
-
- args, remains = parser.parse_known_args()
-
- # win32, win32ui / Pythonwin
-
- extras = []
- if args.user_interaction:
- extras += ["-user-interaction"]
- extras.extend(remains)
- scripts = [
- "win32/test/testall.py",
- "Pythonwin/pywin/test/all.py",
- ]
- for script in scripts:
- maybes = [os.path.join(directory, script) for directory in code_directories]
- find_and_run(maybes, extras)
-
- # win32com
- maybes = [
- os.path.join(directory, "win32com", "test", "testall.py")
- for directory in [
- os.path.join(this_dir, "com"),
- ]
- + site_packages
- ]
- extras = remains + ["1"] # only run "level 1" tests in CI
- find_and_run(maybes, extras)
-
- # adodbapi
- if not args.skip_adodbapi:
- maybes = [
- os.path.join(directory, "adodbapi", "test", "adodbapitest.py")
- for directory in code_directories
- ]
- find_and_run(maybes, remains)
- # This script has a hard-coded sql server name in it, (and markh typically
- # doesn't have a different server to test on) but there is now supposed to be a server out there on the Internet
- # just to run these tests, so try it...
- maybes = [
- os.path.join(directory, "adodbapi", "test", "test_adodbapi_dbapi20.py")
- for directory in code_directories
- ]
- find_and_run(maybes, remains)
-
- if failures:
- print("The following scripts failed")
- for failure in failures:
- print(">", failure)
- sys.exit(1)
- print("All tests passed \\o/")
-
-
- if __name__ == "__main__":
- main()
|