Warum betrachtet Cem Kaner einen Test, der einen Fehler nicht aufdeckt, als Zeitverschwendung?

15

Wie wäre es, die Funktionalität in positiven Tests zu bestätigen und zu beweisen, dass sie funktioniert - sollte ich sagen, dass es Zeitverschwendung ist? Was für ein Konzept steckt hinter diesem Zitat?

Nicht erfolgreiche Tests, dh Tests, die keine Fehler finden, sind Zeitverschwendung.

Web Engineering: Die Disziplin der systematischen Entwicklung von Webanwendungen unter Berufung auf Cem Kaner .

John V
quelle
2
Nicht wirklich. Kaner behauptet, dass Tests im Allgemeinen nur Mängel aufdecken sollten.
John V
4
Das ist eine sehr akademische Position. Herr Kaner und Herr Schrödinger müssen sich irgendwann auf eine Tasse Kaffee setzen.
Blrfl
2
@Blrfl einziges Problem dabei ist, dass Herr Schrödinger tot ist. Oh, warte ... ähm ...
Ikmac
1
Diese Aussage ohne Kontext klingt wahnsinnig dumm ...
Rig
1
"Bestätigung der Funktionalität in positiven Tests" - Dies ist grundsätzlich nicht möglich. Man kann etwas nicht richtig beweisen, man kann es nur falsch beweisen.
Konrad Rudolph

Antworten:

37

Ich habe vor über 25 Jahren einen Großteil von Testing Computer Software geschrieben. Ich habe seitdem auf einige Teile des Buches hingewiesen, die ich für veraltet oder einfach falsch halte. Siehe http://www.kaner.com/pdfs/TheOngoingRevolution.pdf

Weitere Informationen (aktuelle Ansichten, jedoch ohne ausdrücklichen Hinweis auf TCS) finden Sie auf meiner Website für den Black Box-Softwaretestkurs (Videos und Folien kostenlos verfügbar) unter www.testingeducation.org/BBST

Die damalige Testkultur war weitgehend bestätigend.

In modernen Tests ist der Ansatz für Komponententests weitgehend bestätigend - wir schreiben große Sammlungen automatisierter Tests, die lediglich überprüfen, ob die Software weiterhin die beabsichtigte Leistung erbringt. Die Tests dienen als Änderungsmelder - wenn etwas in anderen Teilen des Codes und in diesem Teil jetzt Probleme hat oder wenn Datenwerte, die früher in der realen Welt unmöglich waren, jetzt die Anwendung erreichen, werden die Änderungsmelder ausgelöst und alarmiert Programmierer auf ein Wartungsproblem.

Ich denke, die bestätigende Denkweise ist für Unit-Tests geeignet, aber stellen Sie sich eine Welt vor, in der alle Systemtests bestätigend waren (für Leute, die eine Unterscheidung treffen, interpretieren Sie bitte "Systemintegrationstests" und "Akzeptanztests", wie in meinen Kommentaren zum System enthalten Testen.) Der Zweck des Testens bestand darin, zu bestätigen, dass das Programm seinen Spezifikationen entsprach, und der vorherrschende Ansatz bestand darin, zig (oder zumindest einige hundert) Regressionstests auf Systemebene zu erstellen, mit denen Teile der Spezifikation Verhaltensweisen des Programms zugeordnet wurden. (Ich denke, die Bestätigung der Verhaltensspezifikation ist nützlich, aber ich denke, es ist ein kleiner Teil eines größeren Ziels.)

Es gibt immer noch Testgruppen, die so vorgehen, aber es ist nicht mehr die vorherrschende Ansicht. Damals war es. Ich schrieb nachdrücklich und zeichnete scharfe Kontraste, um auf Menschen hinzuweisen, die konsequent in dieser Denkweise geschult wurden. Einige der scharfen Kontraste (einschließlich des hier zitierten) sind heute veraltet. Sie werden als Angriffe auf die falschen Ansichten missverstanden.

Aus meiner Sicht ist das Testen von Software ein empirischer Prozess zum Erlernen qualitätsbezogener Informationen über ein Softwareprodukt oder eine Dienstleistung.

Ein Test sollte nützliche Informationen enthalten.

Damals sprach übrigens niemand davon, Tests als Methode zur Offenlegung von "Informationen" zu verwenden. Damals bestand das Testen entweder darin, (eine Version von ...) Fehler zu finden oder (eine Version von ...) das Programm anhand von Spezifikationen zu überprüfen (zu überprüfen). Ich glaube nicht, dass die Behauptung, Tests dienten dazu, nützliche Informationen preiszugeben, erst in diesem Jahrhundert in das Testvokabular aufgenommen wurde.

