Kdevelop4 gsoc

Manuel Breugelmans mbr.nxi at gmail.com
Tue May 6 19:41:12 UTC 2008


First task done :) The QtTest suite for QxRunner is finished and comitted 
under kdevelop/xtest. A coverage report can be found at  
http://fenix.cmi.ua.ac.be/~p035120/qxcov/qxrunner [this also happens to be 
the functionality I want to implement in part 3]. Not quite the 90% I was 
aiming for but then the remaining classes with low coverage arent worth the 
extra effort, imo.

Next milestone is the integration of qxrunner in kdevelop, just graphically 
and able to run test primitivly. This should be done by next tuesday, 13 may.

When thats done focus lays on making the runner plugin smooth, easy and fun to 
use. Ideally things should 'just work' without much configuration but still 
powerful enough. I identified 4 major design decisions that need answering 
accompanied with some solutions.

1. How will the different test(cases) be discovered by the framework?

a/ let this be the responsability of the user, ie require him/her to write a 
seperate piece of code that collects all the tests
b/ re-use the framework specific registration method, eg for CppUnit this is 
basicly built-in
c/ present selectable list of known classes, deduce testcases with the help of 
duchain?

The first option is obviously very flexible but not user friendly. The second 
is easy for certain frameworks eg it's builtin in CppUnit, however QTest has 
no such facilities. The last seems do-able as well, it will need some 
adaption for the C framework, Check (no classes).

2. How to compile the tests, what kind of user input is required here?

a/ just let the user wite his own build rules with system of choice
b/ automate it for cmake based projects? request only include dir's and 
libraries/objects to link to.

Option a is the easiest implementation wise but not so user friendly. If this 
route is taken 1. is a non-issue ... Maybe support this first and extend to 
b/ later.

3. How to determine the entry points and actually execute the tests?

a/ run seperate executables for the different tests, not optimal at all ... 
slow
b/ use dynamic linking to inject the freshly compiled test objects eg with 
QLibrary/QPluginLoader

Option b is preferable for sure, easy for CppUnit. Much faster both while 
compiling and linking + when actually executing. Trouble with QtTest since it 
only supports building executable(s). Might get funny with PyUnit ... maybe 
it's better to wait for Kross support?

4. How to fetch the test results and pipe them into qxrunner?

this depends on the route taken for 3, obviously.

a/ if using seperate executables, produce xml results and stream parse it back 
in, which will be slow (eg with QXmlStreamReader)
b/ if using dlsym/open and friends this is easy just use some TestResult-like 
class directly

When looking at these the main problem is QtTest's limited interface. All the 
internals are private, the only real link is qExec + the convention that 
commands are private slots. To bypass this either (i) a slow hacky route 
needs to be taken (compile into executable(s) -> run seperatly -> parse XML 
results), or (ii) duplicate (ie fork) QTestLib and make the internals public, 
possible tweak a bit here and there as well. Backwards compatibility with the 
original QTestLib will be crucial obviously. This will be easy though, 
exactly because of the extremly low coupling. (iii) motivate Trolltech to 
expose more of the internals, not going to happen.


pff a wee bit too long.


Manuel




More information about the KDevelop-devel mailing list