[py-dev] Testing publish-subscribe apps
holger krekel
holger at merlinux.de
Sun Feb 18 14:39:05 CET 2007
Hi Michael,
On Fri, Feb 16, 2007 at 21:58 -0600, Michael Hipp wrote:
> In my previous question I asked about testing applications that use a
> publish-subscribe mechanism. I've done a simple app and tester to prove I can
> make it work. I'm posting it here in case it might help someone else. I'd also
> like to invite critique as this is my first attempt at using py.test. (I'll be
> doing a *lot* of this when I test my real application.)
>
> Thanks,
> Michael
>
> --- The app being tested --------------------------------
> # FILE: myapp.py
>
> from wx.lib.pubsub import Publisher
>
> myTestTopic = "my_test_topic" # A publisher topic
>
> def DoSomething():
> # Send a message with a tuple of data
> Publisher.sendMessage(myTestTopic, (1,2,3))
> --- The app being tested --------------------------------
> # FILE: test_myapp.py
>
> from wx.lib.pubsub import Publisher # wxPython publish-subscribe module
> from myapp import DoSomething, myTestTopic # myapp.py
>
> # If someone can tell me how to not need these module-level
> # globals I'm all ears
> gotTestTopic = False # Indicates we received the test topic message
> testTopicData = None # The data we got with the test topic message
>
> def setup_module(module):
> '''This sets certain state specific to the execution of this module.'''
> # Subscribe to the test topic message
> Publisher.subscribe(TestTopicReceiver, myTestTopic)
a few notes:
* i have no clue about wxpython :)
* I prefer to have test and code-being-tested separate from
each other, so myTestTopic would be better to live in the
testfile.
* i guess you can avoid module globals by using test classes
(see e.g. http://codespeak.net/py/dist/test.html#id17)
maybe something like (untested):
class TestMyApp:
def setup_method(self, method):
self.topic = "my_test_topic" # + method.__name__
self.received = []
Publisher.subscribe(self.topic, self.received.append)
def teardown_method(self, method):
# don't know if wx has it:
Publisher.unsubscribe(self.topic, self.received.append)
def test_dosomething(self):
assert not self.received
DoSomething()
assert len(self.received) == 1
msg = self.received[0]
assert msg.topic == self.topic
assert len(msg.data) == 3 # and so one
hope it helps, have fun,
holger
> def test_DoSomething():
> assert not gotTestTopic # Make sure there is no trickery
> assert testTopicData is None
> DoSomething() # This is "myapp"
> assert gotTestTopic # Now we should have it
> assert len(testTopicData) == 3 # Verify the data also
>
> def TestTopicReceiver(msg):
> '''Receives the test topic message and sets global vars to be read in
> the test routine.'''
> global gotTestTopic, testTopicData
> if msg.topic[0] == myTestTopic: # Make sure it's really our topic
> gotTestTopic = True
> testTopicData = msg.data # The data payload in the msg
>
> --- End ----
> _______________________________________________
> py-dev mailing list
> py-dev at codespeak.net
> http://codespeak.net/mailman/listinfo/py-dev
>
--
merlinux GmbH Steinbergstr. 42 31139 Hildesheim
http://merlinux.de tel +49 5121 20800 75 (fax 77)
More information about the Pytest-dev
mailing list