Skip to content

Commit

Permalink
Use pytest conftest.py and drop pytest.ini
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-By: Milan Kubik <[email protected]>
  • Loading branch information
tiran authored and MartinBasti committed Jan 5, 2017
1 parent 3387734 commit 1e06a51
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 42 deletions.
3 changes: 1 addition & 2 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ EXTRA_DIST = .mailmap \
doc \
freeipa.spec.in \
ipasetup.py.in \
pylintrc \
pytest.ini
pylintrc

clean-local:
rm -rf "$(RPMBUILD)"
Expand Down
7 changes: 0 additions & 7 deletions ipalib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 76 additions & 0 deletions ipatests/conftest.py
Original file line number Diff line number Diff line change
@@ -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()
13 changes: 8 additions & 5 deletions ipatests/ipa-run-tests
Original file line number Diff line number Diff line change
Expand Up @@ -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))
23 changes: 0 additions & 23 deletions ipatests/pytest.ini

This file was deleted.

1 change: 0 additions & 1 deletion ipatests/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/*'],
Expand Down
8 changes: 5 additions & 3 deletions make-test
Original file line number Diff line number Diff line change
@@ -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" "$@"
1 change: 0 additions & 1 deletion pytest.ini

This file was deleted.

0 comments on commit 1e06a51

Please sign in to comment.