Functional testing of export/import?
I'm trying to write a functional test that verifies that an instance of my Product works correctly after it's been exported and re-imported. I'm stuck on how to give the test object a valid _p_oid which is needed to do the export. Background: This Product is a dynamic content object for CMF. Its behavior depends on another CMF type instances, which it keeps a path to. So I need to ensure that things work even when one or both objects have moved. I've got moving & renaming handled well and now I want to test import/export. So my test suite sets up a dummy CMF instance. I do this by swiping stuff from the CMFCore and CMFDefault tests; I subclass SecurityRequestTest and then do manage_addCMFSite(self.root, 'cmf_test_site' ) self.site = self.root.cmf_test_site I've also got a portal folder in the site which I keep a handy reference to as self.fol1. All tests are passing, now I move on to writing the export / import tests. Let's say the object I want to export is self.cmf_test_site.fol1.cp1. I have a shorthand reference to this stored as self.cp1. So I think the first thing I need to do is get the export data like this: data self.fol1.manage_exportObject('cp1', download=1) ... and once that works, I'll use the same data to do an import. But the export fails. Using pdb and browsing some source I've learned that cp1 needs a _p_jar and _p_oid in order to be exported. The _p_jar I've already dealt with in my move / rename tests, by swiping a hack from CMFCore/tests/test_portalFolder.py: id = self.cp1.getId() # WAAAA! must get _p_jar set old, self.cp1._p_jar = self.cp1._p_jar, self.root._p_jar try: data = self.fol1.manage_exportObject(id, download=1) finally: self.cp1._p_jar = old That seems to work fine. But now I'm stuck on _p_oid. How do I give the object a valid one? I'm sure I can't just use the same trick and swipe the _p_oid of the app root :-P I must say that using pyunit to write functional tests for zope 2 / CMF is a royal pain. It requires too much knowledge of implementation. (why should i need to worry about _p_foo???) Also I've found that if there's an error in your class' setUp(), it can cause the test to hang and never show you a traceback. -- Paul Winkler http://www.slinkp.com
You can usually commit a subtransaction to get a _p_jar and oid (I think) set. You can still abort this at the end of the test to clean up. hth, -Casey On Monday 28 July 2003 12:39 pm, Paul Winkler wrote:
I'm trying to write a functional test that verifies that an instance of my Product works correctly after it's been exported and re-imported. I'm stuck on how to give the test object a valid _p_oid which is needed to do the export.
Background: This Product is a dynamic content object for CMF. Its behavior depends on another CMF type instances, which it keeps a path to. So I need to ensure that things work even when one or both objects have moved. I've got moving & renaming handled well and now I want to test import/export.
So my test suite sets up a dummy CMF instance. I do this by swiping stuff from the CMFCore and CMFDefault tests; I subclass SecurityRequestTest and then do
manage_addCMFSite(self.root, 'cmf_test_site' ) self.site = self.root.cmf_test_site
I've also got a portal folder in the site which I keep a handy reference to as self.fol1.
All tests are passing, now I move on to writing the export / import tests.
Let's say the object I want to export is self.cmf_test_site.fol1.cp1. I have a shorthand reference to this stored as self.cp1. So I think the first thing I need to do is get the export data like this: data self.fol1.manage_exportObject('cp1', download=1)
... and once that works, I'll use the same data to do an import.
But the export fails. Using pdb and browsing some source I've learned that cp1 needs a _p_jar and _p_oid in order to be exported. The _p_jar I've already dealt with in my move / rename tests, by swiping a hack from CMFCore/tests/test_portalFolder.py:
id = self.cp1.getId()
# WAAAA! must get _p_jar set old, self.cp1._p_jar = self.cp1._p_jar, self.root._p_jar try: data = self.fol1.manage_exportObject(id, download=1) finally: self.cp1._p_jar = old
That seems to work fine.
But now I'm stuck on _p_oid. How do I give the object a valid one? I'm sure I can't just use the same trick and swipe the _p_oid of the app root :-P
I must say that using pyunit to write functional tests for zope 2 / CMF is a royal pain. It requires too much knowledge of implementation. (why should i need to worry about _p_foo???) Also I've found that if there's an error in your class' setUp(), it can cause the test to hang and never show you a traceback.
--
Paul Winkler http://www.slinkp.com
_______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org http://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope )
On Mon, Jul 28, 2003 at 02:49:33PM -0400, Casey Duncan wrote:
You can usually commit a subtransaction to get a _p_jar and oid (I think) set. You can still abort this at the end of the test to clean up.
yep, this seems to work very nicely! Thanks Casey! def setUp(self): ... get_transaction().commit(1) ... def tearDown(self): ... get_transaction().abort(1) ... -- Paul Winkler http://www.slinkp.com Look! Up in the sky! It's EXTRA YELLOW BLOWER CHEESEMONGER! (random hero from isometric.spaceninja.com)
... just a random remark: [...]
Also I've found that if there's an error in your class' setUp(), it can cause the test to hang and never show you a traceback.
I have run into a similar problem; this seems to be caused by the (usually reasonable) behaviour of the pyunit not to call the "tearDown" method of a test faiming in "setUp". Unfortunately in the context of unittesting Zope this results in a pending connection if the connection happends after the "get_transaction().begin()". After few tests, all availabe connections seems to be busy and the test hang. I have been able to fix this for my local tests by surrounding the code in the setUp with an 'try: ... excecpt:" block, where the "except:" block aborts the transaction before reraising the exception. This fixes the issue with the hang; one gets plain tracebacks telling what went wrong in the setUp. Looking at the more sophisticated structure of the CMF-tests this may be a bit tricky to apply this patch there. Cheers, Clemens
participants (3)
-
Casey Duncan -
Clemens Robbenhaar -
Paul Winkler