[Windmill-dev] Tests in native JavaScript
Mikeal Rogers
mikeal at osafoundation.org
Sat Aug 25 10:34:48 PDT 2007
I'm definitely not in favor of adding another layer of abstraction in
the current controller API to execute what essentially amounts to
another framework. So something like this is not going to happen;
controller.load_js_module(url)
controller.js_test(name=my_javascript_function, params={})
I understand what you're saying about wanting to write tests in
javascript and the case for JSUnit but I do think they are two
separate problems because JSUnit test cases as they stand now don't
need to load a live application in the browser.
I think we can add JSUnit support without touching our fairly clean
controller API. In fact, instead of having a declarative model where
you define every test you could just point the windmill service at
the directory your JSUnit tests are in and it could parse it for each
test file, send it to the IDE and the IDE could execute them and
report results without adding any new special case in the controller
API. This would still get all the features of the services logging
and continuous integration features without adding a single function
to the controller API.
On the topic of using javascript for writing other windmill tests.
Usually the case for writing a test in any language is done via
XMLRPC, but the case you are talking about is different. In your case
you want to write a test case that can't actually be facilitated by
the current controller API and needs to be in javascript with the web
application you're testing loaded in the browser. Well we do have the
extensions framework already for this, you can write a new controller
method, have it take any amount of arguments you want, it can use the
same locator system the current controllers use, and you can already
envoke those methods from Python/JSON/whatever.
The only issue with using the plugin system for that is if the amount
of tests you're writing this way gets too large it would be very
difficult to maintain.
I have another option. When i first spoke to bobby about JSUnit
integration he was adamant that we not diverge from "standard JSUnit"
but I'm still not convinced that there isn't something we can do here
to make writing unittests easier and bluring the line slightly
between unittests and functional tests -- and providing a clean way
for you to do what you're talking about -- while still ensuring that
regular old unittests can run in the windmill unittest framework
without any modifications to the tests.
Since the JSUnit tests can have all the js code in the IDE we won't
have anything loaded in the browser when we run the tests. We could
provide an extension to unittest object that we will need to
implement for the unittest code ( in the current cosmo JSUnit tests
this object is 'jum' ) that is a wrapper object for the controller
API. So;
jum.assertEquals("new", delta.getProperty("displayName"));
jum.assertFalse(delta.getProperty("body") == undefined);
jum.controller.open(url)
jum.controller.click(id='blah')
There are some issues with implementing this.
For one, the IDE never runs a test without getting it from the
service. The service never resolves a test it hasn't received,
processed, and handed to the IDE. In fact implementing the whole
JSUnit framework has this problem. What we would consider a "suite"
would be an individual JSUnit test method, and the individual assert
and controller calls to the jum object would be "tests", so solving
this problem by making the IDE describe and pull out each test would
slow down the JSUnit tests by about 10x what they currently run.
The service <-> IDE design may seem crazy at first but once you look
at how tests come in over XMLRPC and then get resolved over JSONRPC
and are constantly referenced by UUID it starts to make a lot more
sense. In fact we catch a lot of bugs this way.
One idea i had was to create a new service method for resolving
unittest's, unittest_report(), that would basically call all of the
tail end report code we currently have without running through all
the test resolution code we in the service.
The largest limitation of all this is that you can't stager a regular
windmill test and a JSUnit test one after another. They follow
completely different workflows and would be loaded in to the service
very differently.
-Mikeal
On Aug 24, 2007, at 4:08 PM, Matthew Eernisse wrote:
> I sat down to write some Windmill tests for recurring items in
> Cosmo, and realized that the types of asserts available with the
> current JSON/Python tests simply weren't sufficient for the
> specific stuff I wanted to test for. I immediately started wanting
> the ability to write tests directly in JavaScript.
>
> I wasn't thinking of this in the conext of JSUnit integration --
> but since there's already an established convention with JSUnit, it
> kind of makes sense to me that any pure-JS test feature we add
> would be compatible with JSUnit tests.
>
> That way people (including us) could reuse their existing tests.
> And instead of running these tests against contrived test fixtures
> set up with JS in the test environment, they can run these tests
> against the data generated by actually maniuplating the UI elements
> the way a user would. The tests would also run in the environment
> our UI code runs in -- our various supported browsers.
>
> The JS code could be easily pulled down by XHR and eval'd to get it
> into the testing environment. So, given that what we have now are
> JSON and Python tests, that leaves the question of how to invoke
> the pure-JS tests in Windmill, and how to report results.
>
> I'm a Web programmer, so the natural comparison that comes to my
> mind is HTML markup and programming code in a Web app. Sometimes
> it's more appropriate to embed small scraps of code in your markup,
> a la PHP/ERuby/PSP/JSP. Sometimes it's more appropriate to have
> small bits of markup in a bunch of code (mod_python Publisher, Java
> Servlets).
>
> Ideally, I think we'd like to give people a similar choice with the
> JS tests in Windmill:
>
> 1. Pre-load all the JS tests, and have some syntax to invoke
> specific tests from inside JSON/Python tests.
>
> 2. Run JS tests, and have some syntax we can use inside them to
> manipulate the UI the way the current JSON/Python tests do. (Maybe
> some kind of adapter and JS objects in the code that look just like
> the currently defined JSON tests?)
>
> Thoughts?
>
>
> Matthew
>
>
> _______________________________________________
> Windmill-dev mailing list
> Windmill-dev at osafoundation.org
> http://lists.osafoundation.org/mailman/listinfo/windmill-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osafoundation.org/pipermail/windmill-dev/attachments/20070825/a16dd7b9/attachment.html
More information about the Windmill-dev
mailing list