[pytest-dev] [TIP] pytest: Setup/TearDown with fixtures
Anatoly Bubenkov
bubenkoff at gmail.com
Tue Sep 2 22:41:15 CEST 2014
in the 'better' example, i would remove usage of the class
On 2 September 2014 17:58, Bruno Oliveira <nicoddemus at gmail.com> wrote:
>
> On Tue, Sep 2, 2014 at 10:14 AM, Laszlo Papp <lpapp at kde.org> wrote:
>
>> n
>
>
> Hi Laszlo,
>
> People at work have asked me the same question, and for people just
> getting their feet wet is usually better to introduce pytest features as
> close to what they're accustomed to as possible, so their learning curve
> can be smoother.
>
> Everyone, in your opinion, what would be a good example that uses pytest
> fixtures but doesn't diverge too much what someone might be used to
> `XUnit`? I like Laszlo example, but I would change it to not use a
> class-scoped fixture and perhaps use `yield_fixture` to show off how easy
> it is to write tear-down code.
>
> So this `XUnit` setup code:
>
> ```python
> class Test(TestCase):
>
> def setUp(self):
> self.user = User('test-user', 'password')
> self.user.register()
> self.session = Session()
> self.session.login(self.user)
>
> def tearDown(self):
> self.session.logout()
> self.user.unregister()
>
> def test_current_user(self):
> self.assertEqual(self.session.get_current_user().name,
> self.user.name)
> ```
>
> Can be almost directly translated to use py.test fixtures like this:
>
> ```python
> @pytest.yield_fixture
> def fixture():
> class Fixture: pass
> f = Fixture()
> f.user = User('test-user', 'password')
> f.user.register()
> f.session = Session()
> f.session.login(self.user)
> yield f
> f.session.logout()
> f.user.unregister()
>
>
> class Test(object):
>
> def test_current_user(fixture):
> assert fixture.session.get_current_user().name ==
> fixture.user.name
> ```
>
> Which can then be further improved to show off how fixtures can reuse
> other fixtures:
>
> ```python
> @pytest.yield_fixture
> def logged_session(user):
> session = Session()
> session.login(self.user)
> yield session
> session.session.logout()
>
>
> @pytest.yield_fixture
> def user():
> user = User('test-user', 'password')
> user.register()
> yield user
> user.unregister()
>
> class Test(object):
>
> def test_current_user(session, user):
> assert session.get_current_user().name == user.name
> ```
>
> The idea here is to allow the user to map what he already knows, and
> gradually introduce fixtures as a concept to make it easier to reuse
> setup/tear down code in a more modular fashion.
> And furthermore the example can be improved by for example parameterizing
> the `user` fixture with the original `"test-user"` and another
> `"anonymous"` user without password, producing new tests automatically.
>
> Any thoughts?
>
>
>
> _______________________________________________
> Pytest-dev mailing list
> Pytest-dev at python.org
> https://mail.python.org/mailman/listinfo/pytest-dev
>
>
--
Anatoly Bubenkov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pytest-dev/attachments/20140902/eb3151d4/attachment.html>
More information about the Pytest-dev
mailing list