[twill] Testing a web API with twill?

Stephen Thorne stephen at netboxblue.com
Mon Apr 9 21:03:01 PDT 2007

On 2007-04-09, Titus Brown wrote:
> -> I'm trying to find a web unit and load testing tool that will let me
> -> test URL-based APIs. This is basically a parameterized URL that will
> -> return JSON-encoded results. I would like to be able to easily set up
> -> 100+ test cases that are all test the same API, but with different URL
> -> parameter values and different expected results. I would to be able to
> -> flexibly configure these test cases, ideally as a text table or other
> -> simple-to-create-and-parse data structure, and generate a report of
> -> pass/fail cases for each test. 
> -> 
> -> I would really like to use something like twill, but I'm getting stuck
> -> on 2 fronts:
> -> 
> -> 1.	How to configure a single test case. The key here is that to
> -> check for valid results I need to unserialize the json returned result.
> -> Twill obviously doesn't have this built in, so I assume I will have to
> -> call a twill script from python and then record its results for
> -> subsequent processing. Is that right? Should the calling code itself
> -> then be part of a unit testing framework?
> -> 2.	How to configure the series of test cases. I would like to avoid
> -> writing a separate test class / function for each case, and instead
> -> somehow iterate over the param/result pairs. I can't figure out how to
> -> do this without having the entire suite abort after the first test
> -> failure. I would like to run all 100 tests, and have it report back
> -> which ones succeeded and which ones failed.
> Hey Ramon,
> I think a combination of twill and nose would work quite well.

nose is very similar to py.test, which I have had great success writing
unit tests with.

Here's some blogging I did on the subject some time ago:

Also, here's a quick example of how to go about dealing with the contents of a
page directly, this is using py.test:

from twill import commands

def setup_module(mod):

class TestSetOption(object):
    def test_get_primary_email(self):
        self.compare_csv([['value'], ['foo at bar.com']])

    def compare_csv(self, expected):
        body = commands.get_browser().get_html()
        data = list(csv.reader(StringIO(body), csv.excel_tab))
        assert data == expected

py.test is available as part of py-lib from codespeak.net. I'm not sure
if they have a 'stable' release, I run it from svn... It's similar to
nose anyway, and the same concepts apply.

Stephen Thorne
Development Engineer

Scanned by the NetBox from NetBox Blue

More information about the twill mailing list