URL: https://github.com/freeipa/freeipa/pull/366 Author: tiran Title: #366: Use pytest conftest.py Action: opened
PR body: """ 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. """ 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 2e56469a7cbbc1de9b3fa24b715ab235adc184d6 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 | 6 ---- ipatests/conftest.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ ipatests/ipa-run-tests | 3 -- ipatests/pytest.ini | 10 ------- make-test | 2 +- 5 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 ipatests/conftest.py diff --git a/ipalib/__init__.py b/ipalib/__init__.py index 4a61ace..9cbe528 100644 --- a/ipalib/__init__.py +++ b/ipalib/__init__.py @@ -950,9 +950,3 @@ def create_api(mode='dummy'): 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..0399e2f --- /dev/null +++ b/ipatests/conftest.py @@ -0,0 +1,77 @@ +# +# 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 + + +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' +] + +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. +try: + import ipatests.pytest_plugins.integration +except ImportError: + if ipaserver is not None: + raise +else: + pytest_plugins.append('ipatests.pytest_plugins.integration') + + +def pytest_configure(config): + # register an additional marker + 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) + + try: + api.finalize() + except ImportError as e: + # ipaclient has no ipaserver + if ipaserver is not None: + raise + else: + print(e) 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 733004b78e31341ab919e3acf312bec12bc2e173 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Tue, 3 Jan 2017 18:08:05 +0100 Subject: [PATCH 2/2] Catch ValueError raised by pytest.config.getoption() In latest version of pytest the function pytest.config.getoption() raises ValueError for unknown options. --- ipatests/test_util.py | 6 ++++-- ipatests/util.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ipatests/test_util.py b/ipatests/test_util.py index 0fbd536..f4e7773 100644 --- a/ipatests/test_util.py +++ b/ipatests/test_util.py @@ -140,8 +140,10 @@ def test_eq(self): def test_assert_deepequal(): f = util.assert_deepequal - # pylint: disable=no-member - pretty = pytest.config.getoption("pretty_print") + try: # pylint: disable=no-member + pretty = pytest.config.getoption("pretty_print") + except (AttributeError, ValueError): + pretty = False # LEN and KEYS formats use special function to pretty print structures # depending on a pytest environment settings diff --git a/ipatests/util.py b/ipatests/util.py index 7b5e317..9320383 100644 --- a/ipatests/util.py +++ b/ipatests/util.py @@ -337,7 +337,7 @@ def assert_deepequal(expected, got, doc='', stack=tuple()): """ try: pretty_print = pytest.config.getoption("pretty_print") # pylint: disable=no-member - except AttributeError: + except (AttributeError, ValueError): pretty_print = False if pretty_print:
-- 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