[PyKDE] KDE XML GUI ActionLists

Jim Bublitz jbublitz at nwinternet.com
Thu Apr 24 07:39:01 BST 2003


On 24-Apr-03 Gordon Tyler wrote:
> On April 23, 2003 01:20 pm, Jim Bublitz wrote:
 
> How do you write unit tests for this sort of project?

For a few things (static methods that invoke a dialog with local
event loop, or variable-result system related calls like KService
stuff) I just write something to exercise the code and look at the
results manually, but there isn't a lot of that. For everything
else, I start from the assumption that sip generated code is
correct, or at least the errors will be apparent in example code, or
that I'll catch major sip errors as a side effect of other tests.

That leaves handwritten code to test - %MemberCode and
%MappedTypes. The basic framework is a simple KApplication (I need
a few widgets and most code requires a KApplication instance
anyway), with a "test" button. The unit tests (from the unittest
module framework) are connected to the button clicked () signal.
Interestingly, if I don't start the event loop, I get a lot of
random crashes, so the button is required. The tests run pass/fail
- about the same as doing 'make test' for Python (but shorter).

For %MemberCode, I call a method using fixed args and test the
return value(s) (many return tuples or lists). For %MappedTypes, I
try to find a method that utilizes the mapped type and do the same
thing. Mapped types are just C++ <-> Python conversion functions, so
if I can't find a suitable (ie codable in 4-5 lines) method, I just
write a test method, as for KActionList (in C++):

    KActionList testKActionList (KActionList)

and send it a Python list (or whatever) and test that I get the same
list back. The test function converts the Python list to a QPtrList
and then from QPtrList to a Python list and returns it. 

The errors I'm finding are things like failing to create a new
object in a conversion function, incorrect argument typing, missing
args, object reference treated as input-only when it's actually
an output or both. Because of that, I don't worry a lot about
corner cases, as failures are likely to be not-to-subtle. If I was 
doing a math lib, I'd approach it differently. I found one mapped
type where I'd missed a  C++ ";" and it still compiled (wrongly of
course) - first time I've seen that. Most bugs are in places not
very important to most people, but they're still bugs, and
eventually someone will want to use that code.

In a few cases, it's just too involved at the moment to create the
objects for a test or I haven't figured out exactly how KDE
works in those instances (eg DCOPObjRef in both cases), so I'm
leaving those until last - I'm probably a little over 2/3 done.

There's a second test program which just prints values instead of
doing 'asserts', and I use that for the stuff that isn't
automatable and to develop the automated tests (so I'm sure I
understand the inputs and outputs).

I'll probably include both test programs with the next release. 
The unit tests cover the most probable failure modes (ie, code I
write). Overall, I think it's a pretty good test strategy. 


Jim





More information about the PyQt mailing list