Hi Thomas, It seems the problem is that you are mixing xunit-style fixtures (by implementing a setup_class classmethod) and pytest-style fixtures: they currently don’t play well together, setup_* methods execute before all other fixtures (see #517 <https://github.com/pytest-dev/pytest/issues/517>). There are plans to fix that, but this scheduled for 3.6 only.
But there’s an easy workaround, just change your “setup_class” method into a proper fixture instead: class TestArchivesTestCaseMixin: @classmethod @pytest.fixture(autouse=True, params=['hg', 'git'], scope='class') def _configure_backend(cls, request): backend_alias = request.param Backend = vcs.get_backend(backend_alias) ... Hope that helps. Cheers, Bruno. On Mon, Mar 12, 2018 at 5:48 PM Thomas De Schampheleire < patrickdeping...@gmail.com> wrote: > Hello, > > The Kallithea project is a repository hosting and review system, > currently supporting git and hg. We currently have some test cases > that need to be run for these two version control systems. > > Previously this was done with some Python magic, which was now > simplified and made more explicit in commit: > > https://kallithea-scm.org/repos/kallithea/changeset/45a281a0f36ff59ffaa4aa0107fabfc1a6310251 > > but I assume it can be made more automatic with pytest fixtures. I was > thinking to use an autouse, parametrized fixture to set the backend to > 'hg' and 'git' respectively. But I can't make it work. > > Here is the change I did on top of the mentioned commit: > > diff --git a/kallithea/tests/vcs/base.py b/kallithea/tests/vcs/base.py > --- a/kallithea/tests/vcs/base.py > +++ b/kallithea/tests/vcs/base.py > @@ -5,6 +5,7 @@ InMemoryChangeset class is working prope > import os > import time > import datetime > +import pytest > > from kallithea.lib import vcs > from kallithea.lib.vcs.nodes import FileNode > @@ -27,6 +28,11 @@ class _BackendTestMixin(object): > """ > recreate_repo_per_test = True > > + @pytest.fixture(autouse=True, > + params=['hg', 'git']) > + def set_backend_alias(cls, request): > + cls.backend_alias = request.param > + > @classmethod > def get_backend(cls): > return vcs.get_backend(cls.backend_alias) > diff --git a/kallithea/tests/vcs/test_archives.py > b/kallithea/tests/vcs/test_archives.py > --- a/kallithea/tests/vcs/test_archives.py > +++ b/kallithea/tests/vcs/test_archives.py > @@ -14,7 +14,7 @@ from kallithea.tests.vcs.base import _Ba > from kallithea.tests.vcs.conf import TESTS_TMP_PATH > > > -class ArchivesTestCaseMixin(_BackendTestMixin): > +class TestArchivesTestCaseMixin(_BackendTestMixin): > > @classmethod > def _get_commits(cls): > @@ -95,11 +95,3 @@ class ArchivesTestCaseMixin(_BackendTest > def test_archive_prefix_with_leading_slash(self): > with pytest.raises(VCSError): > self.tip.fill_archive(prefix='/any') > - > - > -class TestGitArchive(ArchivesTestCaseMixin): > - backend_alias = 'git' > - > - > -class TestHgArchive(ArchivesTestCaseMixin): > - backend_alias = 'hg' > > > > but when running this I get: > > $ pytest kallithea/tests/vcs/test_archives.py > Test session starts (platform: linux2, Python 2.7.14, pytest 3.4.2, > pytest-sugar 0.9.1) > benchmark: 3.1.1 (defaults: timer=time.time disable_gc=False > min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10 > warmup=False warmup_iterations=100000) > rootdir: /home/tdescham/repo/contrib/kallithea/kallithea-review, > inifile: pytest.ini > plugins: sugar-0.9.1, localserver-0.4.1, benchmark-3.1.1 > > > ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― > ERROR at setup of TestArchivesTestCaseMixin.test_archive_zip[hg] > ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― > kallithea/tests/vcs/base.py:70: in setup_class > Backend = cls.get_backend() > kallithea/tests/vcs/base.py:38: in get_backend > return vcs.get_backend(cls.backend_alias) > E AttributeError: type object 'TestArchivesTestCaseMixin' has no > attribute 'backend_alias' > > > 7% ▊ > > ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― > ERROR at setup of TestArchivesTestCaseMixin.test_archive_zip[git] > ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― > kallithea/tests/vcs/base.py:70: in setup_class > Backend = cls.get_backend() > kallithea/tests/vcs/base.py:38: in get_backend > return vcs.get_backend(cls.backend_alias) > E AttributeError: type object 'TestArchivesTestCaseMixin' has no > attribute 'backend_alias' > > > 14% █▌ > > [..] > > > > So the parametrization seems to work because each test is run twice, > but I can't seem to find the right way to set the backend_alias, such > that a later call from a classmethod works correctly. > > I found some possibly useful magic by nicoddemus but could not make > that work either: > https://github.com/pytest-dev/pytest/issues/2618#issuecomment-318519875 > > Is it possible to achieve what I want, without changing each test > method to take a fixture explicitly? > > Thanks, > Thomas > _______________________________________________ > pytest-dev mailing list > pytest-dev@python.org > https://mail.python.org/mailman/listinfo/pytest-dev >
_______________________________________________ pytest-dev mailing list pytest-dev@python.org https://mail.python.org/mailman/listinfo/pytest-dev