Seaside + Seaside Testing
C. David Shaffer
cdshaffer at acm.org
Thu Nov 11 16:17:10 UTC 2004
stéphane ducasse wrote:
> Hi
>
> can you explain what is seaside testing?
> How does it compare with httpUnit (I do not know remember the name of
> the CS project).
>
> Stef
>
>
>
Stef,
The key difference is that SeasideTesting runs on the Seaside server and
gives you access to your Seaside components (not just their HTML
representations). So, in SeasideTesting not only can I test if a
component is displaying what I expect, I can test that a component or
domain object is in the state I expect. The disadvantages of this
technique are that only Seaside applications can be tested and the tests
must run on the server (either through the normall SUnit TestRunner or
through a WebTestRunner included with SeasideTesting). Actually with a
little refactoring one could write remote SeasideTesting test cases but,
of course, they wouldn't have access to the component objects
themselves, just the generated HTML.
While I haven't used it, my impression is that the CS SmallHttpUnitTest
project runs remotely (ie it accesses the server through a TCP socket)
and can test Seaside and non-Seaside applications. They seem to have
paid more attention to design than I did since they have a very clean
API for accessing/querying/manipulating the HTML components.
SeasideTesting can do all this but it just doesn't seem quite as clean
as their work does on the surface at least.
SmallHttpUnitTest is obviously the way to go if you aren't using
Seaside. If you are using Seaside then the choice comes down to knowing
what you plan to test. I personally don't find tests which ask lots of
questions about the contents of the display to be very robust. First,
presence of an HTML element and its appearance on the screen are two
different things (how do you make sure the page "looks" right?).
Second, small changes in your component layout usually force changes in
your test cases. I don't like this. I prefer to press buttons, follow
links etc and then make sure my domain objects (or even the Seaside
components themselves) have "done the right thing". Here's an example...
Using SmallHttpUnitTest one could test the Seaside counter like this
(borrowed from the same code provided with the announcement of
SmallHttpUnitTest):
testNavigation
| browser |
browser := HttpBrowser on: 'http://localhost:8008/seaside/go/counter'.
self assert: (browser h1 allSatisfy: [:each | each text = '0']).
self assert: (browser a text includesAllOf: #('++' '--')).
browser click: [:a | a text = '++'].
self assert: (browser h1 text includesExactly: #('1')).
browser click: '++'.
self assert: (browser h1 text includesExactly: #('2')).
browser click: '--'.
self assert: (browser h1 text includesExactly: #('1')).
In SeasideTesting we'd something more like:
testBack
self newApplicationWithRootClass: WACounter.
self establishSession.
self followAnchor: (self lastResponse anchorWithLabel: '++').
self followAnchor: (self lastResponse anchorWithLabel: '++').
self assert: self component count = 2.
self back.
self followAnchor: (self lastResponse anchorWithLabel: '++').
self assert: self component count = 2
Notice that I'm testing that the domain (the "count") has the correct
value, rather than testing the contents of the page. Now, this isn't to
say I can't write tests which look for strings in SeasideTesting but
right now it isn't very clean. I expect this to improve as
SeasideTesting evolves. At the moment I simply don't write that many
test cases that test page contents.
I like the way one "clicks" on buttons and links in SmallHttpUnitTest.
In general, iterating over a type of component in SmallHttpUnitTest is
cleaner than in SeasideTesting but I hope to change that.
Hope this helps!
David
--
C. David Shaffer
http://www.cs.westminster.edu/~shaffer
http://www.shaffer-consulting.com
More information about the Squeak-dev
mailing list
|