mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-23 23:50:03 -06:00
ipatests: Use pytest-sourceorder
The plugin to run tests within a class in the order they're defined in the source was split into a separate project. Use this project instead of a FreeIPA-specific copy. Reviewed-By: Tomas Babej <tbabej@redhat.com>
This commit is contained in:
parent
1e27fcc3b1
commit
bc5b13c3da
@ -309,6 +309,7 @@ Requires: python-paste
|
||||
Requires: python-coverage
|
||||
Requires: python-polib
|
||||
Requires: python-pytest-multihost >= 0.4
|
||||
Requires: python-pytest-sourceorder
|
||||
|
||||
Conflicts: %{alt_name}-tests
|
||||
Obsoletes: %{alt_name}-tests < %{version}
|
||||
|
@ -10,7 +10,6 @@ addopts = --doctest-modules
|
||||
--junit-prefix ipa
|
||||
-p ipatests.pytest_plugins.nose_compat
|
||||
-p ipatests.pytest_plugins.declarative
|
||||
-p ipatests.pytest_plugins.ordering
|
||||
-p ipatests.pytest_plugins.integration
|
||||
-p ipatests.pytest_plugins.beakerlib
|
||||
# Ignore files for doc tests.
|
||||
|
@ -1,88 +0,0 @@
|
||||
# Authors:
|
||||
# Petr Viktorin <pviktori@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2014 Red Hat
|
||||
# see file 'COPYING' for use and warranty information
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""Pytest plugin for IPA
|
||||
|
||||
Adds support for the @pytest.mark.source_order decorator which,
|
||||
when applied to a class, runs the test methods in source order.
|
||||
|
||||
See test_ordering for an example.
|
||||
"""
|
||||
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
def ordered(cls):
|
||||
"""Decorator that marks a test class as ordered
|
||||
|
||||
Methods within the marked class will be executed in definition order
|
||||
(or more strictly, in ordered by the line number where they're defined).
|
||||
|
||||
Subclasses of unittest.TestCase can not be ordered.
|
||||
|
||||
Generator methods will not be ordered by this plugin.
|
||||
"""
|
||||
cls._order_plugin__ordered = True
|
||||
assert not isinstance(cls, unittest.TestCase), (
|
||||
"A unittest.TestCase may not be ordered.")
|
||||
cls = pytest.mark.source_order(cls)
|
||||
return cls
|
||||
|
||||
|
||||
def decorate_items(items):
|
||||
node_indexes = {}
|
||||
for index, item in enumerate(items):
|
||||
try:
|
||||
func = item.function
|
||||
except AttributeError:
|
||||
yield (index, ), item
|
||||
continue
|
||||
|
||||
key = (index, )
|
||||
for node in reversed(item.listchain()):
|
||||
# Find the corresponding class
|
||||
if isinstance(node, pytest.Class):
|
||||
cls = node.cls
|
||||
else:
|
||||
continue
|
||||
if getattr(cls, '_order_plugin__ordered', False):
|
||||
node_index = node_indexes.setdefault(node, index)
|
||||
# Find first occurence of the method in class hierarchy
|
||||
for i, parent_class in enumerate(reversed(cls.mro())):
|
||||
if getattr(parent_class, '_order_plugin__ordered', False):
|
||||
method = getattr(parent_class, func.__name__, None)
|
||||
if method:
|
||||
# Sort methods as tuples (position of the class
|
||||
# in the inheritance chain, position of the method
|
||||
# within that class)
|
||||
key = (node_index, 0,
|
||||
i, method.func_code.co_firstlineno, node)
|
||||
break
|
||||
else:
|
||||
# Weird case fallback
|
||||
# Method name not in any of the classes in MRO, run it last
|
||||
key = node_index, 1, func.func_code.co_firstlineno, node
|
||||
break
|
||||
yield key, item
|
||||
|
||||
|
||||
def pytest_collection_modifyitems(session, config, items):
|
||||
items[:] = [item for i, item in sorted(decorate_items(items))]
|
@ -23,7 +23,7 @@ import pytest
|
||||
|
||||
from ipapython.ipa_log_manager import log_mgr
|
||||
from ipatests.test_integration import tasks
|
||||
from ipatests.pytest_plugins.ordering import ordered
|
||||
from pytest_sourceorder import ordered
|
||||
|
||||
log = log_mgr.get_logger(__name__)
|
||||
|
||||
|
@ -25,7 +25,7 @@ in a specific order:
|
||||
- Within a class, test methods are ordered according to source line
|
||||
"""
|
||||
|
||||
from ipatests.pytest_plugins.ordering import ordered
|
||||
from pytest_sourceorder import ordered
|
||||
|
||||
|
||||
@ordered
|
||||
|
Loading…
Reference in New Issue
Block a user