[TIP] Hint on TestClass

holger krekel holger at merlinux.eu
Sat Jul 14 03:01:21 PDT 2012


Hello Thijs,

On Sat, Jul 14, 2012 at 10:22 +0200, Thijs Engels wrote:
> Holger,
> 
> Thank you very much for your response, I have been able to make progress
> on this now.
> 
> This actually brings me to a question on the same topic. What is the
> meaning of classes in py.test (over just functions)? It is merely for me
> as the user to have an overview? Asking this question with
> parametrization in mind. I thought that a class would be considered a
> suite with a collection of tests which should be run as a group, short
> example the file with tests:
> 
> class TestSession:
>     def test_id(self, session):
>         assert isinstance(session.id, int)
>         assert session.id > 0
> 
>     def test_date(self, session):
>         assert isinstance(session.delivery_date, date)
>         assert session.delivery_date > date(2010, 12, 31)
> 
> The session parameter is parametrized via the indirect option combined
> with the factory function as indicated in your earlier response
> (currently limited to three sessions).
> 
> Running this results in this (verbose) output:
> 
> test_universe.py:4: TestSession.test_id[1] PASSED
> test_universe.py:4: TestSession.test_id[2] PASSED
> test_universe.py:4: TestSession.test_id[3] PASSED
> test_universe.py:8: TestSession.test_date[1] PASSED
> test_universe.py:8: TestSession.test_date[2] PASSED
> test_universe.py:8: TestSession.test_date[3] PASSED
> 
> As the session information is retrieved from a database I would prefer
> to first do all tests on session object 1, before starting on session 2,
> hence the output I would like is:
> 
> test_universe.py:4: TestSession.test_id[1] PASSED
> test_universe.py:8: TestSession.test_date[1] PASSED
> test_universe.py:4: TestSession.test_id[2] PASSED
> test_universe.py:8: TestSession.test_date[2] PASSED
> test_universe.py:4: TestSession.test_id[3] PASSED
> test_universe.py:8: TestSession.test_date[3] PASSED
> 
> As stated earlier I thought this could be done via a TestClass, which
> need the additional self parameter which shows up in the debug output
> for failed tests as well. Is there a way to construct (parametrized)
> test suites?

There is no config/command line option for this.
I just wrote a little example showing how you can do it, however:

    http://pytest.org/dev/example/parametrize.html#grouping-test-execution-by-parameter

best,
holger


> 
> Kind regards,
> 
> Thijs
> 
> On Thu, Jul 12, 2012, at 06:27, holger krekel wrote:
> > Hi Thijs,
> > 
> > On Wed, Jul 11, 2012 at 16:26 +0200, Thijs Engels wrote:
> > > Hello all,
> > > 
> > > I am currently running multiple tests (using py.test) on a series of
> > > objects which are relatively expensive to retrieve. My thinking was to
> > > group the tests on the same object into one class, potentially using the
> > > setup/teardown at class level to retrieve the object under test.
> > 
> > This is a classic use case for "funcargs".  See here for a basic example:
> > 
> > http://pytest.org/latest/example/parametrize.html#deferring-the-setup-of-parametrized-resources
> > 
> > In addition, you probably want to extend the setup of resources by
> > using the request.cached_setup() helper like so:
> > 
> >     def pytest_funcarg__db(request):
> >         if request.param == "d1":
> >             return request.cached_setup(setup=DB1, scope="session",
> >                                         extrakey=request.param)
> >         ...
> > 
> > This will make sure that your setup function (in this case the DB1 class)
> > will only be called once per session.  Other scopes are "class" or
> > "module".
> >     
> > > As mentioned there is a series of these objects, hence I would like to
> > > parametrize the class holding all the individual tests. Via the search
> > > on the py.test I actually landed on a page which seems to describe
> > > exactly what I am after:
> > > http://pytest.org/dev/example/resources_attic.html, although I could not
> > > complete figure out the given example with self.db.
> > 
> > Not sure how you could find "attic" documents but this is not a valid
> > suggestion these days. 
> > 
> > best,
> > holger
> > 
> > 
> > > 
> > > This is about what I hoping to archive:
> > >   Use parametrize to run the test in TestSession for a list of
> > >   session_ids.
> > > 
> > > TestSession:
> > >   def __init__(self, session_id):
> > >     self.session = expensive_database_query(session_id)
> > > 
> > >   def test_session_id():
> > >     assert session.id > 0
> > > 
> > >   def test_session_date():
> > >     assert session.date >= date(2012, 1, 1)
> > > 
> > >   def test_periods():
> > >     assert periods in range(1, 26)
> > > 
> > > Is the resource_attic link indeed describing what I am after?
> > > 
> > > Thijs
> > > 
> > > _______________________________________________
> > > testing-in-python mailing list
> > > testing-in-python at lists.idyll.org
> > > http://lists.idyll.org/listinfo/testing-in-python
> > > 
> 



More information about the testing-in-python mailing list