Was sind Fehler – heute
Wenn wir ein Programm testen, stoßen wir auf Fehler. Bevor wir aber wissen, dass es sich um einen Fehler handelt, merken wir nur, dass wir als Tester auf etwas Unerwartetes stoßen. Etwas passiert nicht so, wie wir es erwarten.
Dies trifft auch auf automatische Testdurchführung zu. Das Ergebnis des Testdurchlaufes stimmt nicht mit einem vorgegebenen Resultat überein.
Jetzt stellt sich heraus, dass ein beobachteter Effekt zwei verschiedene Kriterien erfüllen muss, um als Fehler klassifiziert zu werden.
- Er überrascht uns. Wir selbst glauben, dass etwas falsch ist.
- Es herrscht Konsens von mehreren Seiten, dass hier etwas unrichtig ist.
Liegt nur die erste Bedingung vor, so verwenden wir besser einen anderen Begriff. In mehreren Firmen wird der Begriff PROBLEM bevorzugt.
Ein PROBLEM ist eine Unstimmigkeit, die aufgelöst gehört.
Die zweite Bedingung spricht von mehreren Seiten. Damit ist der Tester (T), der Entwickler (E) und der Anforderer (A, der Vertreter des Auftraggebers, welcher die Funktionalität des Programmes beschrieben hat) gemeint. Es ergeben sich jetzt folgende Möglichkeiten:
(In untenstehender Notation bedeutet 0, dass kein PROBLEM festgestellt wurde, 1 hingegen, dass die jeweilige Person einen Fehler konstatiert.)
- T=0 E=0 A=0 Es wird kein PROBLEM und auch kein Fehler konstatiert.
- T=0 E=0 A=1 Eine unangenehme Situation, die aber nicht im Zuge des Testens erkannt wird. Hier handelt es sich um eine Entwicklung auf ein „moving target“, dieser Umstand verteuert jede Software-Entwicklung.
- T=0 E=1 A=0 In dieser Situation freut sich der Entwickler, der selbst irgendwann seinen eigenen Implementierungsfehler festgestellt hat, dass sonst noch niemand seinen Fehler entdeckt hat. Er wird versuchen, die Nachbesserung in die nächste Version einfließen zu lassen.
- T=0 E=1 A=1 Das ist eine Testsituation, bei der nicht das Programm sondern die Testdurchführung getestet wurde. Bewusst eingebaute Fehler sollen die Zuverlässigkeit des Software-Tests überprüfen. Ich habe diesen Fall in der Realität noch nie vorgefunden, doch wird er in manchen Vorträgen über Software-Test erwähnt. Die Vorgangsweise der bewussten Fehlereinstreuung ist bei Hardwaretests immer dann notwendig, wenn es um sensible und lebensbedrohende Apparaturen geht.
- T=1 E=0 A=0 Ein Streitfall. Hier steht der Tester gegen den Rest der Welt. Solche PROBLEME bleiben ungelöst, wenn der Tester nicht überzeugt werden kann, dass seine Beanstandung falsch gewesen ist.
- T=1 E=0 A=1 Ein Entwicklungsfehler. Etwas ist in der Implementierung falsch. Nun kann das Problem als ERROR klassifiziert werden. Der Anforderer muss oft gar nicht konsultiert werden, wenn der Entwickler bereits selbst mit der ERROR-Klassifikation übereinstimmt.
- T=1 E=1 A=0 Ein Fehler in der Anforderung. Der ursprüngliche Wunsch des Anforderers war sachlich unrichtig. Aus Gründen der Unterscheidbarkeit und auch wegen der unterschiedlichen Behandlung bei der Korrektur wird hier nicht von ERROR gesprochen sondern von einer Anforderungsänderung – CHANGE REQUEST
- T=1 E=1 A=1 Auch hier tritt der Fall der Anforderungsänderung ein. Es wird aber in der Regel keine langatmige Diskussion mit dem Anforderer notwendig sein.
(Über CHANGE-REQUEST wird später noch gesprochen.)
Wenn wir nun die unterschiedlichen Fälle betrachten, so stellen wir fest, dass in einigen Fällen die Zusammenarbeit von Entwicklern und Testern in eine Streiterei ausarten kann. Der Entwickler gibt ungern einen Fehler zu, der Tester wird an der Anzahl der gefundenen Fehler gemessen und „freut sich“, wenn er wieder etwas gefunden hat. Der Entwickler kann allenfalls auf CHANGE-REQUEST plädieren, womit der schwarze Peter dem Anforderer zugespielt wird. Dieser hat an sich eine Grundverantwortung über die Richtigkeit eines Programmes. Er kann sich also höchstens aufregen, warum man diesen Fehler nicht schon viel früher entdeckt hat.
Hier muss zur Verteidigung des Anforderers festgestellt werden, dass manche Effekte erst dann wirklich sichtbar werden, wenn man sie mit eigenen Augen am Bildschirm sieht. Man kann auch sagen, wenn die Vorstellung Gestalt angenommen hat, werden Fehler erst sichtbar.
Wenn wir bei komplexeren Programmen mit mehreren Tausend PROBLEMEN zu tun haben, wird es notwendig sein, dass die Vorgangsweise im Fall 5 und 7 reglementiert wird. Es darf nicht zu mehreren Tausend Streitigkeiten kommen.
Hier bestimmt die Kultur eines Software-Hauses die Effizienz des gesamten Teams. Wird das Gesamtziel in den Vordergrund gestellt, so darf die Produktivität des Testvorganges nicht an der Anzahl der gefundenen Fehler gemessen werden.
Viel mehr ist derjenige Tester der erfolgreichste, welcher die meisten Fehler behoben bekommt.
Damit wird dem Tester aber auch die Aufgabe zugeteilt, das aufgetretene PROBLEM so umfassend wie möglich zu beschreiben, damit die Reproduzierung des PROBLEMs und die Behebung für den Entwickler erleichtert werden.
Darüber hinaus führt diese Überlegung zum Begriff des Schweregrads eines Fehlers. Dieser wird später behandelt.

