pyunit-interest Mailing List for PyUnit testing framework (Page 5)
Brought to you by:
purcell
You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(12) |
Jun
(16) |
Jul
(6) |
Aug
|
Sep
(3) |
Oct
(7) |
Nov
(4) |
Dec
(6) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
|
Feb
(11) |
Mar
(7) |
Apr
(50) |
May
(9) |
Jun
(5) |
Jul
(33) |
Aug
(9) |
Sep
(7) |
Oct
(7) |
Nov
(17) |
Dec
(4) |
2002 |
Jan
(8) |
Feb
|
Mar
(14) |
Apr
(9) |
May
(13) |
Jun
(30) |
Jul
(13) |
Aug
(14) |
Sep
|
Oct
|
Nov
(2) |
Dec
(11) |
2003 |
Jan
(8) |
Feb
(3) |
Mar
(6) |
Apr
(5) |
May
(15) |
Jun
(5) |
Jul
(8) |
Aug
(14) |
Sep
(12) |
Oct
(1) |
Nov
(2) |
Dec
(1) |
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
(3) |
Jul
(4) |
Aug
(4) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
2005 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
2006 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(5) |
2007 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
2010 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Timothy G. <tj...@cr...> - 2002-12-19 04:05:08
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Just curious why when tests are run the entire doc string is not printed? I almost feel as if I would do better naming my testXXXX methods with the full name of the test instead. - -- Stand Fast, tjg. Timothy Grant www.craigelachie.org -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.1 (GNU/Linux) iD8DBQE+AUVsI/KcrH1qjlsRAt7sAJ0eGxsh84tKh4SRdnTMabltsW4tOwCgnkSj HHgqU4/VE9vxV1+opBylnzU= =HYbx -----END PGP SIGNATURE----- |
From: Luciano R. <lg...@uo...> - 2002-12-17 19:08:38
|
In Python, the parenthesis are used to denote tuples, which are=20 immutable lists. But because they are also used in expressions, there=20 is a quirk: if your tuple has only one element, Python can't tell the=20 difference from an expression. To let Python know what you mean, you=20 need to add a comma inside the parenthesis, like this: > modules_to_test =3D ('widgettests', ) So, ('x') is a string expression equal to 'x'. But ('x',) is a tuple with containing one element, which happens to be=20= a string. Regards, Luciano On ter=E7a-feira, dezembro 17, 2002, at 04:09 PM, Jean Czerlinski wrote: > I am writing to suggest a minor-- but important-- > improvement in the file alltests.py file in the > examples folder. > > The modules_to_test should be a true list with square > brackets. As it is, if you have just one module, the > map function following it will iterate over the > letters in the string that is the module name rather > than seeing it as a list with one string element. For > example, > > modules_to_test =3D ('widgettests') > map(__import__, modules_to_test) > > results in the error > > ImportError: No module named w > > The original code and my suggested change are shown > below. > > By the way, is my terminology correct? What do you > call it with the curved brackets? > > Thanks, > > Jean > > ------------------------------------------------ > original code for alltests.py > > import unittest > > def suite(): > modules_to_test =3D ('listtests', 'widgettests') # > and so on > alltests =3D unittest.TestSuite() > for module in map(__import__, modules_to_test): > > alltests.addTest(unittest.findTestCases(module)) > return alltests > > if __name__ =3D=3D '__main__': > unittest.main(defaultTest=3D'suite') > > ------------------------------------------------ > improved code for alltests.py > > import unittest > > def suite(): > modules_to_test =3D ['listtests', 'widgettests'] # > and so on <=3D=3D=3D change is here: square brackets > instead of rounded > alltests =3D unittest.TestSuite() > for module in map(__import__, modules_to_test): > > alltests.addTest(unittest.findTestCases(module)) > return alltests > > if __name__ =3D=3D '__main__': > unittest.main(defaultTest=3D'suite') > > __________________________________________________ > Do you Yahoo!? > Yahoo! Mail Plus - Powerful. Affordable. Sign up now. > http://mailplus.yahoo.com > > > ------------------------------------------------------- > This sf.net email is sponsored by: > With Great Power, Comes Great Responsibility > Learn to use your power at OSDN's High Performance Computing Channel > http://hpc.devchannel.org/ > _______________________________________________ > Pyunit-interest mailing list > Pyu...@li... > https://lists.sourceforge.net/lists/listinfo/pyunit-interest > |
From: Jean C. <j4...@ya...> - 2002-12-17 18:09:07
|
I am writing to suggest a minor-- but important-- improvement in the file alltests.py file in the examples folder. The modules_to_test should be a true list with square brackets. As it is, if you have just one module, the map function following it will iterate over the letters in the string that is the module name rather than seeing it as a list with one string element. For example, modules_to_test = ('widgettests') map(__import__, modules_to_test) results in the error ImportError: No module named w The original code and my suggested change are shown below. By the way, is my terminology correct? What do you call it with the curved brackets? Thanks, Jean ------------------------------------------------ original code for alltests.py import unittest def suite(): modules_to_test = ('listtests', 'widgettests') # and so on alltests = unittest.TestSuite() for module in map(__import__, modules_to_test): alltests.addTest(unittest.findTestCases(module)) return alltests if __name__ == '__main__': unittest.main(defaultTest='suite') ------------------------------------------------ improved code for alltests.py import unittest def suite(): modules_to_test = ['listtests', 'widgettests'] # and so on <=== change is here: square brackets instead of rounded alltests = unittest.TestSuite() for module in map(__import__, modules_to_test): alltests.addTest(unittest.findTestCases(module)) return alltests if __name__ == '__main__': unittest.main(defaultTest='suite') __________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com |
From: Timothy G. <tj...@cr...> - 2002-12-11 16:13:52
|
Thanks Noah, I think I might be able to make that work. The situation is this, I'm working on some code that while broken will raise an AttributeError Exception. I want to make a FAILED test, right now I get an ERROR test. Problem is, I only want to check for an AttributeError, cause other Exceptions should cause and ERROR test not a FAILED test. On Wed, 2002-12-11 at 06:47, Noah Spurrier wrote: > I'm not sure if I read your question right, but the follow code is > what I use to test for an exception NOT being raised. >=20 >=20 > class MissingExceptionTestCase (unittest.TestCase): > def testMissingException (self): > try: > do_something_stupid_that_should_raise_an_exception () > except Exception: > pass > else: > self.fail ('An Exception was expected, but it was not raised.= This is bad.') >=20 >=20 > Yours, > Noah >=20 > ----- Original Message -----=20 > From: "Timothy Grant" <tj...@cr...> > To: <pyu...@li...> > Sent: Tuesday, December 10, 2002 10:07 PM > Subject: [Pyunit-interest] Assert that an Exception is NOT raised. >=20 >=20 >=20 --=20 Stand Fast, tjg. Timothy Grant www.craigelachie.org |
From: Noah S. <no...@no...> - 2002-12-11 15:02:44
|
I'm not sure if I read your question right, but the follow code is what I use to test for an exception NOT being raised. class MissingExceptionTestCase (unittest.TestCase): def testMissingException (self): try: do_something_stupid_that_should_raise_an_exception () except Exception: pass else: self.fail ('An Exception was expected, but it was not raised. This is bad.') Yours, Noah ----- Original Message ----- From: "Timothy Grant" <tj...@cr...> To: <pyu...@li...> Sent: Tuesday, December 10, 2002 10:07 PM Subject: [Pyunit-interest] Assert that an Exception is NOT raised. |
From: Timothy G. <tj...@cr...> - 2002-12-11 08:40:03
|
Dang, I write my tests, then start writing code. I use the ratio of Error to Failure to know how well I'm doing in my quest to get things right. I mostly ignore the errors until I get the Failures taken care of then move on to the next Failure. In fact, I usually stub out methods and functions in my implementation with a raise NotImplementedError before I actually go back and right my code. That way I don't forget anything and I get a nice skeleton to hang my code on. On Tue, 2002-12-10 at 22:13, Fred L. Drake, Jr. wrote: >=20 > Timothy Grant writes: > > I'm pretty new to PyUnit, one of the things I think is neat is that > > there's a difference between test Failures and Errors. The problem is,= I > > want to assert that an Exception is NOT raised, but the test fails wit= h > > an Error because an Exception is raised. > >=20 > > Is there something like assertDoesNotRaise(ExceptionClass)? >=20 > I'm afraid I've never found the distinction very useful in practice. > Whether something is reported as a failure or an error, I need to fix > a bug somewhere, and that's really the issue. >=20 >=20 > -Fred >=20 > --=20 > Fred L. Drake, Jr. <fdrake at acm.org> > PythonLabs at Zope Corporation >=20 --=20 Stand Fast, tjg. Timothy Grant www.craigelachie.org |
From: Fred L. D. Jr. <fd...@ac...> - 2002-12-11 06:13:43
|
Timothy Grant writes: > I'm pretty new to PyUnit, one of the things I think is neat is that > there's a difference between test Failures and Errors. The problem is, I > want to assert that an Exception is NOT raised, but the test fails with > an Error because an Exception is raised. > > Is there something like assertDoesNotRaise(ExceptionClass)? I'm afraid I've never found the distinction very useful in practice. Whether something is reported as a failure or an error, I need to fix a bug somewhere, and that's really the issue. -Fred -- Fred L. Drake, Jr. <fdrake at acm.org> PythonLabs at Zope Corporation |
From: Timothy G. <tj...@cr...> - 2002-12-11 06:07:55
|
I'm pretty new to PyUnit, one of the things I think is neat is that there's a difference between test Failures and Errors. The problem is, I want to assert that an Exception is NOT raised, but the test fails with an Error because an Exception is raised. Is there something like assertDoesNotRaise(ExceptionClass)? --=20 Stand Fast, tjg. Timothy Grant www.craigelachie.org |
From: Steve P. <ste...@ya...> - 2002-11-24 09:52:38
|
Hi Markus, The PyUnit CVS version should work just fine with Python 2.2.2. Probably you should put it in a separate directory and place it in your library path rather than copy it over the standard library version. Best wishes, -Steve On Friday 22 November 2002 23:49, Markus Jais wrote: > hello > > just intalled python 2.2.2 > and there is unittest.py version 1.43 > > I just checked out the latest cvs for pyunit > with version 1.46 for unittest.py > > can I just copy version 1.46 from the cvs to > /usr/local/lib/python2.2 > > or do I have to install more stuff ?? > > thanks in advance for any answer > > markus |
From: Markus J. <mar...@ya...> - 2002-11-22 22:48:12
|
hello just intalled python 2.2.2 and there is unittest.py version 1.43 I just checked out the latest cvs for pyunit with version 1.46 for unittest.py can I just copy version 1.46 from the cvs to /usr/local/lib/python2.2 or do I have to install more stuff ?? thanks in advance for any answer markus __________________________________________________________________ Gesendet von Yahoo! Mail - http://mail.yahoo.de Yahoo! präsentiert als offizieller Sponsor das Fußball-Highlight des Jahres: - http://www.FIFAworldcup.com |
From: <gt...@ca...> - 2002-08-19 16:19:51
|
PGh0bWw+DQo8eC10YWI+DQoNCjxoZWFkPg0KPC9oZWFkPg0KDQo8cCBhbGlnbj0iY2VudGVyIj4N CjxiPjxhIGhyZWY9Im1haWx0bzpndHRzMUBjYWJsZS5uZXQuY28iPjxmb250IGNvbG9yPSIjMDAw MDgwIiBzaXplPSIzIiBmYWNlPSJBcmlhbCI+R1QgVE9ORVINClNVUFBMSUVTPGJyPkxhc2VyIHBy aW50ZXIgYW5kIGNvbXB1dGVyIHN1cHBsaWVzPGJyPg0KICAxLTg2Ni0yMzctNzM5NzwvZm9udD48 L2E+PC9iPg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCjxpbWcgYm9yZGVyPSIwIiANCnNyYz0iaHR0 cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9xPXRibjp0R2kyNWJCR000b0M6ZGF0YWRldmlj ZXMuaG9tZS5taW5kc3ByaW5nLmNvbS80MDAwcHJpbnRlci5qcGciIHdpZHRoPSI4MSIgDQpoZWln aHQ9IjY5Ij4NCjxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9pbWFnZXMuZ29vZ2xlLmNvbS9p bWFnZXM/cT10Ym46WW9BdDRyVG1aOHNDOnd3dy5jYXJ0cmlkZ2UtZmlsbC5jby51ay9ncm9vcHBy aW50ZXIuZ2lmIiANCndpZHRoPSI4MSIgaGVpZ2h0PSI2OSI+DQo8cD4NCjxiPjxpPjxmb250IGNv bG9yPSIjODA4MDAwIiBmYWNlPSJBcmlhbCIgc2l6ZT0iNCI+U2F2ZSB1cCB0byA0MCUgZnJvbSBy ZXRhaWwgcHJpY2Ugb24gbGFzZXIgcHJpbnRlciB0b25lcg0KY2FydHJpZGdlcyw8YnI+DQpjb3Bp ZXIgYW5kIGZheCBjYXJ0cmlkZ2VzLjwvZm9udD48L2k+DQo8L2I+IDwvcD4NCjxwPg0KPGI+PGk+ PGEgaHJlZj0iI3ByaWNlcyI+PGZvbnQgZmFjZT0iQ29taWMgU2FucyBNUyIgc2l6ZT0iMyIgY29s b3I9IiMwMDAwRkYiPkNIRUNLIE9VVCBPVVIgR1JFQVQNClBSSUNFUyE8L2ZvbnQ+PC9hPjwvaT4N CjwvYj4gPC9wPg0KPHA+PGI+PGk+PGZvbnQgY29sb3I9IiM4MDAwMCIgc2l6ZT0iMyIgZmFjZT0i Q29taWMgU2FucyBNUyI+SWYgeW91IHJlY2VpdmVkIHRoaXMgZW1haWwgb24gZXJyb3IsIHBsZWFz ZSByZXBseSB0byANCmd0dHMxQGNhYmxlLm5ldC5jbyB3aXRoIHN1YmplY3Q6IFJFTU9WRS4uLiBz b3JyeSBmb3IgdGhlIGluY29udmVuaWVuY2UuDQo8cD48Yj48aT48Zm9udCBjb2xvcj0iIzgwODAw MCIgc2l6ZT0iNCIgZmFjZT0iQXJpYWwiPlBsZWFzZSBmb3J3YXJkIHRvIHRoZSBwZXJzb24gcmVz cG9uc2libGUgZm9yIHB1cmNoYXNpbmcgeW91ciBsYXNlciANCnByaW50ZXINCnN1cHBsaWVzLjwv Zm9udD48L2k+DQo8L3A+DQo8cD48Zm9udCBmYWNlPSJBcmlhbCIgc2l6ZT0iMiI+PGZvbnQgY29s b3I9IiM4MDgwMDAiPjx4LXRhYj4mbmJzcDsmbmJzcDsmbmJzcDsgT3JkZXIgYnkNCnBob25lOiAo dG9sbCBmcmVlKSAxLTg2Ni0yMzctNzM5Nw0KPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDgwIj4g PGJyPg0KPC9mb250Pg0KPC9wPg0KPC9mb250Pjxmb250IGNvbG9yPSIjODA4MDAwIj48eC10YWI+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IE9yZGVyIGJ5IGVtYWlsOiA8L2ZvbnQ+DQo8L2ZvbnQ+DQo8Zm9u dCBjb2xvcj0iIzAwMDBGRiIgZmFjZT0iQXJpYWwiIHNpemU9IjMiPlNpbXBseSByZXBseTwvZm9u dD48Zm9udCBjb2xvcj0iIzAwMDA4MCI+IHRoaXMgbWVzc2FnZSBvciA8L2ZvbnQ+PGEgDQpocmVm PSJtYWlsdG86Z3R0czFAY2FibGUubmV0LmNvIj48Zm9udCBjb2xvcj0iIzAwMDBGRiIgZmFjZT0i QXJpYWwiIHNpemU9IjMiPmNsaWNrIGhlcmU8L2ZvbnQ+PC9hPjxmb250IGZhY2U9IkFyaWFsIiAN CnNpemU9IjIiPjxmb250IGNvbG9yPSIjODA4MDAwIj4mbmJzcDsNCndpdGggc3ViamVjdDogPC9m b250Pjxmb250IGNvbG9yPSIjMDAwMDgwIj4gT1JERVI8L2ZvbnQ+DQo8L2ZvbnQ+DQo8L3A+DQo8 cD48Zm9udCBmYWNlPSJBcmlhbCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9mb250PjwvYj4gPGZvbnQg ZmFjZT0iQXJpYWwiPiA8Yj4gPGZvbnQgc2l6ZT0iMiI+IDxmb250IGNvbG9yPSIjODA4MDAwIj5F bWFpbA0KcmVtb3ZhbDogPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDgwIj5TaW1wbHkgcmVwbHkg dGhpcyBtZXNzYWdlIG9yIDwvZm9udD4NCjwvZm9udD4NCjxhIGhyZWY9Im1haWx0bzpndHRzMUBj YWJsZS5uZXQuY28iPjxmb250IHNpemU9IjMiIGNvbG9yPSIjMDAwMEZGIj5jbGljayBoZXJlPC9m b250PjwvYT4gPGZvbnQgc2l6ZT0iMiI+IDxmb250IA0KY29sb3I9IiM4MDgwMDAiPg0KPHgtdGFi PiZuYnNwOyB3aXRoIHN1YmplY3Q6DQo8L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwODAiPiBSRU1P VkU8L2ZvbnQ+PGZvbnQgY29sb3I9IiM4MDgwMDAiPg0KPGJyPjxicj4NCjwvZm9udD4NCjwvZm9u dD4NCjxmb250IGNvbG9yPSIjMDAwMDgwIiBzaXplPSI0Ij5Vbml2ZXJzaXR5PC9mb250PiA8Zm9u dCBzaXplPSIyIj4gIGFuZC9vcg0KPC9mb250Pg0KPGZvbnQgY29sb3I9IiMwMDAwODAiIHNpemU9 IjQiPlNjaG9vbDwvZm9udD48Zm9udCBzaXplPSIzIj4gPC9mb250PiA8Zm9udCBzaXplPSIyIj4g cHVyY2hhc2UNCm9yZGVycyBXRUxDT01FLiAobm8gY3JlZGl0IGFwcHJvdmFsIHJlcXVpcmVkKTxi cj4NClBheSBieSBjaGVjaywgYy5vLmQsIG9yIHB1cmNoYXNlIG9yZGVyIChuZXQgMzAgZGF5cyku DQo8L2ZvbnQ+DQo8L2I+DQo8L2ZvbnQ+DQo8L3A+DQo8cD48Yj48aT48Zm9udCBjb2xvcj0iIzAw MDA4MCIgc2l6ZT0iMyI+V0UgQUNDRVBUIEFMTCBNQUpPUiBDUkVESVQgQ0FSRFMhPC9mb250Pjwv aT48L2I+DQo8L3A+DQo8cD48Yj48YSBocmVmPSIjY29sb3IiPjxmb250IGZhY2U9IkFyaWFsIiBz aXplPSIzIj5OZXchIEhQIDQ1MDAvNDU1MCBzZXJpZXMgY29sb3INCmNhcnRyaWRnZXMgaW4gc3Rv Y2shPC9mb250PjwvYT48L2I+DQo8L3A+DQo8cCBhbGlnbj0ibGVmdCI+IDxmb250IHNpemU9IjIi PiA8Yj4NCjxpPjxmb250IGNvbG9yPSIjODA4MDAwIiBmYWNlPSJBcmlhbCI+DQpPdXIgY2FydHJp ZGdlIHByaWNlcyBhcmUgYXMgZm9sbG93czogPGJyPg0KKHBsZWFzZSBvcmRlciBieSBpdGVtIG51 bWJlcik8L2ZvbnQ+PC9pPg0KPC9iPg0KPC9mb250Pg0KPC9wPg0KPHAgYWxpZ249ImxlZnQiPiA8 Yj48Zm9udCBmYWNlPSJMdWNpZGEgU2FucyBUeXBld3JpdGVyIiBjb2xvcj0iIzAwMDAwMCIgDQpz aXplPSIzIj5JdGVtJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpIZXdsZXR0DQog ICAgIFBhY2thcmQ8YSANCm5hbWU9InByaWNlcyI+PC9hPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYg0Kc3A7Jm5ic3A7Jm5ic3A7DQpQcmljZTwvZm9udD48L2I+DQo8L3A+DQo8 cCBhbGlnbj0ibGVmdCI+IDx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+PGI+PGZvbnQgc2l6ZT0i MiI+MSAtLSA5MjI3NEEgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlckpldCA0TCwgNE1MLCA0UCwg NE1QDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0kNDcuNTA8YnI+DQo8L2ZvbnQ+DQo8c3BhbiBz dHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+DQo8Zm9udCBzaXplPSIyIj4NCjIgLS0g QzQwOTJBIEJsYWNrIFRvbmVyIENhcnRyaWRnZSBmb3IgTGFzZXJKZXQgMTEwMEEsIEFTRSwgMzIw MFNFLS0tLS0tLS0tLS0tLS0tLS0kNDUuNTA8YnI+DQo8L2ZvbnQ+DQo8L3NwYW4+DQo8Zm9udCBz aXplPSIyIj4NCjJBIC0gQzcxMTVBIFRvbmVyIENhcnRyaWRnZSBGb3IgSFAgTGFzZXJKZXQgMTAw MCwgMTIwMCwgMzMzMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0kNTUuNTA8YnI+DQo8c3BhbiBzdHls ZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+DQoyQiAtIEM3MTE1WCBIaWdoIENhcGFjaXR5 IFRvbmVyIENhcnRyaWRnZSBmb3IgSFAgTGFzZXJKZXQgMTAwMCwgMTIwMCwgMzMzMCAtLS0tLS0t JDY1LjUwPGJyPg0KPC9zcGFuPg0KMyAtLSA5MjI5NUEgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNl ckpldCBJSSwgSUlELCBJSUksIElJSUQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSQ0OS41MDxicj4N CjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij4NCjQgLS0gOTIyNzVBIFRv bmVyIENhcnRyaWRnZSBmb3IgTGFzZXJKZXQgSUlQLCBJSVArLCBJSUlQIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0kNTUuNTA8YnI+DQo8L3NwYW4+DQo1IC0tIEMzOTAzQSBUb25lciBDYXJ0cmlk Z2UgZm9yIExhc2VySmV0IDVQLCA1TVAsIDZQLCA2UHNlLCA2TVAsIDZQeGkgLS0tLS0tLS0tLS0t JDQ2LjUwPGJyPg0KPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYiPg0KNiAt LSBDMzkwOUEgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlckpldCA1U2ksIDVTaU1YLCA1U2kgQ29w aWVyLCA4MDAwIC0tLS0tLS0tLS0tLSQ5Mi41MDxicj4NCjwvc3Bhbj4NCjcgLS0gQzQwOTZBIFRv bmVyIENhcnRyaWRnZSBmb3IgTGFzZXJKZXQgMjEwMCwgMjIwMERTRSwgMjIwMERUTiAtLS0tLS0t LS0tLS0tLS0tLS0kNzIuNTA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0 QzRBNiI+DQo4IC0gQzQxODJYIFVsdHJhUHJlY2lzZSBIaWdoIENhcGFjaXR5IFRvbmVyIENhcnRy aWRnZSBmb3IgTGFzZXJKZXQgODEwMCBTZXJpZXMtLS0kMTI1LjUwPGJyPg0KPC9zcGFuPg0KOSAt LSBDMzkwNkEgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlckpldCA1TCwgNUwgWHRyYSwgNkxzZSwg NkwsIDZMeGksIDMxMDBzZS0tLS0tLSQ0Mi41MCA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3Vu ZC1jb2xvcjogI0M0QzRBNiI+DQo5QSAtIEMzOTA2QSBUb25lciBDYXJ0cmlkZ2UgZm9yIExhc2Vy SmV0IDMxMDAsIDMxNTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJDQyLjUwPGJyPg0K PC9zcGFuPg0KMTAgLSBDMzkwMEEgQmxhY2sgVG9uZXIgQ2FydHJpZGdlIGZvciBIUCBMYXNlckpl dCA0TVYsIDRWIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSQ4OS41MDxicj4NCjxzcGFuIHN0eWxl PSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij4NCjExIC0gQzQxMjdBIEJsYWNrIFRvbmVyIENh cnRyaWRnZSBmb3IgTGFzZXJKZXQgNDAwMFNFLCA0MDAwTiwgNDAwMFQsIDQwMDBUTiAtLS0tLS0k NzYuNTA8YnI+DQo8L3NwYW4+DQoxMUEtIEM4MDYxQSBCbGFjayBMYXNlciBUb25lciBmb3IgSFAg TGFzZXJKZXQgNDEwMCwgNDEwME4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJDc2LjUwPGJyPg0K PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYiPg0KMTFCLSBDODA2MVggSGln aCBDYXBhY2l0eSBUb25lciBDYXJ0cmlkZ2UgZm9yIExKNDEwMCwgNDEwME4gLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSQ4NS41MDxicj4NCjwvc3Bhbj4NCjExQy0gQzQxMjdYIEhpZ2ggQ2FwYWNpdHkg QmxhY2sgQ2FydHJpZGdlIGZvciBMYXNlckpldCA0MDAwU0UsNDAwME4sNDAwMFQsNDAwMFRODQot JDg0LjUwPGJyPg0KPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYiPg0KMTIg LSA5MjI5MUEgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlckpldCBJSUlTaSwgNFNpLCA0U2lNWCAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSQ1Ny41MDxicj4NCjwvc3Bhbj4NCjEzIC0gOTIyOThBIFRv bmVyIENhcnRyaWRnZSBmb3IgTGFzZXJKZXQgNCwgNCBQbHVzLCA0TSwgNE0gUGx1cywgNSwgNXNl LCA1TSwgNU4NCi0tJDQ2LjUwPGJyPg0KPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICND NEM0QTYiPg0KMTQgLSBDNDEyOVggSGlnaCBDYXBhY2l0eSBCbGFjayBUb25lciBDYXJ0cmlkZ2Ug Zm9yIExhc2VySmV0IDUwMDBOIC0tLS0tLS0tLS0tLS0tLSQ5Ny41MDxicj4NCjwvc3Bhbj4NCjE1 IC0gTEFTRVJGQVggNTAwLCA3MDAgKEZYMSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0kNDkuMDA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3Vu ZC1jb2xvcjogI0M0QzRBNiI+DQoxNiAtIExBU0VSRkFYIDUwMDAsIDcwMDAgKEZYMikgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJDU0LjAwPGJyPg0K PC9zcGFuPg0KMTcgLSBMQVNFUkZBWCAoRlgzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSQ0OS4wMDwvZm9udD48L2I+PGZvbnQg c2l6ZT0iMiI+PGJyPg0KPGI+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYi Pg0KMTggLSBMQVNFUkZBWCAoRlg0KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSQ0OS4wMDwvc3Bhbj48L2I+PC9mb250PjwvZm9u dD48L3R0Pg0KPC9wPg0KPHAgYWxpZ249ImxlZnQiPiA8Yj48Zm9udCBmYWNlPSJMdWNpZGEgU2Fu cyBUeXBld3JpdGVyIiANCnNpemU9IjMiPkl0ZW0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCkhld2xldHQgUGFja2FyZCAt IENvbG9yPGEgDQpuYW1lPSJjb2xvciI+PC9hPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOw0KJm5ic3A7Jm5ic3A7DQpQcmljZTwvZm9udD48L2I+DQo8L3A+DQo8cCBhbGlnbj0ibGVm dCI+IDx0dD48Yj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+PGZvbnQg ZmFjZT0iTHVjaWRhIFNhbnMgVHlwZXdyaXRlciIgc2l6ZT0iMiIgDQpjb2xvcj0iIzAwMDAwMCI+ QzEgLS0gQzQxOTRhIFRvbmVyDQpDYXJ0cmlkZ2UsDQpZZWxsb3cgKGNvbG9yIGxqIDQ1MDAvNDU1 MCBzZXJpZXMpLS0tLS0tLS0tLS0tLS0tLS0tICQgODkuNTA8YnI+DQo8L2ZvbnQ+PC9zcGFuPjxm b250IGZhY2U9Ikx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIiIHNpemU9IjIiIGNvbG9yPSIjMDAwMDAw Ij5DMiAtLSBDNDE5M2EgVG9uZXINCkNhcnRyaWRnZSwgTWFnZW50YSAoY29sb3IgbGogNDUwMC80 NTUwIHNlcmllcyktLS0tLS0tLS0tLS0tLS0tLQ0KJCA4OS41MDxicj4NCjxzcGFuIHN0eWxlPSJi YWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij5DMyAtLSBDNDE5MmEgdG9uZXIgY2FydHJpZGdlLCBj eWFuIChjb2xvciBsaiA0NTAwLzQ1NTAgc2VyaWVzKS0tLS0tLS0tLS0tLS0tLS0tLS0tICQNCjg5 LjUwPGJyPg0KPC9zcGFuPkM0IC0tIGM0MTkxYSB0b25lciBjYXJ0cmlkZ2UsIGJsYWNrIChjb2xv ciBsaiA0NTAwLzQ1NTAgc2VyaWVzKS0tLS0tLS0tLS0tLS0tLS0tLS0NCiQgNzQuNTA8L2ZvbnQ+ PC9iPjwvdHQ+DQo8L3A+DQo8cCBhbGlnbj0ibGVmdCI+IDxiPjxmb250IGZhY2U9Ikx1Y2lkYSBT YW5zIFR5cGV3cml0ZXIiIA0Kc2l6ZT0iMyI+SXRlbSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYg0Kc3A7Jm5ic3A7Jm5ic3A7DQpMZXhtYXJrJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm4NCmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsNClByaWNlPC9mb250PjwvYj4NCjwvcD4NCjxwIGFsaWduPSJsZWZ0 Ij4gPHR0Pjxmb250IHNpemU9IjIiIGZhY2U9Ikx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIiIGNvbG9y PSIjMDAwMDAwIj48Yj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogDQojQzRDNEE2Ij4x OSAtIDEzODA1MjAgSGlnaCBZaWVsZCBCbGFjayBMYXNlciBUb25lciBmb3IgNDAxOSwgNDAxOUUs IDQwMjgsIDQwMjksIDYsIDEwLCAxMEwgLS0gJDEwOS41MDxicj4NCjwvc3Bhbj4yMCAtIDEzODIx NTAgSGlnaCBZaWVsZCBUb25lciBmb3IgMzExMiwgMzExNiwgNDAzOS0xMCssIDQwNDktIE1vZGVs IDEyTCwxNlIsDQpPcHRyYSAtICQxMDkuNTA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1j b2xvcjogI0M0QzRBNiI+MjEgLSA2OUc4MjU2IExhc2VyIENhcnRyaWRnZSBmb3IgT3B0cmEgRSwN CkUrLCBFUCwgRVMsIDQwMjYsIDQwMjYgKDZBLDZCLDZELDZFKSZuYnNwOyAtLS0tICQgNDkuMDA8 YnI+DQo8L3NwYW4+MjIgLSAxM1QwMTAxIEhpZ2ggWWllbGQgVG9uZXIgQ2FydHJpZGdlIGZvciBM ZXhtYXJrIE9wdHJhIEUzMTAsIEUzMTIsIEUzMTJMIC0tLS0tLS0tICQgODkuMDA8YnI+DQo8c3Bh biBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+MjMgLSAxMzgyNjI1IEhpZ2gtWWll bGQgTGFzZXIgVG9uZXIgQ2FydHJpZGdlIGZvciBMZXhtYXJrIE9wdHJhIFMgKDQwNTkpIC0tLS0t LS0tLS0tIA0KJDEyOS41MDxicj4NCjwvc3Bhbj4yNCAtIDEyQTU3NDUgSGlnaCBZaWVsZCBMYXNl ciBUb25lciBmb3IgTGV4bWFyayBPcHRyYSBUNjEwLCA2MTIsIDYxNCAoNDA2OSkgLS0tLS0tLS0g JDE2NS4wMDwvYj48L2ZvbnQ+PC90dD4NCjwvcD4NCjxwIGFsaWduPSJsZWZ0Ij4gPGI+PGZvbnQg ZmFjZT0iTHVjaWRhIFNhbnMgVHlwZXdyaXRlciIgDQpzaXplPSIzIj5JdGVtJm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpFcHNvbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnMNCnA7Jm5ic3A7Jm5ic3A7DQpQcmljZTwvZm9udD48L2I+DQo8 L3A+DQo8cCBhbGlnbj0ibGVmdCI+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSIyIiBm YWNlPSJMdWNpZGEgU2FucyBUeXBld3JpdGVyIj48Yj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1j b2xvcjogDQojQzRDNEE2Ij4yNQ0KLS0tLSBTMDUxMDA5IFRvbmVyIENhcnRyaWRnZSBmb3IgRXBz b24gRVBMNzAwMCwgNzUwMCwgODAwMCsgLSAkMTE1LjUwPGJyPg0KPC9zcGFuPjI1QSAtLS0gUzA1 MTAwOSBMUC0zMDAwIFBTIDcwMDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJDEx NS41MDxicj4NCjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij4yNiAtLS0t IEFTMDUxMDExIEltYWdpbmcgQ2FydHJpZGdlIGZvcg0KQWN0aW9uTGFzZXItMTAwMCwgMTUwMCAt LSAkIDk5LjUwPGJyPg0KPC9zcGFuPjI2QSAtLS0gQVMwNTEwMTEgRVBMLTUwMDAsIEVQTC01MTAw LCBFUEwtNTIwMCAtLS0tLS0tLS0tLS0tLS0tLS0gJCA5OS41MDxicj48L2I+PC9mb250Pg0KPC90 dD48L3A+DQo8cCBhbGlnbj0ibGVmdCI+PGI+PGZvbnQgZmFjZT0iTHVjaWRhIFNhbnMgVHlwZXdy aXRlciIgDQpzaXplPSIzIj5JdGVtJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpQYW5hc29uaWMmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsNClByaWNlPC9mb250PjwvYj48L3A+DQo8cCBhbGlnbj0ibGVmdCI+ PHR0PjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij48Zm9udCBjb2xvcj0i IzAwMDAwMCIgZmFjZT0iTHVjaWRhIFNhbnMgVHlwZXdyaXRlciIgDQpzaXplPSIyIj48Yj4yNw0K LS0tLS0tTmVjIHNlcmllcyAyIG1vZGVscyA5MCBhbmQgOTUgLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAkMTA5LjUwPGJyPjwvYj48L2ZvbnQ+PC9zcGFuPjwvdHQ+PC9wPg0KPHAgYWxpZ249ImxlZnQi PjxiPjxmb250IGZhY2U9Ikx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIiIA0Kc2l6ZT0iMyI+SXRlbSZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 DQpBcHBsZSZuYnNwOyANCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnMNCnA7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpQcmljZTwvZm9udD48L2I+PC9wPg0KPHAgYWxpZ249Imxl ZnQiPjx0dD48Yj48Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyIgc2l6ZT0iMiIgY29sb3I9IiMwMDAw MDAiPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij4yOCANCi0tLS0gMjQ3 M0cvQSBMYXNlciBUb25lciBmb3IgTGFzZXJXcml0ZXIgUHJvIDYwMCwgNjMwLCBMYXNlcldyaXRl ciAxNi82MDAgUFMgLQ0KJCA1Ny41MDxicj4NCjwvc3Bhbj4yOSAtLS0tIDE5NjBHL0EgTGFzZXIg VG9uZXIgZm9yIEFwcGxlIExhc2VyV3JpdGVyIFNlbGVjdCwgMzAwLCAzMTAsIDM2MCAtLS0tLS0t LS0gJA0KNzEuNTA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+ MzAgLS0tLSBNMDA4OUxML0EgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlcndyaXRlciAzMDAsIDMy MCAoNzRBKSAtLS0tLS0tLS0tLS0tLS0tICQNCjUyLjUwPGJyPg0KPC9zcGFuPjMxIC0tLS0gTTYw MDIgVG9uZXIgQ2FydHJpZGdlIGZvciBMYXNlcndyaXRlciBJSU5ULCBJSU5UWCwgSUlTQywgSUlG LCBJSUcgKDk1QSkgLSAkDQo0Ny41MDxicj4NCjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9y OiAjQzRDNEE2Ij4zMUEgLS0tIE0wMDg5TEwvQSBUb25lciBDYXJ0cmlkZ2UgZm9yIExhc2Vyd3Jp dGVyDQpMUywgTlQsIE5UUiwgU0MgKDc1QSkgLS0tLS0tLS0tICQNCjU1LjUwPGJyPg0KPC9zcGFu PjMyIC0tLS0gTTQ2ODNHL0EgTGFzZXIgVG9uZXIgZm9yIExhc2VyV3JpdGVyIDEyLCA2NDBQUyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJCA4NS41MDxicj48L2ZvbnQ+PC9iPg0KPC90dD48 L3A+DQo8cCBhbGlnbj0ibGVmdCI+PGI+PGZvbnQgZmFjZT0iTHVjaWRhIFNhbnMgVHlwZXdyaXRl ciIgDQpzaXplPSIzIj5JdGVtJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpDYW5v biZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnMNCnA7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQpQcmljZTwvZm9u dD48L2I+PC9wPg0KPHA+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSIyIiBmYWNlPSJM dWNpZGEgU2FucyBUeXBld3JpdGVyIj48Yj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjog I0M0QzRBNiI+MzMgLS0tIA0KRmF4DQpDRlgtTDM1MDAsIENGWC00MDAwIENGWC1MNDUwMCwgQ0ZY LUw0NTAwSUUgJmFtcDsgSUYgRlgzIC0tLS0tLS0tLS0tICQgNDkuNTA8YnI+DQo8L3NwYW4+MzNB IC0tIEwtMjUwLCBMLTI2MGksIEwtMzAwIEZYMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCiQgNDkuNTA8YnI+DQo8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xv cjogI0M0QzRBNiI+MzNCIC0tIExBU0VSIENMQVNTIDIwNjAsIDIwNjBQLCA0MDAwIEZYMyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiQgNDkuNTA8YnI+DQo8L3NwYW4+MzQgLS0t IExBU0VSIENMQVNTIDUwMDAsIDU1MDAsIDcwMDAsIDcxMDAsIDc1MDAsIDYwMDAgRlgyIC0tLS0t LS0tLS0tLS0tLS0NCiQgNDkuNTA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRB NiI+PGJyPg0KMzUgLS0tIEZBWCA1MDAwIEZYMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiQgNDkuNTA8YnI+DQo8L3NwYW4+MzYgLS0tIExB U0VSIENMQVNTIDg1MDAsIDkwMDAsIDkwMDBMLCA5MDAwTVMsIDk1MDAsIDk1MDAgTVMsIDk1MDAg UyBGWDQgLS0NCiQgNDkuNTA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+ PGJyPg0KMzZBIC0tIEZheCBMNzAwLDcyMCw3NjAsNzcwLDc3NSw3NzcsNzgwLDc4NSw3OTAsICZh bXA7IEwzMzAwIEZYMQ0KLS0tLS0tLS0tLS0tLSAkIDQ5LjUwPGJyPg0KPC9zcGFuPjM2QiAtLSBM LTgwMCwgTC05MDAgRlg0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQokIDQ5LjUwPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYi Pjxicj4NCjM3IC0tLSBBMzBSIFRvbmVyIENhcnRyaWRnZSBmb3IgUEMtNiwgNlJFLCA3LCAxMSwg MTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQokIDU5LjUwPGJyPg0KPC9zcGFuPjM4IC0tLSBFLTQw IFRvbmVyIENhcnRyaWRnZSBmb3IgUEMtNzIwLCA3NDAsIDc3MCwgNzkwLDc5NSwgOTIwLCA5NTAs IDk4MCAtDQokIDg1LjUwPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDNEM0QTYiPjxi cj4NCjM4QSAtLSBFLTIwIFRvbmVyIENhcnRyaWRnZSBmb3IgUEMtMzEwLCAzMjUsIDMzMCwgMzMw TCwgNDAwLCA0MjAsIDQzMCAtLS0tDQokIDg1LjUwPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iYmFj a2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+PGJyPjwvc3Bhbj48L2ZvbnQ+DQo8L3R0PjwvcD4NCjxw PjxiPjxmb250IGZhY2U9Ikx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIiIHNpemU9IjMiPkl0ZW0mbmJz cDsmbmJzcDsNClhlcm94Jm5ic3A7Jm5ic3A7Jm5ic3A7IFByaWNlPC9mb250PjwvYj48L3A+DQo8 cD48dHQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9IjIiIGZhY2U9Ikx1Y2lkYSBTYW5zIFR5 cGV3cml0ZXIiPjxiPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2Ij4zOSAt LS0tIA0KNlI5MDAgNzVBIC0tLS0gJCA1NS41MDxicj4NCjwvc3Bhbj40MCAtLS0tIDZSOTAzIDk4 QSAtLS0tICQgNDYuNTA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0M0QzRBNiI+PGJy Pg0KNDEgLS0tLSA2UjkwMiA5NUEgLS0tLSAkIDQ5LjUwPGJyPg0KPC9zcGFuPjQyIC0tLS0gNlI5 MDEgOTFBIC0tLS0gJCA2NS41MDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQzRDNEE2 Ij48YnI+DQo0MyAtLS0tIDZSOTA4IDA2QSAtLS0tICQgNDIuNTA8YnI+DQo8L3NwYW4+NDQgLS0t LSA2Ujg5OSA3NEEgLS0tLSAkIDQ3LjUwPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICND NEM0QTYiPjxicj4NCjQ1IC0tLS0gNlI5MjggOTZBIC0tLS0gJCA3Mi41MDxicj4NCjwvc3Bhbj40 NiAtLS0tIDZSOTI2IDI3WCAtLS0tICQgODQuNTA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xv cjogI0M0QzRBNiI+PGJyPg0KNDcgLS0tLSA2UjkwNiAwOUEgLS0tLSAkIDkyLjUwPGJyPg0KPC9z cGFuPjQ4IC0tLS0gNlI5MDcgNE1WIC0tLS0gJCA4OS41MDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5k LWNvbG9yOiAjQzRDNEE2Ij48YnI+DQo0OSAtLS0tIDZSOTA1IDAzQSAtLS0tICQgNDYuNTA8L3Nw YW4+PC9iPjwvZm9udD48L3R0PjwvcD4NCjxwIGFsaWduPSJsZWZ0Ij48Yj48aT48Zm9udCBjb2xv cj0iIzgwODAwMCIgc2l6ZT0iMyIgZmFjZT0iQXJpYWwiPjMwIERheSB1bmxpbWl0ZWQgd2FycmFu dHkgaW5jbHVkZWQgb24gYWxsDQpwcm9kdWN0czxicj4NCkdUIFRvbmVyIFN1cHBsaWVzIGd1YXJh bnRlZXMgdGhlc2UgY2FydHJpZGdlcyB0byBiZSBmcmVlIGZyb20gZGVmZWN0cyBpbg0Kd29ya21h bnNoaXAgYW5kIG1hdGVyaWFsLjwvZm9udD48L2k+DQo8L2I+DQo8L3A+DQo8cCBhbGlnbj0ibGVm dCI+PGI+PGk+PGZvbnQgY29sb3I9IiMwMDAwRkYiIHNpemU9IjMiIGZhY2U9IkFyaWFsIj5XZSBs b29rDQpmb3J3YXJkIGluIGRvaW5nIGJ1c2luZXNzIHdpdGggeW91LjwvZm9udD48L2k+PC9iPg0K PC9wPg0KPHAgYWxpZ249ImxlZnQiPjxiPjxpPjxmb250IGNvbG9yPSIjMDAwMEZGIiBzaXplPSIz IiBmYWNlPSJBcmlhbCI+Q3VzdG9tZXImbmJzcDsNClNhdGlzZmFjdGlvbiBndWFyYW50ZWVkPC9m b250PjwvaT48L2I+DQo8L3A+DQo8cD4NCjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsIj48Yj5J PGZvbnQgY29sb3I9IiMwMDAwODAiPmYgeW91IGFyZSBvcmRlcmluZyBieSBlLW1haWwgb3INCmMu by5kLiBwbGVhc2UgZmlsbCBvdXQgYW4gb3JkZXI8YnI+DQpmb3JtIHdpdGggdGhlIGZvbGxvd2lu ZyBpbmZvcm1hdGlvbjo8L2ZvbnQ+PGZvbnQgY29sb3I9IiM4MDgwMDAiPjxpPiZuYnNwOyZuYnNw OyZuYnNwOzwvaT48L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwODAiPg0KPC9mb250PjxpPiZuYnNw OyZuYnNwOyZuYnNwOzwvaT48Zm9udCBjb2xvcj0iIzAwMDA4MCIgZmFjZT0iQXJpYWwiPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvZm9udD48Zm9udCANCmNvbG9yPSIjMDAwMEZGIj4N CjwvZm9udD48Zm9udCBjb2xvcj0iIzgwODAwMCI+PGk+Jm5ic3A7PC9pPjwvZm9udD48Zm9udCBj b2xvcj0iIzAwMDA4MCI+PGJyPjxicj4NCjwvZm9udD48Zm9udCBjb2xvcj0iIzgwODAwMCI+cGhv bmUgbnVtYmVyPGJyPg0KY29tcGFueSBuYW1lPGJyPg0KZmlyc3QgYW5kIGxhc3QgbmFtZTxicj4N CnN0cmVldCBhZGRyZXNzPGJyPg0KY2l0eSwgc3RhdGUgemlwIA0KY29kZSZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7DQo8L2ZvbnQ+PC9iPjwvZm9udD48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+PGI+PGk+ PGEgaHJlZj0ibWFpbHRvOmd0dHMxQGNhYmxlLm5ldC5jbyI+PGZvbnQgY29sb3I9IiMwMDAwRkYi Pk9yZGVyIA0KTm93PC9mb250PjwvYT4gPC9pPjxmb250IGNvbG9yPSIjMDAwMDgwIj5vcg0KY2Fs bCB0b2xsIGZyZWUgPC9mb250Pjxmb250IHNpemU9IjMiIGNvbG9yPSIjMDAwMEZGIj4gMS04NjYt MjM3LTczOTc8L2ZvbnQ+IDwvYj48L2ZvbnQ+DQo8Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+ PGI+PGZvbnQgY29sb3I9IiM4MDgwMDAiPjxicj48YnI+DQo8L2ZvbnQ+PGZvbnQgY29sb3I9IiMw MDAwODAiPklmIHlvdSBhcmUgb3JkZXJpbmcgYnkgcHVyY2hhc2Ugb3JkZXIgcGxlYXNlIGZpbGwg b3V0IGFuIG9yZGVyIGZvcm08YnI+DQp3aXRoIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Jm5i c3A7Jm5ic3A7Jm5ic3A7IDwvZm9udD48aT4mbmJzcDsmbmJzcDsmbmJzcDs8L2k+PGZvbnQgY29s b3I9IiMwMDAwODAiIA0KZmFjZT0iQXJpYWwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9m b250PjwvYj48L2ZvbnQ+PC9wPg0KPHA+PGI+PGZvbnQgZmFjZT0iQXJpYWwiIGNvbG9yPSIjODA4 MDAwIiBzaXplPSIyIj5wdXJjaGFzZSBvcmRlciBudW1iZXI8YnI+DQpwaG9uZSBudW1iZXI8YnI+ DQpjb21wYW55IG9yIHNjaG9vbCBuYW1lPGJyPg0Kc2hpcHBpbmcgYWRkcmVzcyBhbmQgYmlsbGlu ZyBhZGRyZXNzPGJyPg0KY2l0eSwgc3RhdGUgemlwIA0KY29kZSZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8 L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsIj48Yj48aT48YSBocmVmPSJtYWls dG86Z3R0czFAY2FibGUubmV0LmNvIj48Zm9udCBjb2xvcj0iIzAwMDBGRiI+T3JkZXINCk5vdzwv Zm9udD48L2E+PC9pPjwvYj48L2ZvbnQ+PC9wPg0KPHAgYWxpZ249ImxlZnQiPjxiPjxmb250IHNp emU9IjIiPjxpPjxmb250IGNvbG9yPSIjODAwMDAwIiBzaXplPSIyIiBmYWNlPSJBcmlhbCI+QWxs IHRyYWRlIG1hcmtzIGFuZCBicmFuZCBuYW1lcyBsaXN0ZWQgDQphYm92ZSBhcmUgcHJvcGVydHkN Cm9mIHRoZSByZXNwZWN0aXZlPGJyPg0KaG9sZGVycyBhbmQgdXNlZCBmb3IgZGVzY3JpcHRpdmUg cHVycG9zZXMgb25seS48L2ZvbnQ+DQo8L2k+DQo8L2ZvbnQ+DQo8L2I+DQo8L3A+DQo= |
From: Fred L. D. Jr. <fd...@ac...> - 2002-08-12 21:58:32
|
robin and jim writes: > However, test_02 does not work as expected; when the open() > operation fails, the test also fails (i.e., the exception is not > caught by assertRaises). That's because the exception is being raised before assertRaises() has been called. Try this: def test_02(self): '''handling the failure to connect with and log onto a FTP server''' self.assertRaises(Exception, self.testable.open) (Note the parens have been removed from testable.open, allowing assertRaises() to make the call, and handle the exception.) -Fred -- Fred L. Drake, Jr. <fdrake at acm.org> PythonLabs at Zope Corporation |
From: Jeremy H. <je...@al...> - 2002-08-12 21:38:55
|
>>>>> "RJ" == robin and jim <rob...@ea...> writes: RJ> Hello, I'm using the unittest module shipped with PythonWin RJ> 2.2.1, and I am having trouble using assertRaises. Here is a RJ> code fragment example. RJ> def test_01(self): RJ> '''handling the failure to connect with and log onto a RJ> FTP server''' RJ> try: RJ> self.testable.open() RJ> except Exception: RJ> pass RJ> else: RJ> self.fail('exception not raised') RJ> def test_02(self): RJ> '''handling the failure to connect with and log onto a FTP server''' RJ> self.assertRaises(Exception, self.testable.open()) RJ> test_01 works as expected (i.e., when the open() operation RJ> fails, the test succeeds). RJ> However, test_02 does not work as expected; when the open() RJ> operation fails, the test also fails (i.e., the exception is not RJ> caught by assertRaises). RJ> What am I doing wrong? Do not call open() before passing it to assertRaises(). self.assertRaises(Exception, self.testable.open) should work just like test_01. The code you wrote will call self.testable.open() before calling assertRaises(), which means assertRaises() will never get a chance to catch the exception. You probably overlooked that assertRaises() takes a callable object -- a function or method or something like that -- as its second argument. It also takes a variable number of other arguments that is passes as arguments to the callable. Say you were testing this function: def f(x, y): return x / y You would write: self.assertRaises(ZeroDivisionError, f, 12, 0) Internally, assertRaises() will call f(12, 0) within a try/except block that catches ZeroDivisionError. Jeremy |
From: robin a. j. <rob...@ea...> - 2002-08-12 21:30:53
|
Hello, I'm using the unittest module shipped with PythonWin 2.2.1, and I am = having trouble using assertRaises. Here is a code fragment example. def test_01(self): '''handling the failure to connect with and log onto a FTP = server''' try: self.testable.open() except Exception: pass else: self.fail('exception not raised') def test_02(self): '''handling the failure to connect with and log onto a FTP = server''' self.assertRaises(Exception, self.testable.open()) test_01 works as expected (i.e., when the open() operation fails, the = test succeeds). However, test_02 does not work as expected; when the open() operation = fails, the test also fails (i.e., the exception is not caught by = assertRaises). What am I doing wrong? |
From: Steve P. <ste...@ya...> - 2002-08-09 09:57:47
|
Thanks Jeremy, Jeremy Hylton wrote: > I've been meaning to mention that str(klass) works differently with a > new-style class than with a classic class. As a result, the output > from a verbose test run produces different results. I've fixed this as you suggested in both CVS trees. Works fine for me, both with old and new Pythons. Patch is as follows, just for reference: 64a65,67 > def _strclass(cls): > return "%s.%s" % (cls.__module__, cls.__name__) > 119c122 < (self.__class__, self.testsRun, len(self.errors), --- > (_strclass(self.__class__), self.testsRun, len(self.errors), 189c192 < return "%s.%s" % (self.__class__, self.__testMethodName) --- > return "%s.%s" % (_strclass(self.__class__), self.__testMethodName) 196c199 < (self.__class__, self.__testMethodName) --- > (_strclass(self.__class__), self.__testMethodName) 324c327 < return "<%s tests=%s>" % (self.__class__, self._tests) --- > return "<%s tests=%s>" % (_strclass(self.__class__), self._tests) 388c391 < return "%s (%s)" % (self.__class__, self.__testFunc.__name__) --- > return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__) 391c394 < return "<%s testFunc=%s>" % (self.__class__, self.__testFunc) --- > return "<%s testFunc=%s>" % (_strclass(self.__class__), self.__testFunc) |
From: <je...@zo...> - 2002-08-08 16:04:14
|
>>>>> "SP" == Steve Purcell <ste...@ya...> writes: SP> Jim Fulton wrote: >> Steve Purcell wrote: >> >Excellent suggestion. I shall make it so. >> >> Great. Will you update the Python distribution in time for 2.3? SP> Today I checked the requested change into both the PyUnit and SP> Python CVS trees. I'm not aware of any possible breakage that SP> could result from the change, so concerned PyUnit users should SP> feel free to comment on the mailing list if they see any SP> potential problems. I've been meaning to mention that str(klass) works differently with a new-style class than with a classic class. As a result, the output from a verbose test run produces different results. Python 2.3a0 (#2, Aug 6 2002, 06:20:27) [GCC 2.95.3 19991030 (prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> class Foo(object): ... pass ... >>> str(Foo) "<class '__main__.Foo'>" >>> "%s.%s" % (Foo.__module__, Foo.__name__) '__main__.Foo' Here's a classic class: >>> class Bar: ... pass ... >>> str(Bar) '__main__.Bar' >>> "%s.%s" % (Bar.__module__, Bar.__name__) '__main__.Bar' I think the solution is to write a helper function. def strclass(cls): return "%s.%s" % (cls.__module__, cls.__name__) And use it everywhere that a class is passed to a format string, e.g. '"%s" % cls'. Jeremy |
From: Steve P. <ste...@ya...> - 2002-08-08 13:54:03
|
Noah, Both 'runTest()' and 'testXXX()' are fine. Like much of PyUnit, 'runTest()' came originally from JUnit, the idea being that it is the default name for a test method in a TestCase subclass; it allows for a parameterless constructor call, which is convenient for throwaway tests. e.g. >>> class MyTestCase(unittest.TestCase): ... def runTest(self): ... pass ... >>> result = unittest.TestResult() >>> MyTestCase().run(result) >>> result <<class 'unittest.TestResult'> run=1 errors=0 failures=0> In practice PyUnit, like JUnit, encourages the 'testXXX()' style methods because several can be placed in one TestCase subclass, and they can be found automatically by the convenience functions such as 'unittest.makeSuite()' and 'unittest.main()'. And so yes, 'runTest()' is probably redundant these days for practical purposes, and the documentation fails to make that as clear as it should be. Best wishes, -Steve Noah wrote: > > I am unclear on the difference between the runTest() method > and test methods in the form testXXX() (where XXX is replaced by some string). > The PyUnit Website starts by introducing runTest(), but then > almost immediately switches to the form testXXX() for tests. > The TestCase doc string says "test code itself should be placed > in a method named 'runTest'", yet I was able to follow all > the examples on the PyUnit Website while ignoring runTest(). > > It seems that runTest() is redundant since the TestSuite class > will automatically discover methods named in the form testXXX(). > In fact runTest() seems to be limited in functionality because > you cannot use unittest.main() to test a class that only overrides runTest(). > And unittest.TestSuite().makeSuite() likewise does not use runTest(). > > In what circumstance would I want to define runTest() vs. testXXX()? |
From: Steve P. <ste...@ya...> - 2002-08-08 13:40:57
|
Jim Fulton wrote: > Steve Purcell wrote: > >Excellent suggestion. I shall make it so. > > Great. Will you update the Python distribution in time for 2.3? Hi Jim / all, Today I checked the requested change into both the PyUnit and Python CVS trees. I'm not aware of any possible breakage that could result from the change, so concerned PyUnit users should feel free to comment on the mailing list if they see any potential problems. Best wishes, -Steve |
From: Noah <no...@no...> - 2002-08-02 20:59:40
|
In what circumstance would I want to define runTest() vs. testXXX()? I am unclear on the difference between the runTest() method and test methods in the form testXXX() (where XXX is replaced by some string). The PyUnit Website starts by introducing runTest(), but then almost immediately switches to the form testXXX() for tests. The TestCase doc string says "test code itself should be placed in a method named 'runTest'", yet I was able to follow all the examples on the PyUnit Website while ignoring runTest(). It seems that runTest() is redundant since the TestSuite class will automatically discover methods named in the form testXXX(). In fact runTest() seems to be limited in functionality because you cannot use unittest.main() to test a class that only overrides runTest(). And unittest.TestSuite().makeSuite() likewise does not use runTest(). Is there more than one way to do it? Yours, Noah |
From: Jim F. <ji...@zo...> - 2002-08-02 20:28:12
|
Steve Purcell wrote: > Hi again Jim, > > Excellent suggestion. I shall make it so. Great. Will you update the Python distribution in time for 2.3? Jim -- Jim Fulton mailto:ji...@zo... Python Powered! CTO (888) 344-4332 http://www.python.org Zope Corporation http://www.zope.com http://www.zope.org |
From: Jim F. <ji...@zo...> - 2002-08-02 20:25:34
|
Steve Purcell wrote: > Hi Jim, > > Sorry for the slow response. > > Interesting suggestion. I wonder about a couple of things. > > Firstly, not every test would require every cleanup function to be > called, so calling every function after every test seems a high > price to pay for convenience. Imagine running 10,000 tests, > where each block of 100 requires a single (but different) clean-up > function: that's 1,000,000 cleanup function invocations instead > of 10,000. Good point. > Secondly, I'm nervous about the notion of adding clean-up functions > to the clean-up registry from 'outside' testing code, as in the > example you provided. What if the test module is imported multiple > times, e.g. by the unittest GUI? Typically, the registrations would be done by application modules, not test modules. Would the unittest GUI reload application modules? That sounds like a recipe for disaster. ... > Cleaning-up of component registries is to be done after every > Zope test, as I understand things. In that case, I'd think > a common base class for your Zope test cases is in order, with a > standardised 'tearDown()' that all subclasses should call if they > also implement a 'tearDown()' method. This is a safer solution, in > my opinion. That is the solution I'm using now. You are right, in that tests that are *known* not to produce side-effects can avoid the extra clean up work. > Or am I missing something? Nope. I like your scalability argument. Thanks. BTW, neither of your responses seem to have shown up in the source forge mail archive. Jim -- Jim Fulton mailto:ji...@zo... Python Powered! CTO (888) 344-4332 http://www.python.org Zope Corporation http://www.zope.com http://www.zope.org |
From: Noah <no...@no...> - 2002-08-02 02:01:47
|
I am unclear on the difference between the runTest() method and test methods in the form testXXX() (where XXX is replaced by some string). The PyUnit Website starts by introducing runTest(), but then almost immediately switches to the form testXXX() for tests. The TestCase doc string says "test code itself should be placed in a method named 'runTest'", yet I was able to follow all the examples on the PyUnit Website while ignoring runTest(). It seems that runTest() is redundant since the TestSuite class will automatically discover methods named in the form testXXX(). In fact runTest() seems to be limited in functionality because you cannot use unittest.main() to test a class that only overrides runTest(). And unittest.TestSuite().makeSuite() likewise does not use runTest(). In what circumstance would I want to define runTest() vs. testXXX()? Yours, Noah |
From: Michal W. <sa...@ma...> - 2002-08-01 00:52:34
|
On Wed, 31 Jul 2002, Andrew P. Lentvorski wrote: > So, how do I get test_unittest2.py to call the tests in test_unittest.py > and run them correctly? I am open to changing the original test code, > explicitly assigning stuff, etc. to make this work. I would even use > execfile or the imp module if required. > > Lest someone think that this is just a really stupid thing to do, I will > point out that the same issues arise if you try to use the python debugger > on a unittest as it also wants to import the module and then run the unit > tests. Hey Andrew, well, the defaultTest thing seems to be looking in the top level namespace, so if you put... import test_unittest from test_unittest import * ... at the top of test_unittest2 , it'll work fine. A better idea might be to use a different unittest funciton - one that takes an explicit test suite. --- Personally, when I want to debug a test case, I just add this line to the place in the test where I want to start debugging: import pdb; pdb.set_trace() Then I just run my tests as usual. ('Course I work with the TextTestRunner... I don't know how useful that is in the GUI) Cheers, - Michal http://www.sabren.net/ sa...@ma... ------------------------------------------------------------ Switch to Cornerhost! http://www.cornerhost.com/ High Powered Hosting - With a Human Touch. :) ------------------------------------------------------------ |
From: Andrew P. L. <bs...@ma...> - 2002-08-01 00:31:54
|
I'm guessing that I'm doing something obviously wrong, but darned if I can figure it out. I have a program called test_unittest.py (attached). It runs; it passes. Life is good. So, now I have a program called test_unittest2.py (attached) which I want to import test_unittest.py and run the unit tests. What I wind up with: <Big traceback omitted> File "/usr/local/lib/python2.2/unittest.py", line 451, in loadTestsFromName obj = getattr(obj, part) AttributeError: 'module' object has no attribute 'suite' Clearly I've got some locals/globals namespace issue, but I don't know how to fix it. So, how do I get test_unittest2.py to call the tests in test_unittest.py and run them correctly? I am open to changing the original test code, explicitly assigning stuff, etc. to make this work. I would even use execfile or the imp module if required. Lest someone think that this is just a really stupid thing to do, I will point out that the same issues arise if you try to use the python debugger on a unittest as it also wants to import the module and then run the unit tests. Thanks, -a <Begin test_unittest.py> #!/usr/bin/env python import unittest class MyTest(unittest.TestCase): def checkBasic(self): assert 1 == 1 def suite(): """Suite of testcases""" suitelist = [] suitelist.append(unittest.makeSuite(MyTest, 'check')) return unittest.TestSuite(suitelist) def main(): unittest.main(defaultTest="suite") if __name__ == "__main__": main() <End test_unittest.py> <Begin test_unittest2.py> #!/usr/bin/env python import test_unittest def main(): test_unittest.main() if __name__ == "__main__": main() <End test_unittest2.py> |
From: Detlev O. <de...@di...> - 2002-07-22 19:58:09
|
Hi all, I have written a PyQt GUI version of unittest. It is part of eric the python debugger which is a part of PyQt. It is included in the latest PyQt snapshot, which can be found on "http://www.riverbankcomputing.co.uk/pyqt" in the download section. It is callable from the commandline or from within eric. Its look and feel is similar to the tkinter version. Please try it and send me your comments. Regards Detlev -- Detlev Offenbach de...@di... |