URL: https://github.com/freeipa/freeipa/pull/366 Author: tiran Title: #366: Use pytest conftest.py Action: synchronized
To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/366/head:pr366 git checkout pr366
From 45011a60f63d5471ccf85cf7549362dd7ad3cb23 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Tue, 3 Jan 2017 18:04:53 +0100 Subject: [PATCH 1/2] Use pytest conftest.py Let's replace some ugly hacks with proper pytest conftest.py hooks. Test initialization of ipalib.api is now handled in pytest_cmdline_main(). Pytest plugins, markers and ignores are also moved into conftest.py. Additional guards make it possible to run tests without ipaserver installed. --- ipalib/__init__.py | 7 ------ ipatests/conftest.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ ipatests/ipa-run-tests | 3 --- ipatests/pytest.ini | 10 --------- make-test | 2 +- 5 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 ipatests/conftest.py diff --git a/ipalib/__init__.py b/ipalib/__init__.py index 4a61ace..5a11f86 100644 --- a/ipalib/__init__.py +++ b/ipalib/__init__.py @@ -949,10 +949,3 @@ def create_api(mode='dummy'): return api api = create_api(mode=None) - -if os.environ.get('IPA_UNIT_TEST_MODE', None) == 'cli_test': - from ipalib.cli import cli_plugins - api.bootstrap(context='cli', in_server=False, in_tree=True, fallback=False) - for klass in cli_plugins: - api.add_plugin(klass) - api.finalize() diff --git a/ipatests/conftest.py b/ipatests/conftest.py new file mode 100644 index 0000000..99aaab4 --- /dev/null +++ b/ipatests/conftest.py @@ -0,0 +1,59 @@ +# +# Copyright (C) 2016 FreeIPA Contributors see COPYING for license +# +from __future__ import print_function + +from ipalib import api +from ipalib.cli import cli_plugins +try: + import ipaserver +except ImportError: + ipaserver = None + + +pytest_plugins = [ + 'ipatests.pytest_plugins.additional_config', + 'ipatests.pytest_plugins.beakerlib', + 'ipatests.pytest_plugins.declarative', + 'ipatests.pytest_plugins.nose_compat', +] +# The integration plugin is not available in client-only builds. +if ipaserver is not None: + pytest_plugins.append('ipatests.pytest_plugins.integration') + + +MARKERS = [ + 'tier0: basic unit tests and critical functionality', + 'tier1: functional API tests', + 'cs_acceptance: Acceptance test suite for Dogtag Certificate Server', + 'ds_acceptance: Acceptance test suite for 389 Directory Server', +] + + +NO_RECURSE_DIRS = [ + # build directories + 'ipaclient/build', + 'ipalib/build', + 'ipaplatform/build', + 'ipapython/build', + 'ipaserver/build', + 'ipatests/build', + # install/share/wsgi.py + 'install/share' +] + + +def pytest_configure(config): + for marker in MARKERS: + config.addinivalue_line('markers', marker) + for norecursedir in NO_RECURSE_DIRS: + config.addinivalue_line('norecursedirs', norecursedir) + + +def pytest_cmdline_main(config): + api.bootstrap( + context=u'cli', in_server=False, in_tree=True, fallback=False + ) + for klass in cli_plugins: + api.add_plugin(klass) + api.finalize() diff --git a/ipatests/ipa-run-tests b/ipatests/ipa-run-tests index 53fa7b3..8df477d 100755 --- a/ipatests/ipa-run-tests +++ b/ipatests/ipa-run-tests @@ -34,9 +34,6 @@ import pytest import ipatests -# This must be set so ipalib.api gets initialized property for tests: -os.environ['IPA_UNIT_TEST_MODE'] = 'cli_test' - # This is set to store --with-xunit report in an accessible place: os.environ['IPATEST_XUNIT_PATH'] = os.path.join(os.getcwd(), 'nosetests.xml') diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini index c14eb5d..deb8688 100644 --- a/ipatests/pytest.ini +++ b/ipatests/pytest.ini @@ -8,16 +8,6 @@ python_classes = test_ Test addopts = --doctest-modules --junit-prefix ipa - -p ipatests.pytest_plugins.nose_compat - -p ipatests.pytest_plugins.declarative - -p ipatests.pytest_plugins.integration - -p ipatests.pytest_plugins.beakerlib - -p ipatests.pytest_plugins.additional_config # Ignore files for doc tests. # TODO: ideally, these should all use __name__=='__main__' guards --ignore=install/share/wsgi.py -markers = - tier0: basic unit tests and critical functionality - tier1: functional API tests - cs_acceptance: Acceptance test suite for Dogtag Certificate Server - ds_acceptance: Acceptance test suite for 389 Directory Server diff --git a/make-test b/make-test index 76e3dde..93323a1 100755 --- a/make-test +++ b/make-test @@ -1,4 +1,4 @@ #! /bin/bash set -ex -IPA_UNIT_TEST_MODE=cli_test PYTHONPATH=.:$PYTHONPATH py.test "$@" +PYTHONPATH=.:$PYTHONPATH py.test "$@" From 96c29bddc9111b9c435d435f792e02648efdd6cd Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Wed, 4 Jan 2017 16:04:36 +0100 Subject: [PATCH 2/2] Drop pytest.ini completely I added confcutdir to ensure that pytest does not leave our project space. Pytest used pytest.ini or setup.py before but pytest.ini is gone. Signed-off-by: Christian Heimes <chei...@redhat.com> --- Makefile.am | 3 +-- ipatests/conftest.py | 17 +++++++++++++++++ ipatests/ipa-run-tests | 10 ++++++++-- ipatests/pytest.ini | 13 ------------- ipatests/setup.py | 1 - make-test | 8 +++++--- pytest.ini | 1 - 7 files changed, 31 insertions(+), 22 deletions(-) delete mode 100644 ipatests/pytest.ini delete mode 120000 pytest.ini diff --git a/Makefile.am b/Makefile.am index 73bd378..9bfc899 100644 --- a/Makefile.am +++ b/Makefile.am @@ -37,8 +37,7 @@ EXTRA_DIST = .mailmap \ doc \ freeipa.spec.in \ ipasetup.py.in \ - pylintrc \ - pytest.ini + pylintrc clean-local: rm -rf "$(RPMBUILD)" diff --git a/ipatests/conftest.py b/ipatests/conftest.py index 99aaab4..45920de 100644 --- a/ipatests/conftest.py +++ b/ipatests/conftest.py @@ -44,11 +44,28 @@ def pytest_configure(config): + # add pytest markers for marker in MARKERS: config.addinivalue_line('markers', marker) + + # do not recurse into build directories or install/share directory. for norecursedir in NO_RECURSE_DIRS: config.addinivalue_line('norecursedirs', norecursedir) + # load test classes with these prefixes. + # addinivalue_line() adds duplicated entries. + python_classes = config.getini('python_classes') + for value in ['test_', 'Test']: + if value not in python_classes: + python_classes.append(value) + + # set default JUnit prefix + if config.option.junitprefix is None: + config.option.junitprefix = 'ipa' + + # always run doc tests + config.option.doctestmodules = True + def pytest_cmdline_main(config): api.bootstrap( diff --git a/ipatests/ipa-run-tests b/ipatests/ipa-run-tests index 8df477d..cafd993 100755 --- a/ipatests/ipa-run-tests +++ b/ipatests/ipa-run-tests @@ -37,6 +37,12 @@ import ipatests # This is set to store --with-xunit report in an accessible place: os.environ['IPATEST_XUNIT_PATH'] = os.path.join(os.getcwd(), 'nosetests.xml') -os.chdir(os.path.dirname(ipatests.__file__)) +HERE = os.path.dirname(os.path.abspath(ipatests.__file__)) -sys.exit(pytest.main(sys.argv[1:])) +args = sys.argv[1:] +if not any('--confcutdir' in arg for arg in args): + args.insert(0, '--confcutdir={}'.format(HERE)) + +os.chdir(HERE) + +sys.exit(pytest.main(args)) diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini deleted file mode 100644 index deb8688..0000000 --- a/ipatests/pytest.ini +++ /dev/null @@ -1,13 +0,0 @@ -# pytest configuration - -# This file lives in ipatests/pytest.ini, so it can be included by setup.py, -# and it's symlinked from the project's root directory, so py.test finds it -# when called with no arguments. - -[pytest] -python_classes = test_ Test -addopts = --doctest-modules - --junit-prefix ipa - # Ignore files for doc tests. - # TODO: ideally, these should all use __name__=='__main__' guards - --ignore=install/share/wsgi.py diff --git a/ipatests/setup.py b/ipatests/setup.py index 2b592cd..1fb5e92 100644 --- a/ipatests/setup.py +++ b/ipatests/setup.py @@ -49,7 +49,6 @@ ], scripts=['ipa-run-tests', 'ipa-test-config', 'ipa-test-task'], package_data={ - 'ipatests': ['pytest.ini'], 'ipatests.test_install': ['*.update'], 'ipatests.test_integration': ['scripts/*'], 'ipatests.test_ipalib': ['data/*'], diff --git a/make-test b/make-test index 93323a1..b38b42e 100755 --- a/make-test +++ b/make-test @@ -1,4 +1,6 @@ -#! /bin/bash - +#!/bin/bash set -ex -PYTHONPATH=.:$PYTHONPATH py.test "$@" + +SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +PYTHONPATH=$SCRIPTDIR:$PYTHONPATH py.test --confcutdir="$SCRIPTDIR" "$@" diff --git a/pytest.ini b/pytest.ini deleted file mode 120000 index e87991b..0000000 --- a/pytest.ini +++ /dev/null @@ -1 +0,0 @@ -ipatests/pytest.ini \ No newline at end of file
-- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code