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 <cheimes@redhat.com>
Reviewed-By: Milan Kubik <mkubik@redhat.com>
This commit is contained in:
Christian Heimes 2017-01-03 18:04:53 +01:00 committed by Martin Basti
parent 3387734e6c
commit 1e06a5195b
8 changed files with 90 additions and 42 deletions

View File

@ -37,8 +37,7 @@ EXTRA_DIST = .mailmap \
doc \
freeipa.spec.in \
ipasetup.py.in \
pylintrc \
pytest.ini
pylintrc
clean-local:
rm -rf "$(RPMBUILD)"

View File

@ -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()

76
ipatests/conftest.py Normal file
View File

@ -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()

View File

@ -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__))
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))

View File

@ -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

View File

@ -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/*'],

View File

@ -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" "$@"

View File

@ -1 +0,0 @@
ipatests/pytest.ini