You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Michael Wyraz <mi...@evermind.de> on 2012/08/13 14:34:53 UTC
Thoughts about deeper PageTester integration
Hi,
I tried to make PageTester work with our application. The problem is
that the application needs Spring where Tapestry5 pages and modules
accesses Spring beans and Spring beans accesses Tapestry services. This
works fine within the Web container. but not with page tester (even not
with the change described in the wiki
http://wiki.apache.org/tapestry/Tapestry5-TestWithTapestry-Spring). The
application also requires some custom filters (e.g. OpenSessionInView
filter) and stuff like a Spring ContextCustomizer which are completely
ignored by the pagetester.
I tried a lot to get it work but everytime i solved a problem I found a
new one. So I started a completely different approach which allowes
testing of the unchanged application which I'd like to discuss.
1. Emulate the whole servlet container
This sounds more heavy than it is. I simply parse the web.xml and create
Servlets and Filters+FilterChains from it using MockServletConfig and
such from spring testing. So I simply need to set up a
MockHttpServletRequest + a Response and pass it to the FilterChain. This
allows me to start the whole application with all filters including
Tapestry with a few lines of code. Surprisingly the started application
works out of the box including all the Spring/Filter stuff.
2. Capture the RenderedDocument "in container"
ATM I just did some tests if it is possible. Here's how I imagine that
it could work. This approach would also allow real In-Container-Tests
using the famous PageTester:
- a special marker will be added to the ServletRequest that identifies
it as test request (e.g. a special header)
- A special filter in the servlet filter chain (1st filter) looks for
this marker. If pressent, it creates a special ThreadLocal object that
signals the application that this is a test request. This ThreadLocal
object will later holt the rendered Document. Request and Response are
replaces by some wrappers.
- A tapestry markup filter similar to the one provided by the pagetester
module looks for the ThreadLocal object and puts the rendered document to it
- after all processing, the special filter takes the rendered document
and returns it as serialized object to the servlet's output stream.
3. Modularize PageTester
- Since PageTester always tries to instanciate teh application, it's not
possible to extend it. There should be a PageTesterBase class that holds
the pagetester logic and delegates everything that is required for
conneting to the application to abstract methods.
I'm looking forward for your comments to this approach.
Regards,
Michael.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org
Re: Thoughts about deeper PageTester integration
Posted by Alex Kotchnev <ak...@gmail.com>.
Michael,
I definitely hear your mix of frustration & admiration of PageTester,
I'm struggling w/ a mix of those myself. From what you're saying, it seems
like you're heading into the direction of making PageTester a more
end-to-end approach; I was personally struggling w/ finding a more
barebones/unit-testing setup (e.g. where I would have less magic in the
setup), but that's a different topic.
In the past, I recall struggling a bit of how to deal w/ testing an app
that used Spring security and I eventually gave up on it . These days my
app doesn't use Spring and uses Shiro for security and I was able to work
Shiro in w/o too much trouble.
On #1 from your list, I see how a more end-to-end approach that looks
more like a full blown web app would make a page tester more robust in
different application configurations that might use something more than
just Tapestry. So, it seems like a +1 on that front. But then again, it
starts stepping into the realm of the Selenium-based functional tests (the
boundary there is already pretty thin).
On #2 - I'm not sure why you want to additionally capture the rendered
document. As you indicated, PageTester already does that.
On #3 - I'm not sure why the PageTester's approach of starting up the
application prevents it from being extended. Actually, so far it seems that
the approach w/ being able to start up the application w/ a different set
of modules has been quite flexible for me. I've had issues w/ how the
selenium based tests start up the application, but that's a completely
different story.
Finally, I'd be curious to hear on your approach w/ making this happen.
The Testify project already has a few enhancements (w/ being able to inject
dependencies into the test,etc). Were you going to tackles these yourself
?
Cheers - Alex K
On Mon, Aug 13, 2012 at 8:34 AM, Michael Wyraz <mi...@evermind.de>wrote:
> Hi,
>
> I tried to make PageTester work with our application. The problem is that
> the application needs Spring where Tapestry5 pages and modules accesses
> Spring beans and Spring beans accesses Tapestry services. This works fine
> within the Web container. but not with page tester (even not with the
> change described in the wiki http://wiki.apache.org/**tapestry/Tapestry5-*
> *TestWithTapestry-Spring<http://wiki.apache.org/tapestry/Tapestry5-TestWithTapestry-Spring>).
> The application also requires some custom filters (e.g. OpenSessionInView
> filter) and stuff like a Spring ContextCustomizer which are completely
> ignored by the pagetester.
>
> I tried a lot to get it work but everytime i solved a problem I found a
> new one. So I started a completely different approach which allowes testing
> of the unchanged application which I'd like to discuss.
>
> 1. Emulate the whole servlet container
> This sounds more heavy than it is. I simply parse the web.xml and create
> Servlets and Filters+FilterChains from it using MockServletConfig and such
> from spring testing. So I simply need to set up a MockHttpServletRequest +
> a Response and pass it to the FilterChain. This allows me to start the
> whole application with all filters including Tapestry with a few lines of
> code. Surprisingly the started application works out of the box including
> all the Spring/Filter stuff.
>
> 2. Capture the RenderedDocument "in container"
> ATM I just did some tests if it is possible. Here's how I imagine that it
> could work. This approach would also allow real In-Container-Tests using
> the famous PageTester:
> - a special marker will be added to the ServletRequest that identifies it
> as test request (e.g. a special header)
> - A special filter in the servlet filter chain (1st filter) looks for this
> marker. If pressent, it creates a special ThreadLocal object that signals
> the application that this is a test request. This ThreadLocal object will
> later holt the rendered Document. Request and Response are replaces by some
> wrappers.
> - A tapestry markup filter similar to the one provided by the pagetester
> module looks for the ThreadLocal object and puts the rendered document to it
> - after all processing, the special filter takes the rendered document and
> returns it as serialized object to the servlet's output stream.
>
> 3. Modularize PageTester
> - Since PageTester always tries to instanciate teh application, it's not
> possible to extend it. There should be a PageTesterBase class that holds
> the pagetester logic and delegates everything that is required for
> conneting to the application to abstract methods.
>
> I'm looking forward for your comments to this approach.
>
> Regards,
> Michael.
>
>
> ------------------------------**------------------------------**---------
> To unsubscribe, e-mail: dev-unsubscribe@tapestry.**apache.org<de...@tapestry.apache.org>
> For additional commands, e-mail: dev-help@tapestry.apache.org
>
>