Auf den ersten Blick lässt sich hier nicht viel erkennen. Wir können die Matrix allerdings auch etwas umsortieren, und zwar auf die folgenden Weise:
t2 | t3 | t5 | t1 | t4 | t6 | |
m2 | 1 | 1 | ||||
m5 | 1 | 1 | ||||
m3 | 1 | 1 | ||||
m1 | 1 | 1 | ||||
m4 | 1 | 1 |
Alles, was ich gemacht habe, ist, Zeilen und Spalten in der Matrix zu vertauschen, also sie zu permutieren – und zwar so, dass die Zeilen und Spalten in der Matrix derart angeordnet werden, dass sie voneinander unabhängige Blöcke bilden. Hier die Matrix noch einmal, diesmal mit den markierten Blöcken:
t2 | t5 | t3 | t1 | t4 | t6 | |
m2 | 1 | 1 | ||||
m5 | 1 | 1 | ||||
m3 | 1 | 1 | ||||
m1 | 1 | 1 | ||||
m4 | 1 | 1 |
Eine derartige Matrix nennt sich Blockdiagonalmatrix oder kurz BDM. (Ein wichtiger Hinweis für mitlesende Mathematiker: Blockdiagonalmatrizen sind in der Mathematik üblicherweise quadratisch mit ebenfalls quadratischen Blöcken! In der Informatik müssen wir es mit derartigen Definitionen allerdings nicht ganz so genau nehmen und können auch nichtquadratische Matrizen als BDMs bezeichnen!) Der Name rührt daher, dass die Matrix aus diagonal angeordneten Blöcken besteht und nur in diesen Blöcken nichtleere Elemente (also Zellen, in denen eine “1” eingetragen ist) enthält.
Für die Fehlersuche hilft uns dies folgendermaßen: Durch die Blöcke wissen wir, dass jeder Test eines Blocks ausschließlich auch Methoden dieses Blocks und keine Methoden eines anderen Blocks aufruft. Ebenso wissen wir, dass alle Methoden eines Blocks ausschließlich von den Tests des gleichen Blocks aufgerufen werden. Dies bedeutet aber auch, dass jeder Block mindestens eine fehlerhafte Methode enthalten muss. Und warum? Ganz einfach: Enthält eine Methode eines Blocks einen Fehler, so kann sie höchstens das Fehlschlagen aller Tests in ihrem Block erklären, nicht aber das fehlschlagen von Tests anderer Blöcke, denn diese rufen die Methode ja überhaupt nicht auf, müssen also zwangsläufig eine andere Fehlerursache haben. Da jeder Block unabhängig von den anderen ist, muss es im Programm mindestens so viele Fehler wie Blöcke geben. Ein Programmierer kann also zuerst alle Methoden des ersten Blocks nach einem Fehler durchsuchen (die wiederum durch einen Fehlerlokator wie Tarantula sortiert werden können!), nach dem Fund des Fehlers anschließend alle Methoden des zweiten Blocks und so weiter, bis alle Blöcke abgearbeitet sind. Stehen genügend Programmierer zur Verfügung, können sie die einzelnen Blöcke sogar parallel abarbeiten!
Die Permutation einer Matrix in eine Blockdiagonalmatrix ist trivial (Überlegungen zum Algorithmus überlasse ich den Lesern – sie können gern in den Kommentaren diskutiert werden) und mit relativ wenig Rechenaufwand zu erreichen. Sie bilden damit ein gutes Mittel, um aus einer ursprünglich unübersichtlichen Abdeckungsmatrix eine strukturierte Suche nach Fehlern zu erlauben. Allerdings sind wir an dieser Stelle noch nicht fertig, denn aus der obigen Matrix können wir noch mehr Informationen herausfiltern.
Schauen wir uns zum Beispiel den zweiten Block, bestehend aus den Methoden m1 und m4 an, so stellen wir fest, dass keine von beiden Methoden, sollte sie denn einen Fehler enthalten, das Fehlschlagen aller Tests des Blocks erklärt. Vielmehr erkennen wir, dass beide Methoden fehlerhaft sein müssen, denn nur so wird auch das Fehlschlagen beider Tests erklärt. Den gleichen Ansatz können wir für den ersten Block anwenden: keine der Methoden des Blocks würde, falls sie denn einen Fehler enthält, das Fehlschlagen aller Tests dieses Blocks erklären. Mindestens müssen sowohl m3 als auch entweder m2 oder m5 einen Fehler enthalten, um alle Fehlschläge erklären zu können. Wir können demzufolge die Matrix sogar noch feiner in Blöcke unterteilen (es handelt sich hierbei natürlich nicht mehr um eine Blockdiagonalmatrix):
Kommentare (10)