URL: https://github.com/freeipa/freeipa/pull/1433 Author: tiran Title: #1433: ipa-run-tests: replace chdir with plugin Action: opened
PR body: """ The ipa-run-tests command used os.chdir() to change into the ipatests/ directory. The approach works for simple cases but breaks some pytest features. For example it makes it impossible to selects tests by their fully qualified test name. Further more, coverage statistics break because path and module names get messed up by chdir. A name plugin takes care of adjusting paths relative to ipatests and to add ipatests as base. It's now possible to run tests with qualified test names, e.g. ipa-run-tests ipatests/test_ipalib/test_base.py::test_ReadOnly::test_lock Signed-off-by: Christian Heimes <chei...@redhat.com> """ To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/1433/head:pr1433 git checkout pr1433
From f250432937d286e7ea21ead3967605ffc23dfcd2 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Thu, 4 Jan 2018 16:01:59 +0100 Subject: [PATCH] ipa-run-tests: replace chdir with plugin The ipa-run-tests command used os.chdir() to change into the ipatests/ directory. The approach works for simple cases but breaks some pytest features. For example it makes it impossible to selects tests by their fully qualified test name. Further more, coverage statistics break because path and module names get messed up by chdir. A name plugin takes care of adjusting paths relative to ipatests and to add ipatests as base. It's now possible to run tests with qualified test names, e.g. ipa-run-tests ipatests/test_ipalib/test_base.py::test_ReadOnly::test_lock Signed-off-by: Christian Heimes <chei...@redhat.com> --- ipatests/ipa-run-tests | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/ipatests/ipa-run-tests b/ipatests/ipa-run-tests index 6b2070bdb7..018f86b719 100755 --- a/ipatests/ipa-run-tests +++ b/ipatests/ipa-run-tests @@ -40,10 +40,41 @@ os.environ['IPATEST_XUNIT_PATH'] = os.path.join(os.getcwd(), 'nosetests.xml') HERE = os.path.dirname(os.path.abspath(ipatests.__file__)) -args = sys.argv[1:] -if not any('--confcutdir' in arg for arg in args): - args.insert(0, '--confcutdir={}'.format(HERE)) -os.chdir(HERE) +class ArgsManglePlugin(object): + """Modify pytest arguments -sys.exit(pytest.main(args)) + * Add confcutdir if hasn't been set already + * Mangle paths to support tests both relative to basedir and ipatests/ + * Default to ipatests/ if no tests are specified + """ + def pytest_load_initial_conftests(self, early_config, parser, args): + # During initial loading, parser supports only basic options + ns = early_config.known_args_namespace + if not ns.confcutdir: + # add config cut directory to only load fixtures from ipatests/ + args.insert(0, '--confcutdir={}'.format(HERE)) + + if not ns.file_or_dir: + # No file or directory found, run all tests + args.append(HERE) + else: + for name in ns.file_or_dir: + idx = args.index(name) + # split on pytest separator + # ipatests/test_ipaplatform/test_importhook.py::test_override + filename, sep, suffix = name.partition('::') + # a file or directory relative to cwd or already absolute + if os.path.exists(filename): + continue + # a file or directory relative to ipatests package + args[idx] = sep.join((os.path.join(HERE, filename), suffix)) + + # rebuild early_config's known args with new args. The known args + # are used for initial conftest.py from ipatests, which adds + # additional arguments. + early_config.known_args_namespace = parser.parse_known_args( + args, namespace=early_config.option.copy()) + + +sys.exit(pytest.main(plugins=[ArgsManglePlugin()]))
_______________________________________________ FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org