You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by Jim Gallacher <jp...@jgassociates.ca> on 2006/03/30 16:02:23 UTC

Re: Grouping tests

This isn't too different from what I have in mind, except that my main 
testrunner.py script uses introspection to discover the tests. Adding a 
new test set won't require editing testrunner at all. The testrunner 
will also filter the tests according to certain criteria, such as mpm or 
os, so that tests for a specific platform are automatically selected.

More later.

Jim


Mike Looijmans wrote:
> What I have been doing in a totally unrelated Python project is to 
> create test groups simply by putting them into separate modules. The 
> main test module test.py looks like this:
> 
> ## (test.py)
> import unittest
> from test_something import *
> from test_someother import *
> from test_yetmore import *
> if __name__ == '__main__':
>     unittest.main(module=__import__(__name__))
> ##
> 
> This works because unittest takes all 'things' that start with 'test' in 
> the provided module and runs them. So anything we bring into our 
> namespace gets run. This also makes it possible to import tests from 
> other projects, and share these tests between projects.
> The other test_ modules look much alike:
> 
> ## (test_something.py)
> import unittest
> import test_peer
> class test04MultiPeerSystem(test_peer.BaseTestRealThing):
>     def test03DiscoveryC08B20(self):
>         "Multiple clients w/ discovery:  8 peers, 20 blocks each"
>         self.runDiscoveryTest(nclients = 8, nblocks=20)
> if __name__ == '__main__':
>     unittest.main(module=__import__(__name__))
> ##
> 
> This makes it very easy to handle test subsets, and run single test 
> suites. Just run
> 
> $python test.py
> 
> to run ALL the tests. To run just a single set, run
> 
> $python test_something.py
> 
> And to run a single test, either of these will do:
> 
> $python test_something.py test04MultiPeerSystem
> $python test.py test04MultiPeerSystem
> 
> The real power shows when you want to run 4 or 5 test sets, and/or only 
> parts of some test sets. Just create a new "main" test unit that imports 
> the desired ones, and you're set:
> 
> ## (test_few.py)
> import unittest
> from test_something import *
> from test_someother import TestOnlyThis
> if __name__ == '__main__':
>     unittest.main(module=__import__(__name__))
> ##
> 
> Because some tests take very long to run (in my vocabulary, "long" means 
> more than a second), this saves me a lot of time when working on a part 
> of a big project, where I don't need to run all tests all the time.
> 
> -- 
> Mike Looijmans
> Philips Natlab / Topic Automation
> 
> 
> Jim Gallacher wrote:
> ...
> 
>> I've been playing with some ideas for a new test framework, using a 
>> subclass of unittest.TestLoader to find and configure tests. I want to 
>> play around with it for another day or so before sharing but at this 
>> point I'm pretty confident it'll work.
>>
>> Creating a new set of tests could be as simple as:
>>
>> testsuites/core/simpletest.py
>> ----------------------------
>>
>> from testlib import VirtualHostTest
>>
>> class MyTests(VirtualHostTest):
>>     def test_hello_world(self):
>>         rsp = self.send_request()
>>         self.failUnless(rsp == 'test ok')
>>
>>     def test_goodbye_world(self):
>>         rsp = self.send_request()
>>         self.failUnless(rsp == 'test ok')
>>
>>
>> htdocs/testhandlers/core/simpletest.py
>> --------------------------------------
>>
>> from mod_python import
>>
>> def test_hello_world(req):
>>     req.write('test ok')
>>     return apache.OK
>>
>> def test_goodbye_world(req):
>>     req.write('test ok')
>>     return apache.OK
>>
>> $ python testrunner.py
>>
>> Things like virtual host names and handler directives required for 
>> configuration or send_request() are automatically derived from the 
>> test class and test method names. It will still be possible to provide 
>> custom apache configuration directives in a manner similar to that 
>> which we currently use, but for most tests this will not be required.
>>
>> Usage would look something like this:
>>
>> Run all the tests
>> $ python testrunner.py
>>
>> Run one test
>> $ python testrunner.py -t core.simpletest.MyTests.test_hello_world
>>
>> Run a group of tests (this would load the TestCase subclasses in 
>> testsuites/sessions/filesession.py):
>>
>> $ python testrunner.py -t sessions.filesession
>>
>>
>> Jim
> 
> 
>