Dienstag, Januar 22, 2008 at 3:49 pm
Interessant finde ich die Kriterien zur Fehlerklassifikation. Das sind eher auf den sozialen Bereich abstellende Definitionen, potentiell auch 1., wenn ich die programmierte Maschine gescheit genug mache, um sie als Sozius durchgehen zu lassen. Ich frage mich, ob man die Kriterien nicht stärker formalisieren kann.
Die Tätigkeiten des A und des E sind kongruent, allerdings arbeitet E auf einer niedrigeren Abstraktionsebene. Beide beschreiben Prozesse. Also ist das erste große Ziel, den E durch eine Maschine zu ersetzen, die die Sprache des A versteht. In Wahrheit kennt ja auch heute kaum ein E die Sprache seiner Maschinen, sondern ist auf Übersetzungen angewiesen, die von Maschinen erledigt werden.
Der überflüssig gewordene E wird dann wahrscheinlich die Rolle eines T einnehmen. Aber auch dessen Aufgaben könnte eine Maschine übernehmen. Also entwerfe ich ein Szenario, in dem nur mehr A verbleibt, der mit Maschinen (E+T) interagiert. Sobald dieses realisiert ist, erübrigen sich soziale Erwägungen (sofern man die Maschinen nicht als Sozius gelten läßt).
Bei der Beschreibung der Maschinen ist ihr „Konsens“ unproblematisch beschreibbar. Wie aber beschreibe ich, was für eine Maschine etwas „Unerwartetes“ ist?
„Wir selbst glauben, dass etwas falsch ist.“
Wenn ich eine Sprache hätte, um mit Maschinen zu interagieren, diese Sprache solche Formulierungen erlaubte, und die Maschine sie verstände — dann hätte ich bereits eine Maschine, die die Arbeit von T und E übernehmen könnte. Weil ich aber solche Formulierungen brauche, um eine solche Maschine zu beschreiben, wittere ich da einen Selbstbezug. Den kann man also, denke ich, nur durch stärkere Formalisierung auflösen. Daraus entwickle ich die Theorie, daß die obgenannten Kriterien nur Spezialfälle eines allgemeineren Prinzips sind, das es zu formulieren gilt.