[Grok-dev] grokproject configures z3c.testsetup instead of grok.testing
Steve Schmechel
steveschmechel at yahoo.com
Thu Mar 19 08:42:23 EDT 2009
Kevin and Uli,
Would one of you please enter a bug in launchpad so all these ideas do not get forgotten?
I would do it, but I believe the resulting discussion went well beyond my newbie comments on documentation, and a description that I write may not do the ideas presented here any justice.
Regards,
Steve
--- On Tue, 3/10/09, Kevin Teague <kevin at bud.ca> wrote:
> From: Kevin Teague <kevin at bud.ca>
> Subject: Re: [Grok-dev] grokproject configures z3c.testsetup instead of grok.testing
> To: grok-dev at zope.org
> Date: Tuesday, March 10, 2009, 6:42 PM
> > grok.testing or z3c.testsetup?
> > ------------------------------
> >
> > The main point behind having
> 'grok.testing.register_all_tests' was to
> > have an easier testsetup environment available with
> stock Grok. Import
> > grok and forget about complicately named package
> imports. I think this
> > is still a valid consideration.
>
> +0.5
>
> I like the idea of aliases within the grok namespace to
> make imports
> simpler. But conversely, using imports from the grok
> namespace tends
> to
> convey a deeper integration, it takes a newbie a while to
> realize,
> "Oh, Grok is just recommending z3c.testsetup for
> testing, it's not
> doing anything magical to z3c.testsetup to make it
> work."
>
> > Setting up Layers
> > -----------------
> >
> > Layers are a powerful tool of the Zope testing
> machinery. They were not
> > very well supported with z3c.testsetup < 0.3. You
> could only define one
> > ZCML file or ZCML based layer which was used only for
> functional tests,
> > but all thereof. Furthermore for z3c.testsetup
> 'layer' alway meant
> > 'ZCML-layer' that is setup using
> zope.app.testing.functional although
> > there are also non-ZCML layers and ZCML layers that do
> not need a fully
> > fledged ZODB running in background (okay, the latter
> is rare).
> >
>
> Right. I've been looking at the 0.2.1 source release
> and "layers"
> seemed
> confusing since it looked like could only have one layer.
> Actually
> allowing for multiple layers in 0.3 makes a lot more sense.
>
> What about setting up layers with a relational database or
> an LDAP
> instance? A How-To explaining that would be very nice :)
>
> (or maybe I will write one if I figure it out ...)
>
> >
> > This raises the question: do we really need a default
> layer? From
> > looking through zope.app.testing I learned, that it
> can be quite
> > cumbersome to look in different locations for
> 'ftesting.zcml' and the
> > results might be unexpected. Sometimes it is like pure
> guessing.
> >
> > From what I learned from developer feedback, I'd
> now tend to opt for
> > skipping the default layer and instead raise an error
> if one is needed
> > but not supplied.
> >
>
> Doesn't z3c.testsetup.doctesting.FunctionalDocTestSetup
> already look
> for
> the packages ftesting.zcml file to use for a default layer?
> Or am I
> misunderstanding how layers are setup?
>
>
> > In `grokproject` we could provide a locally defined
> ZCML-layer (as we
> > already do) which would be included in generated
> projects and (this time
> > _explicitly_) be used by local (functional) doctests.
> >
> > I admit that this could mean more setup code but
> people could see how to
> > setup their own layer from the example code created
> (and the code would
> > be really used).
> >
>
> +1
>
> Yes, I think it would make the test setup more obvious if
> the
> boilerplate
> generated by grokproject used an explicit style.
>
> > And as we are changing everything we could also switch
> to the new
> > testsetup syntax, so that you could setup a functional
> test like this::
> >
> > My Sample Tests
> > ===============
> >
> > :doctest:
> > :functional-zcml-layer: ftesting.zcml
> >
> > >>> getRootFolder()
> > <zope.app.folder.folder.Folder object at
> 0x...>
> >
> > With this registration you could use Kevins ultra
> short setup code::
> >
> > # tests.py
> > import grok
> > test_suite =
> grok.testing.register_all_tests('sampleapp')
> >
> > or you could setup your functional tests like this::
> >
> > My Sample Tests
> > ===============
> >
> > :doctest:
> > :layer: sampleapp.tests.FunctionalLayer
> > :setup: sampleapp.tests.setup
> > :teardown: sampleapp.tests.teardown
> >
> > >>> getRootFolder()
> > <zope.app.folder.folder.Folder object at
> 0x...>
> >
> > which would require the complete layer setup beside
> the
> > `FunctionalLayer` definition in tests.py::
> >
> > # tests.py
> > import os.path
> > import grok
> > import sampleapp
> > from zope.app.testing.functional import (ZCMLLayer,
> >
> FunctionalTestSetup)
> >
> > globs =
> z3c.testsetup.functional.doctesting.FunctionalDocTestSetup.globs
> >
> > def setup(test):
> > FunctionalTestSetup().setUp()
> > test.globs = globs
> > return
> >
> > def teardown(test):
> > return FunctionalTestSetup().tearDown()
> >
> > ftesting_zcml = os.path.join(
> > os.path.dirname(sampleapp.__file__),
> 'ftesting.zcml')
> >
> > FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__,
> >
> 'FunctionalLayer',
> > allow_teardown=True)
> >
> > test_suite =
> grok.testing.register_all_tests('sampleapp')
> >
> > A bit too much for the beginning, if you ask me (and
> not really needed
> > for the tests done). So I would opt for having a
> default tests.py like
> > the short one above and maybe we should add a link to
> the (then
> > finished) grok testing documentation for people that
> want to create more
> > complicated stuff.
> >
> > What do you think?
> >
>
> Well, I've been trying to sort out all of the packages
> at play
> (z3c.testsetup, zope.app.testing, zope.testing) and
> it's making my
> head spin ...
>
> ... but I think what's confusing me is the Layers. The
> old-style
> syntax:
>
> :test-layer: python
> :test-layer: unit
> :test-layer: functional
>
> Is confusing because the difference between
> 'python' and 'unit' tests
> wasn't the layer (both layers are empty), but how those
> tests are
> collected.
>
> The new syntax:
>
> :doctest:
> :functional-zcml-layer: ftesting.zcml
>
> :doctest:
> :layer: sampleapp.tests.FunctionalLayer
> :setup: sampleapp.tests.setup
> :teardown: sampleapp.tests.teardown
>
> :unittest:
>
> Is a little simpler in that :unittest: and :doctest: are
> just
> informing the
> test getters to collect tests from that file. But the
> layers is still
> confusing. I'd rather see the layer names used:
>
> :doctest:
> :layer: FunctionalLayer
>
> :doctest:
> :layer: MyCustomFunctionalLayerName
>
> :unittest:
>
> Where if the layer is not specified, then one isn't
> used. But for
> layer
> setup: specifying the ZCML file, the setUp() and tearDown()
> methods,
> etc.
> should all happen in the Layer(s) definition. Then in the
> test cases
> you
> simply specify which layer it's part of ...
>
> ... but again, I'm not sure this is possible? And if it
> is, I think
> it'd
> take quite a bit of refactoring in z3c.testsetup.
>
> But it seems to make sense to me: a layer defines a
> complete set of
> configuration for setup/teardown.
>
> The confusing bit is that the
> z3c.testing.testgetter.FunctionalDocTestGetter
> uses the z3c.testing.doctesting.FunctionalDocTestSetup.
> This setup
> then
> defines it's own layer (with defaults for
> layer_name='FunctionalLayer',
> zcml_config='ftesting.zcml'). The ZCML Layer then
> has a setup with
> configures
> the FunctionalTestSetup. But FunctionalDocTestSetup
> doesn't delegate
> to
> the ZCMLLayer setup, but instead specifies in it's own
> setUp() to use
> FunctionalTestSetup. Whew!
>
> Purely in pseudo-code, this could support something like
> this in
> a Grok-based package's test.py module:
>
> import grok
> import z3c.testsetup.layers.ZCMLAndZODBDemoStorage # this
> does not
> exist!
>
> class SampleAppFunctionalLayer
> (z3c.testsetup.layers.ZCMLAndZODBDemoStorage):
> layer_name = 'Sample App Functional Layer'
>
> def setUp(self):
> # configures ZCML + ZODB DemoStorage
> super(SampleAppFunctionalLayer, self).setUp()
> # additional setup goes here
> pass
>
> def tearDown(self):
> # tears down ZODB DemoStorage
> super(SampleAppFunctionalLayer, self).tearDown()
> # additional tear down goes here
> pass
>
> test_suite = grok.testing.register_all_tests(
> 'sampleapp',
> layers =
> [SampleAppFunctionalLayer(allow_teardown=True), ]
> )
>
>
> _______________________________________________
> Grok-dev mailing list
> Grok-dev at zope.org
> http://mail.zope.org/mailman/listinfo/grok-dev
More information about the Grok-dev
mailing list