From 1e06a5195bafe0224d77371987f2509f5508ca2f Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 3 Jan 2017 18:04:53 +0100 Subject: Use pytest conftest.py and drop pytest.ini 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. 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 Reviewed-By: Milan Kubik --- Makefile.am | 3 +- ipalib/__init__.py | 7 ----- ipatests/conftest.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ ipatests/ipa-run-tests | 13 +++++---- ipatests/pytest.ini | 23 --------------- ipatests/setup.py | 1 - make-test | 8 ++++-- pytest.ini | 1 - 8 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 ipatests/conftest.py delete mode 100644 ipatests/pytest.ini delete mode 120000 pytest.ini diff --git a/Makefile.am b/Makefile.am index 73bd37899..9bfc899fe 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/ipalib/__init__.py b/ipalib/__init__.py index aaca97363..4f0909047 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 000000000..45920de6d --- /dev/null +++ b/ipatests/conftest.py @@ -0,0 +1,76 @@ +# +# 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): + # 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( + 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 53fa7b321..cafd993fd 100755 --- a/ipatests/ipa-run-tests +++ b/ipatests/ipa-run-tests @@ -34,12 +34,15 @@ 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') -os.chdir(os.path.dirname(ipatests.__file__)) +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) -sys.exit(pytest.main(sys.argv[1:])) +sys.exit(pytest.main(args)) diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini deleted file mode 100644 index c14eb5d39..000000000 --- a/ipatests/pytest.ini +++ /dev/null @@ -1,23 +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 - -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/ipatests/setup.py b/ipatests/setup.py index 2b592cd95..1fb5e922f 100644 --- a/ipatests/setup.py +++ b/ipatests/setup.py @@ -49,7 +49,6 @@ if __name__ == '__main__': ], 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 76e3dde6a..b38b42e4d 100755 --- a/make-test +++ b/make-test @@ -1,4 +1,6 @@ -#! /bin/bash - +#!/bin/bash set -ex -IPA_UNIT_TEST_MODE=cli_test 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 e87991b0f..000000000 --- a/pytest.ini +++ /dev/null @@ -1 +0,0 @@ -ipatests/pytest.ini \ No newline at end of file -- cgit