Stellen Sie sich Bewertungstests anhand ihres Informationswertes vor. Ein Test, der uns mit großer Wahrscheinlichkeit etwas beibringt, was wir nicht über die Software wissen, hätte einen sehr hohen Informationswert. Ein Test, der sehr wahrscheinlich etwas bestätigt, was wir bereits erwartet haben und der bereits viele Male zuvor demonstriert wurde, hätte einen geringen Informationswert. Eine Möglichkeit, Tests zu priorisieren, besteht darin, Tests mit höherem Informationswert vor Tests mit niedrigerem Informationswert durchzuführen.

Wenn ich diese Priorisierung zu stark vereinfachen würde, um die Aufmerksamkeit eines Programmierers, Projektmanagers oder Prozessmanagers auf sich zu ziehen, der keine Ahnung von Softwaretests hat, würde ich sagen: "EIN TEST, DER NICHT FÜR DIE ENTWICKLUNG EINES BUGS BESTIMMT IST, IST EINE ZEITVERLUST . " Es ist keine perfekte Übersetzung, aber für Leser, die keine Feinheiten oder Qualifikationen verstehen können oder wollen, ist das so nah wie möglich.

Damals, und ich sehe es hier wieder, haben einige Leute, die das Testen nicht verstehen, geantwortet, dass ein Test zum Auffinden von Eckfällen eine Zeitverschwendung ist, verglichen mit einem Test der Hauptnutzung einer Hauptfunktion. Sie verstehen zwei Dinge nicht. Erstens, bis die Zeittester Zeit finden, um Grenzwerte zu prüfen, wurden die Hauptverwendungen der Hauptfunktionen bereits mehrmals ausgeführt. (Ja, es gibt Ausnahmen, und die meisten Testgruppen werden diese Ausnahmen sorgfältig berücksichtigen.) Zweitens besteht der Grund für das Testen mit Extremwerten darin, dass das Programm mit größerer Wahrscheinlichkeit bei Extremwerten fehlschlägt. Wenn es nicht im Extremfall versagt, testen Sie etwas anderes. Dies ist eine effiziente Regel. Wenn es andererseits bei einem extremen Wert fehlschlägt, stoppt der Tester möglicherweise und meldet einen Fehler, oder der Tester führt eine weitere Fehlerbehebung durch. um zu sehen, ob das Programm bei normaleren Werten auf die gleiche Weise fehlschlägt. Wer diese Fehlerbehebung durchführt (Tester oder Programmierer), ist eine Frage der Unternehmenskultur. Einige Unternehmen planen die Zeit des Testers dafür ein, einige planen die Programmierer ein, und einige erwarten, dass Programmierer Eckfehler beheben, unabhängig davon, ob sie verallgemeinerbar sind oder nicht, sodass die Fehlerbehebung nicht relevant ist. Das verbreitete Missverständnis, dass Tester Zeit verschwenden (anstatt die Effizienz zu maximieren), indem sie Extremwerte testen, ist ein weiterer Grund dafür, dass "ein Test, der keinen Fehler aufdeckt, eine Zeitverschwendung ist", eine angemessene Botschaft für Tester ist. Dies ist ein Kontrapunkt zu der Aufforderung einiger Programmierer, (im Endeffekt) niemals Tests durchzuführen, die das Programm herausfordern könnten. Die Nachricht ist zu stark vereinfacht, aber die gesamte Diskussion ist zu stark vereinfacht.

Übrigens kann "Informationswert" nicht das einzige Priorisierungssystem sein. Es ist nicht meine Regel, wenn ich Komponententestsuiten entwerfe. Es ist nicht meine Regel, wenn ich Build-Verifikationstests entwerfe (auch bekannt als Sanity Checks). In beiden Fällen interessiert mich eher die Art der Berichterstattung als die Stärke der einzelnen Tests. Es gibt andere Fälle (z. B. hochvolumige automatisierte Tests, die kostengünstig einzurichten, auszuführen und zu überwachen sind), in denen die Leistung einzelner Tests für mein Design einfach irrelevant ist. Ich bin sicher, Sie können sich weitere Beispiele vorstellen.

Wenn ich jedoch nur eine Regel aufstellen könnte (z. B. mit einer Führungskraft sprechen, deren Kopf explodiert, wenn sie versucht, mehr als einen Satz zu verarbeiten), wäre ein Test mit niedrigem Informationswert in der Regel Zeitverschwendung.

