Diff for "Windmill"

Not logged in - Log In / Register

Differences between revisions 3 and 14 (spanning 11 versions)
Revision 3 as of 2009-02-23 13:54:40
Size: 2485
Editor: mars
Comment:
Revision 14 as of 2009-05-05 17:54:58
Size: 4307
Editor: edwin-grubbs
Comment:
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:
== Setting up Windmill == <<TableOfContents()>>

== Using Windmill to Test Launchpad ==

=== Setting up Windmill ===
Line 11: Line 15:
== How is Windmill integrated? == === Running the Launchpad Windmill test suite ===
Line 23: Line 27:
$ ./lp-windmill.py -t lib/canonical/launchpad/windmill/tests firefox http://launchpad.dev:8085 $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests firefox http://launchpad.dev:8085
Line 26: Line 30:
   '''Note that it is not currently possible to run all the tests like that because of a bug/limitation in Windmill.'''     '''Note that it is not currently possible to run all the tests like that because of a bug/limitation in Windmill.'''
Line 30: Line 34:
$ ./lp-windmill.py -t lib/canonical/launchpad/windmill/tests/test_bugs firefox http://bugs.launchpad.dev:8085 $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests/test_bugs firefox http://bugs.launchpad.dev:8085
Line 36: Line 40:
$ ./lp-windmill.py -t lib/canonical/launchpad/windmill/tests/test_registry firefox http://launchpad.dev:8085 $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests/test_registry firefox http://launchpad.dev:8085
Line 46: Line 50:
The Windmill driver script, `windmill.py`, is located under the `utilities/` directory. Using it, you can start an interactive shell and run the tests without the overhead of setting up and tearing down Launchpad. The Windmill driver script, `windmill.py`, is located under the `utilities/` directory. Using it, you can start an interactive shell to run tests without setting up and tearing down Launchpad repeatedly:
Line 52: Line 56:
That way you can restart windmill, without having to wait for the Launchpad
restart cycle.
Line 70: Line 72:
== External resources ==
= Test Writing Tips =

 * Test the Happy Path, and one or two error paths
 * Edge cases are best pushed into the unit tests
 * Setup and teardown are expensive, so there will be a trend towards testing more per test
 * Prefer element ids to XPath for locating page elements
   * XPath makes your tests brittle and dependent on page structure
 * Try to pull test actions out into their own functions, creating a Python Windmill testing [[http://en.wikipedia.org/wiki/Domain-specific_programming_language|DSL]]
 * Use the [[http://code.google.com/p/webdriver/wiki/PageObjects|PageObject pattern]] to encapsulate the actions available through specific pages
 * '''Error: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" ''' -- you likely started your windmill shell using the wrong hostname, ie. `launchpad.dev` instead of `bugs.launchpad.dev`

= External resources =
Line 73: Line 87:
 * [[http://www.slideshare.net/alexchaffee/fullstack-webapp-testing-with-selenium-and-rails|Full-stack webapp testing with Selenium and Rails]] - has a number of tips that apply to any automated testing framework

= Troubleshooting =

 * If you are running on a slow computer or inside a VM, you may randomly trigger timeout errors.
 * In the Windmill IDE window, you can test windmill's ability to find objects by going to the Tools menu (not the Firefox Tools menu) and clicking on "Firebug Lite". In Firebug Lite, you will be able to call the lookupNode() function with the same locator parameters that windmill uses. For example:
   * {{{ lookupNode( {classname: 'yui-picker'} ) }}}
   * {{{ lookupNode( {xpath: '//table[@id=foo]//button'} ) }}}
   * [[http://trac.getwindmill.com/wiki/ControllerApi|Locator Docs]]

----
CategoryJavaScript CategoryTesting

Windmill for JS Integration Tests

For integration testing that covers JS workflows, our tool of choice is Windmill.

Using Windmill to Test Launchpad

Setting up Windmill

Windmill is included in the Launchpad source tree.

Running the Launchpad Windmill test suite

There is a script called lp-windmill.py in the top-level directory. This is a wrapper around the windmill main script which starts a Launchpad server on port 8085 locally with a fresh database (including all of the standard tests sample data).

The windmill process is then fired off with the command line argument.

So if you want to run all the tests you'd typically use:

  • $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests firefox http://launchpad.dev:8085

    Note that it is not currently possible to run all the tests like that because of a bug/limitation in Windmill. You need to run each tests starting at the correct vhost. So for bugs tests, you'd use:

    $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests/test_bugs firefox http://bugs.launchpad.dev:8085
    and for registry, you'd use:
    $ ./lp-windmill.py test=lib/canonical/launchpad/windmill/tests/test_registry firefox http://launchpad.dev:8085

For interactive test running and development, it's usually more convenient to run the Launchpad server separately:

  • $ ./lp-windmill.py --server-only

The Windmill driver script, windmill.py, is located under the utilities/ directory. Using it, you can start an interactive shell to run tests without setting up and tearing down Launchpad repeatedly:

  • $ ./utilities/windmill.py shell firefox http://launchpad.dev:8085

See the help page on the shell environment.

How are the tests organized

Tests written in python are rooted at lib/canonical/launchpad/windmill/tests.

Tests are divided by applications and then subdivided by workflows.

Tests using the JS API are in lib/canonical/launchpad/windmill/jstests.

Test Writing Tips

  • Test the Happy Path, and one or two error paths
  • Edge cases are best pushed into the unit tests
  • Setup and teardown are expensive, so there will be a trend towards testing more per test
  • Prefer element ids to XPath for locating page elements
    • XPath makes your tests brittle and dependent on page structure
  • Try to pull test actions out into their own functions, creating a Python Windmill testing DSL

  • Use the PageObject pattern to encapsulate the actions available through specific pages

  • Error: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" -- you likely started your windmill shell using the wrong hostname, ie. launchpad.dev instead of bugs.launchpad.dev

External resources

Troubleshooting

  • If you are running on a slow computer or inside a VM, you may randomly trigger timeout errors.
  • In the Windmill IDE window, you can test windmill's ability to find objects by going to the Tools menu (not the Firefox Tools menu) and clicking on "Firebug Lite". In Firebug Lite, you will be able to call the lookupNode() function with the same locator parameters that windmill uses. For example:
    •  lookupNode( {classname: 'yui-picker'} ) 

    •  lookupNode( {xpath: '//table[@id=foo]//button'} ) 

    • Locator Docs


CategoryJavaScript CategoryTesting

Windmill (last edited 2011-09-23 13:49:05 by gary)