Browse Source

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>
master
Christian Heimes Martin Basti 4 years ago
parent
commit
1e06a5195b
8 changed files with 90 additions and 42 deletions
  1. +1
    -2
      Makefile.am
  2. +0
    -7
      ipalib/__init__.py
  3. +76
    -0
      ipatests/conftest.py
  4. +8
    -5
      ipatests/ipa-run-tests
  5. +0
    -23
      ipatests/pytest.ini
  6. +0
    -1
      ipatests/setup.py
  7. +5
    -3
      make-test
  8. +0
    -1
      pytest.ini

+ 1
- 2
Makefile.am 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)"


+ 0
- 7
ipalib/__init__.py 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
- 0
ipatests/conftest.py 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()

+ 8
- 5
ipatests/ipa-run-tests 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__))

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

+ 0
- 23
ipatests/pytest.ini 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

+ 0
- 1
ipatests/setup.py 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/*'],


+ 5
- 3
make-test 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" "$@"

+ 0
- 1
pytest.ini View File

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

Loading…
Cancel
Save