Cem Kaner
quelle
4
+1, wenn Sie sich die Zeit nehmen, eine Frage zu beantworten, für die Sie die maßgebliche Quelle sind, und wenn Sie meine Verwendung des Begriffs "Build Verification Tests" bestätigen, für den mich so viele Leute lustig finden ... Immer schön, Leute zu sehen Ihre Statur Zeit nehmen, um Menschen hier zu helfen
Jimmy Hoffa
1
Eric G: Ich denke, wenn Sie noch einmal lesen, werden Sie sehen, dass Cem als Teil des Leserverständnisses feststellt, dass sich seine Sicht auf das Thema im Laufe der Zeit entwickelt hat. Oder Sie können einfach weiter machen und Subtilität und Qualifikationen ignorieren, um Cem zu paraphrasieren. (und ich nehme "Qualifikationen" nicht als seine Referenzen, sondern als Ausnahmen.)
Jim Holmes
Ihr Zitat erinnert mich an etwas, das ich in Bezug auf die Wissenschaft beobachtet habe: Man kann eine wissenschaftliche Theorie nicht beweisen (oder sogar sinnvoll unterstützen), indem man Experimente durchführt, von denen man erwartet, dass sie mit der Theorie übereinstimmende Ergebnisse liefern. Die Möglichkeit, eine Theorie zu unterstützen, besteht darin, sich ernsthaft um Geräteexperimente zu bemühen, die sie nicht unterstützen, aber nicht unterstützen können.
Supercat
@supercat Sie können eine Theorie mit einem Test für etwas unterstützen, das mit der Theorie übereinstimmt, wenn der Test Ihnen vor der Theorie nicht in den Sinn gekommen wäre (z. B. die Beschleunigung eines in ein Vakuum fallenden Objekts so darzustellen, wie Sie es berechnen würden) sagt mehr als zu zeigen, dass es runterfällt). Edge-Case-Tests sind analog; Ich könnte erwarten, dass sich die Software beim Umgang mit extremen Werten korrekt verhält, aber es gibt mehr Vertrauen in die Qualität, wenn dies geschieht, als Eingabewerte zu wiederholen, die es wahrscheinlich während der Entwicklung gesehen hat, und es ist wahrscheinlicher, dass es einen Fehler gibt.
Jon Hanna
@ JonHanna: Meine Formulierung war schlecht: Das Problem ist nicht die Erwartung, sondern der Aufwand. Man kann eine Theorie nicht beweisen, indem man versucht , Tests zu finden, die bestanden werden. Man muss sich ernsthaft darum bemühen, Tests zu finden, die fehlschlagen, wenn sie ungültig sind.
Supercat
11

Kaner zufolge lautet die Idee: "Da Ihnen die Zeit ausgeht, bevor die Testfälle ausgehen, ist es wichtig, die verfügbare Zeit so effizient wie möglich zu nutzen."

Das Konzept hinter dem Zitat, nach dem Sie fragen, wird ausführlich in dem Artikel über das Testen von Computersoftware von Cem Kaner , Jack Falk und Hung Quoc Nguyen im Kapitel "DIE ZIELE UND GRENZEN DES TESTS" vorgestellt und erläutert :

WARUM TESTEN?

Sie können nicht alle Fehler finden. Sie können nicht beweisen, dass das Programm korrekt ist, und Sie möchten nicht. Es ist teuer, frustrierend und gewinnt keine Beliebtheitswettbewerbe. Warum also testen?

ZWECK EINES PROGRAMMS ZU PRÜFEN IST, PROBLEME IN IHM ZU FINDEN

Das Auffinden von Problemen ist der Kern Ihrer Arbeit. Sie sollten so viele wie möglich finden wollen; Je ernsthafter das Problem, desto besser.

Da Ihnen die Zeit ausgeht, bevor die Testfälle ausgehen, ist es wichtig, die verfügbare Zeit so effizient wie möglich zu nutzen. In den Kapiteln 7, 8, 12 und 13 werden die Prioritäten ausführlich behandelt. Das Leitprinzip kann einfach ausgedrückt werden:


Ein Test, der ein Problem aufdeckt, ist ein Erfolg. Ein Test, bei dem kein Problem festgestellt wurde, war Zeitverschwendung.


Betrachten Sie die folgende Analogie von Myers (1979). Angenommen, mit dir stimmt etwas nicht. Du gehst zu einem Arzt. Er soll Tests durchführen, herausfinden, was falsch ist, und Korrekturmaßnahmen empfehlen. Er führt Test für Test für Test durch. Am Ende kann er nichts falsch machen. Ist er ein großartiger Tester oder ein inkompetenter Diagnostiker? Wenn Sie wirklich krank sind, ist er inkompetent und all diese teuren Tests waren eine Verschwendung von Zeit, Geld und Mühe. In der Software sind Sie der Diagnostiker. Das Programm ist der (mit Sicherheit) kranke Patient ...


