t2 | t5 | t3 | t1 | t4 | t6 | |
m2 | 1 | 1 | ||||
m5 | 1 | 1 | ||||
m3 | 1 | 1 | ||||
m1 | 1 | 1 | ||||
m4 | 1 | 1 |
Um in der derart zerlegten Abdeckungsmatrix nach Fehlern zu suchen, müssen nacheinander oder parallel 4 Blöcke durchsucht werden. Da drei von ihnen aus lediglich einer einzelnen Methode bestehen, müssen im Grunde nur die Methoden m2 und m5 betrachtet werden (die anderen sind ja garantiert fehlerhaft); dies stellt allerdings eher einen beispielbedingten Sonderfall dar – in der Praxis würden die meisten Blöcke mehr als eine Methode enthalten und müssten dementsprechend dann explizit durchsucht werden, was jedoch immer noch eine gewaltige Ersparnis an Suchaufwand bedeutet. Eine derartige Zerlegung einer Matrix kann übrigens als Mengenpackungsproblem aufgefasst und mit entsprechenden Algorithmen gelöst werden (auf die Niederschrift desselben verzichte ich einmal, reiche sie auf Wunsch aber gerne nach – auch sie ist nicht sonderlich kompliziert).
Aufmerksame Leser werden übrigens an dieser Stelle natürlich erkannt haben, dass m1 und m4 in jedem Fall beide einen Fehler enthalten, da beide Methoden durch jeweils einen Test exklusiv aufgerufen werden; der Test t1 ruft lediglich m1 auf, wohingegen t6 nur m4 aufruft. Ruft ein fehlschlagender Test lediglich eine einzige Methode auf, so muss diese natürlich auch zwangsläufig einen Fehler enthalten. Dieser Test kann zum verkürzen der Suche benutzt werden, reicht aber in der Regel nicht aus, wie der erste Block (und die Praxis – kaum ein Test ruft eine einzelne Methode auf) gezeigt haben.
Blockdiagonalmatrizen und eine darauf aufbauende weitere Zerlegung bieten sich demzufolge geradezu an, eine gegebene Abdeckungsmatrix derart zu zerlegen, dass auf eine in ihr mindestens enthaltene Anzahl von Fehlern geschlossen werden kann und sogar, wo sich diese Fehler ungefähr befinden. Die hierfür bereits existierenden Algorithmen sind jedoch relativ komplex – wie ich in diesem Artikel gezeigt habe, lässt sich das Ziel auch deutlich einfacher erreichen! In der Praxis wird dieser Ansatz meines Wissens bisher kaum bis gar nicht verwendet, was allerdings primär daran liegt, dass die verbreiteten Programmierwerkzeuge ihn schlicht nicht zur Verfügung stellen. Sollte sich jemand dazu berufen fühlen, Eclipse, Visual Studio oder eine andere IDE um einen derartigen praktisch anwendbaren Ansatz zu erweitern (im Rahmen meiner Dissertation sind natürlich Umsetzungen entstanden – nur praxistauglich sind diese nur bedingt), sei er an dieser Stelle herzlichst dazu ermutigt!
Kommentare (10)