Hi holger, > Hi Alex, > > On Tue, Dec 15, 2015 at 09:18 +0000, Alex Netes wrote: > > Hi holger, > > > > Thanks for your help. > > > > > Hi Alex, > > > > > > On Mon, Dec 14, 2015 at 15:50 +0000, Alex Netes wrote: > > >> Hello guys, > > >> > > >> I'm new to Pytest and I encounter something I cannot explain. > > > > > > I also hit many things which i can not explain, even with pytest and > > > maybe even with this very mail. > > > > > > > I'll try to explain my intention in behind my code, instead of showing my > > nitty code. > > > > >> I'm trying to give fixture fixt_func() a parameter fixt_prm and expect > > >> the fixture to be called only > > >> once as it defined with 'class' scope, but the fixture is called twice > > >> as it ignores the scope. What > am I > > >> missing? > > >> > > >> > > >> @pytest.fixture(scope='class') > > >> def fixt_func(request, resource, fixt_prm): > > >> print fixt_prm > > >> > > >> class TestA(): > > >> @pytest.mark.parametrize('resource', ['x'], scope='class') > > >> @pytest.mark.parametrize(fixt_prm ', ['x'], scope='class') > > >> @pytest.mark.parametrize('prm', ['a', 'b']) > > >> def test_a(self, prm, fixt_func) > > >> assert True > > > > > > You are doing something i wasn't aware is possible. You pass a parameter > > > to the fixture function > > > fixt_func through parametrization but as a fixture. > > > In any case, if we modify your example to: > > > > > > import pytest > > > @pytest.fixture(scope='class') > > > def fixt_func(request, fixt_prm): > > > print "fixt_func" > > > > > > class TestA(): > > > @pytest.mark.parametrize('fixt_prm', ['x', 'y'], scope='class') > > > def test_a(self, fixt_func): > > > assert True > > > > > > this will also call fixt_func twice for the two executing tests. > > > It's argubaly "correct" behaviour from a certain point of view. > > > fixt_prm is class-scoped so each parameter instance exists as a different > > > "class-level" value so we > > > interpret it to mean each class-scoped fixture function needs to be > > > executed with both values. > > > > > > Just imagine we wouldn't parametrize on the function directly but through > > > a fixture function: > > > > > > import pytest > > > @pytest.fixture(scope='class') > > > def fixt_func(request, fixt_prm): > > > print "fixt_func" > > > > > > @pytest.fixture(scope='class', params=["x", "y"]) > > > def fixt_prm(request): > > > print "fixt_prm" > > > > > > class TestA(): > > > def test_a(self, fixt_func): > > > assert True > > > > > > Here it's maybe more obvious why this executes both fixture functions > > > twice. > > > > > > however, i am not sure about your precise example above. I can see why > > > you expect the two > > > different "prm" values (and thus test functions) to execute with the same > > > class-level fixtures. > Maybe > > > others can chime in and say if they consider your example a bug or a > > > "usual" behaviour. > > > > > > > Your examples makes sense. I'm trying to do something more complex and > > maybe I look at it in a > wrong > > way. I want to define a fixture "fixt_func" so it would be able to receive > > a parameter defined by > different > > test classes. Moreover I want "fixt_func" to have Class scope, so I can > > call finalize when all tests of > the > > same class finished running. That's why I came up with the above "solution". > > I think you could use a marker on the class or even just a class attribute: > > import pytest > > @pytest.fixture(scope="class") > def fix(request): > return request.cls.attr * 10 > > class TestA: > attr = 1 > > def test_one(self, fix): > assert 0 > > class TestB: > attr = 2 > > def test_one(self, fix): > assert 0 > > The "request" object gives you back references into the context > of the test which requests fixtures.
Thanks. I think marker option better suite my needs. However, I have two questions. 1. I hit a problem with getting marker parameter from the fixture when it defined with 'class' scope. When I remove the scope, it works. Import pytest @pytest.fixture(scope="class") def fix(request): print request.node.get_marker('attr') # None @pytest.mark.attr('something') class TestA: def test_one(self, fix): assert 0 ------------------------------ Import pytest @pytest.fixture def fix(request): print request.node.get_marker('attr') # <MarkInfo 'attr' args=('something',) kwargs={}> @pytest.mark.attr('something') class TestA: def test_one(self, fix): assert 0 2. Is it possible to provide arguments to the marker via the command line? _______________________________________________ pytest-dev mailing list pytest-dev@python.org https://mail.python.org/mailman/listinfo/pytest-dev