Sie sehen, der Punkt von oben ist, dass Sie Ihre Tests mit Bedacht priorisieren sollten. Das Testen wird voraussichtlich eine begrenzte Zeit in Anspruch nehmen und es ist unmöglich, alles in der angegebenen Zeit zu testen .

Stellen Sie sich vor, Sie haben einen Tag (Woche, Monat) damit verbracht, Tests durchzuführen, keine Fehler zu finden und einige Fehler durchzulaufen, weil Sie keine Zeit hatten, einen Test durchzuführen, der dies aufdeckte. In diesem Fall können Sie nicht einfach sagen, dass es nicht meine Schuld ist, weil ich gerade mit anderen Tests beschäftigt war, um dieses Versäumnis zu rechtfertigen. Wenn Sie dies sagen, werden Sie dennoch zur Verantwortung gezogen.

Sie haben Zeit damit verschwendet, Tests durchzuführen, bei denen keine Fehler festgestellt wurden. Aus diesem Grund haben Sie einen Test verpasst, bei dem ein Fehler gefunden wurde.

(Falls Sie sich fragen, sind Fehlschläge wie oben im Allgemeinen unvermeidbar, egal wie Sie es versuchen, und es gibt Möglichkeiten, mit diesen umzugehen, aber das wäre eher ein Thema für eine separate Frage ... und wahrscheinlich besser für SQA geeignet. SE.)

Mücke
quelle
12
Diese Antwort stellt seine Position korrekt dar, aber es sollte darauf hingewiesen werden, dass viele Leute denken, seine Position sei falsch. Angesichts der Wahl zwischen einem Test, der die wichtigste Funktion in der App demonstriert, funktioniert er korrekt (Akzeptanztest, wenn Sie so wollen) und einem Test, der in einer selten genutzten Ecke der App einen geringfügigen Fehler (Ausrichtung um ein Pixel) findet weiß, welche ich in meiner begrenzten Zeit wählen würde. Und für die Ärzteanalogie: Wenn ich eher zu einem Check als zu einer Reaktion auf Symptome gehe, ist die Bestätigung, dass das Herz gut ist, die Lungen gut usw. usw. ein gutes Ergebnis. Also da.
Kate Gregory
@KateGregory Ich stimme zu, ich denke das gleiche. Ich finde seine Meinung auf jeden Fall falsch, wir testen hauptsächlich, um Informationen zu sammeln.
John V
2
@KateGregory stimmt zu - Ich denke nicht, dass es richtig ist, einen bestandenen Test als totale Verschwendung zu kennzeichnen. Ich denke jedoch, dass ein Punkt, den er hervorhebt, zeitlos ist : Wenn der Fehler durch die Veröffentlichungstests gleitet, würde die Qualitätssicherung mehr als "oh, aber wir waren damit beschäftigt, andere Tests durchzuführen" , um ihnen den Rücken zu kehren. Ich habe als Tester selbst in der Vergangenheit durchgemacht, und sehen dies um jetzt , dass ich ein Entwickler bin, und ich glaube nicht , es wird immer fade away
gnat
4

Nun, ich kenne Mr. Caner nicht, aber IMHO

Tests, die möglicherweise keine Fehler finden

sind Zeitverschwendung. Dies schließt die Situation ein, in der Sie bereits einige Tests haben (es spielt keine Rolle, ob diese automatisch oder nur auf einer Checkliste stehen), und Sie fügen neue Tests hinzu, die im Wesentlichen dieselben Fälle validieren, die Sie bereits haben. So finden Ihre neuen Tests nicht mehr Fehler als die vorhandenen.

Eine solche Situation kann zum Beispiel auftreten, wenn Sie einfach durch eine zufällige Liste - ich könnte auch "hirnlos" sagen (verzeihen Sie mir dieses Wort) - Testfälle in Ihrem Programm auswählen, ohne zu überlegen, ob sie neuen Randfall, neue Äquivalenz prüfen Klassen Ihrer Eingabedaten, oder wenn sie die Codeabdeckung in Bezug auf die bereits geschriebenen Tests erhöhen.

Doc Brown
quelle
-1

Meiner Meinung nach bezieht sich dieses Zitat auf zu allgemeine oder Unrobust-Tests.

Wenn Sie einen Test für eine Funktion durchführen, die E-Mails überprüft, und für den Test nur gültige E-Mails bereitstellen, ist dieser Test völlig unbrauchbar. Sie müssten diese Funktion auf "beliebige" Zeichenfolgen testen, möglicherweise ungültige E-Mails, zu lange E-Mails, Unicode-Zeichen (áêñç ....)

Wenn Sie einen Test codieren, der nur prüft, ob [email protected] true und name @ com false zurückgibt, ist dieser Test derselbe wie überhaupt kein Test.

Juanmi Rodriguez
quelle