[py-dev] RFC for (hopefully) final commments on pytest-2.3 API
holger krekel
holger at merlinux.eu
Tue Sep 18 15:14:40 CEST 2012
Hi Brianna, Floris, Carl, Ronny, all,
first, let me thank for all the useful feedback you already provided.
I am back trying to finalize the next pytest release -- FYI trunk is actually
fully functional and implements all previously discussed features.
However, I am still pondering Brianna's feedback (that that she found it
surprising that there is a @pytest.setup but no teardown) and a few
other little naming and protocol issues. If you find some time to state
your opinion on one or another issue i'd very much appreciate it:
- rename @pytest.setup to @pytest.fixture and the docs would talk
about fixture instead of setup functions. (See
http://pytest.org/dev/setup.html for the current docs)
This would induce less of a question about @pytest.teardown?!
- rename @pytest.factory to @pytest.funcarg - because with pytest-trunk
it's already the case that the former pytest_funcarg__NAME is just
a shortcut - there is no internal distinction anymore if you use
the decorator or the prefix or both. Removing the "pytest_funcarg__" prefix
and using a @pytest.funcarg(...) declaration looks naturally related?!
- introduce a "resource-centric" convenience protocol for fixtures and
funcarg factories. It would be used if you decorate a class instead of
a function and would lead to the calling of (optional) setup/teardown
methods. Here is an example:
# content of test_module.py
import pytest
@pytest.funcarg
class db:
def setup(self, funcarg1, funcarg2):
# called during the setup phase of each test using the "db"
# funcarg. this setup function will be called multiple
# times in case db.params is defined
def teardown(self):
# called during the teardown phase of a test which
# previously saw a successful db.setup() call
- moreover, there could optionally be a class-method "configure" which is
called ahead of any setup() and would allow to dynamically compute the scope
and params attribute and influence them e. g. from command line options::
@pytest.funcarg
class db:
@classmethod
def configure(cls, config):
scope = config.option.scope
params = ...
...
Dynamic scoping/parametrization is used today if you want to have
broadly-scoped less-parametrized resources during development but
use more function-scope more-parametrized resources during CI runs.
- the same class convenience protocol would work for fixtures:
import pytest
@pytest.fixture
class transact:
def setup(self, db):
db.begin()
self.db = db
def teardown(self):
self.db.commit()
best,
holger
More information about the Pytest-dev
mailing list