Sind Programmierer schlechte Tester?

36

Ich weiß, das hört sich sehr nach anderen Fragen an, die bereits gestellt wurden, aber es ist tatsächlich etwas anders. Es wird allgemein angenommen, dass Programmierer nicht gut darin sind, eine Anwendung zu testen. Beispielsweise:

Joel über Software - Die fünf wichtigsten (falschen) Gründe, warum Sie keine Tester haben (Schwerpunkt meiner)

Denken Sie nicht einmal daran, Hochschulabsolventen zu sagen, dass sie für Sie arbeiten können, aber "jeder muss eine Weile in der Qualitätssicherung bleiben, bevor er zum Code übergeht". Ich habe viel davon gesehen. Programmierer sind keine guten Tester , und Sie verlieren einen guten Programmierer, der viel schwerer zu ersetzen ist.

Und in dieser Frage sagt eine der beliebtesten Antworten (wieder meine Betonung):

Entwickler können Tester sein, aber sie sollten keine Tester sein. Entwickler neigen dazu, unbeabsichtigt / unbewusst zu vermeiden, die Anwendung auf eine Weise zu verwenden, die sie beschädigen könnte. Das liegt daran, dass sie es geschrieben und größtenteils so getestet haben, wie es verwendet werden sollte.

Die Frage ist also, ob Programmierer schlecht testen können. Welche Beweise oder Argumente stützen diese Schlussfolgerung? Sind Programmierer nur schlecht darin, ihren eigenen Code zu testen? Gibt es Hinweise darauf, dass Programmierer wirklich gut testen können?

Was meine ich mit "testen"? Ich meine nicht Unit-Tests oder irgendetwas, das als Teil der vom Software-Team zum Schreiben von Software verwendeten Methodik betrachtet wird. Ich meine eine Art Qualitätssicherungsmethode, die verwendet wird, nachdem der Code erstellt und in der von diesem Softwareteam als "Testumgebung" bezeichneten Umgebung bereitgestellt wurde.

jhsowter
quelle
17
@jshowter Programmierer sind am schlechtesten, wenn sie ihren eigenen Code testen, während sie brillant sind, wenn sie anderen Code testen. Tester (gute Tester) sind selbst auf ihre Weise Programmierer (da sie die Programmierlogik und ihre Funktionalität verstehen müssen), mit der Ausnahme, dass sie nicht zu viel Code schreiben. Ich glaube, das hat mehr mit Psychologie zu tun, da ich immer zögere, Zweifel in meiner eigenen Arbeit zu finden, wie schlimm es auch sein mag.
Ubermensch
6
@Ubermensch, ich bin nicht einverstanden damit, dass Entwickler standardmäßig brillante Tester für den Code anderer sind. Einige Entwickler haben bereits einige Zeit mit dem Testen geübt. Es erfordert eine andere Denkweise und auch eine andere Art von Motivation, was für Entwickler im Allgemeinen überhaupt nicht offensichtlich ist. Viele Entwickler konzentrieren sich in der Regel auf den Codierungsteil und genießen ihn am meisten. Sie sind sich möglicherweise der Bedeutung anderer Aktivitäten innerhalb des vollständigen SDLC nicht bewusst.
Péter Török,
1
@jshowter Wenn Sie nach harten Fakten / Forschungsdaten suchen, kann ich keine finden. Die meiste Literatur bezieht sich auf Agile Development und konnte keine finden, die Ihrem speziellen Fall entspricht. Sie können es bei Google Scholar oder Scirus versuchen.
Ubermensch,
3
Wir sind keine schlechten Tester! Es hat auf meinem PC funktioniert! ;-)
Joris Timmermans
2
@MadKeithV Ha! Dies ist mein JIRA (Issue Tracker) Avatar;)
Yannis

Antworten:

39

Die Frage scheint sich speziell um Systemtests zu drehen , also beziehe ich mich in dieser Antwort darauf.

Ich denke, es gibt einen wichtigen Unterschied zwischen schlechten Testpersonen und schlechten Testpersonen.

Warum Programmierer schlecht testen:

  • Wenn Sie den Code geschrieben haben, (sollten) Sie bereits überlegt haben, auf welche Weise etwas schief gehen könnte, und haben sich damit befasst.
  • Wenn das Auffinden eines besonders heiklen Fehlers bedeutet, dass Sie ihn dann beheben müssen, in einer Codebasis, die Sie möglicherweise satt haben, hilft das Ihrer Motivation nicht.

Warum Programmierer gut testen können:

  • Programmierer neigen dazu, logisch zu denken und systematisch zu arbeiten.
  • Erfahrene Programmierer sind sehr gut darin, Randfälle schnell zu identifizieren und nützliche Tests zu finden. (Wenn es einen formalisierten Testprozess gibt, sollten die meisten dieser Fälle bereits vor dem Systemtest identifiziert und getestet worden sein.)
  • Programmierer sind ziemlich gut darin, sicherzustellen, dass alle nützlichen Informationen in einen Fehlerbericht aufgenommen werden.

Warum Programmierer schlechte Tester sind:

  • Programmierer sind teurer als Tester (in den allermeisten Fällen).
  • Die Denkweise ist grundlegend anders: "Baue ein (funktionierendes) Produkt" vs "Dieses Ding geht nicht mit irgendwelchen (unbekannten) Fehlern aus der Tür."
  • Tester sind in der Regel effizienter - dh sie führen in der gleichen Zeit mehr Tests durch.
  • Programmierer sind auf Programmierung spezialisiert. Fachleute für Qualitätssicherung sind auf Tests spezialisiert.
vaughandroid
quelle
4
Beachten Sie, dass das logische Denken von Programmierern ein Nachteil für einen guten Tester sein kann. Wie oft haben Sie gesehen, wie ein Programmierer mit "aber das ist unmöglich!" Reagiert? wenn mit einem gefundenen Fehler konfrontiert? Nur um herauszufinden, dass sie etwas Ernsthaftes in ihrer Argumentation übersehen hatten, das den Fehler "unmöglich" machte.
Joris Timmermans
2
@CraigYoung - es ist klar, dass es ein fehlerhaftes logisches Denken ist, aber das ist sehr verbreitet (Systeme sind komplex). Die Sache ist, dass Sie beim Testen kein logisches Denken verwenden sollten, um "unnötige" Tests zu eliminieren, und es scheint für Entwickler schwierig zu sein, diese Art des Denkens zu vermeiden.
Joris Timmermans
3
+1 Eine großartige, ausgewogene Antwort. Erklärt auch, warum die Kombination aus automatisierten Unit- und Integrationstests, die von Programmierern zusammen mit Systemtests durch QS geschrieben wurden, die beste Kombination ist.
Danny Varod
1
+1 für "Denkweise ist grundlegend anders". Dies sind schließlich verschiedene Rollen mit verwandten (aber unterschiedlichen) Fähigkeiten.
Joshin4colours
3
@MadKeithV Logisches Denken ist beim Testen von entscheidender Bedeutung und beseitigt unnötige Tests. Denken Sie an Black-Box- oder White-Box-Tests? Beim Black-Box-Testen erstellen Sie Tests aus den Anforderungen, ohne die Implementierung zu kennen. Um auf fehlerhafte Annahmen, falsche Logik usw. zu prüfen. IMHO-Entwickler sind gut darin , vorausgesetzt, sie kennen die Implementierung nicht. Insbesondere wenn sie den Code geschrieben und Fehler gemacht haben, neigen sie unweigerlich dazu, die gleichen Fehler in den Tests zu machen. Systemtests sollten Black-Box-Tests sein.
MarkJ
19

Ich denke, Programmierer sind schlecht darin , ihren eigenen Code zu testen .

Wir glauben gerne, dass unser Code perfekt gemäß den Anforderungen funktioniert, und testen ihn als solchen. An meiner Stelle testen wir unseren eigenen Code, dann testen wir uns gegenseitig, bevor wir in den eigentlichen Testzyklus eintreten, und auf diese Weise wurden weit mehr Fehler aufgefangen, als nur durch das Testen unseres eigenen Codes

Amy
quelle
1
Meine zwei Cent. Entwickler testen normalerweise nur die letzten Änderungen, das letzte Update, das letzte Feature, das sie gemacht haben (von mir), und in einigen Fällen sind sie (wir) ein bisschen blind oder faul, andere Features zu testen.
Andrea Girardi
11

Programmierer sind definitiv die richtigen Leute, um einige Teile des Systems zu testen - an Orten sind sie die einzigen, die dies möglicherweise effektiv können.

Ein Punkt, den Programmierer beim Testen sehr schlecht finden, ist die Tatsache, dass sie "die Benutzeroberfläche wie ein normaler Benutzer verwenden" - sie sind keine normalen Benutzer und verhalten sich nicht so. Beispielsweise:

  • Programmierer sind in der Regel sehr gut darin, Texteingaben genau richtig zu machen. Ein häufig auftretendes Problem sind führende oder besonders nachfolgende Leerzeichen. Die meisten Leute scheinen sie nicht zu haben, aber gute Programmierer sind wahrscheinlich religiös, wenn es darum geht, ihre Saiten auf die richtige Saite ohne überflüssige Leerzeichen auszurichten.
  • Programmierer sind in der Regel Keyboarder, die Tabulatoren und andere Verknüpfungen nutzen, um die Arbeit zu beschleunigen. Normale Benutzer neigen dazu, die Maus zwischen den Feldern zu greifen.
  • Programmierer verstehen in der Regel, was das System ihnen sagt, anstatt Fehlermeldungen zu ignorieren und einfach auf OK zu klicken.

Normale Benutzer tun also vieles, was Programmierer nicht tun. Sie können sich bei UAT nicht vollständig auf das Entwicklerteam verlassen.

Wyatt Barnett
quelle
3
Zusätzliches Beispiel für Ihren ersten Aufzählungspunkt: Unsere Benutzer haben die Tendenz, aus MS Word zu kopieren, wodurch seltsame Dinge wie Em-Dash und intelligente Anführungszeichen eingefügt werden - was manchmal sogar die Bibliotheken zerstört, die wir nicht geschrieben haben. Keiner von uns ist jemals in Word, so dass uns der Anwendungsfall kaum in den Sinn kommt, geschweige denn auf die Probe gestellt wird.
Izkata
1

Auf technischer Ebene (Komponententests, Integrationstests, Regressionstests) sind Programmierer wahrscheinlich die einzigen qualifizierten Personen, die Tester sind, da diese Art von Tests automatisierbar sind und daher automatisiert werden sollten, was eine Programmierung erfordert.

Aber ich glaube nicht, dass Sie darüber sprechen, und ich bin mir ziemlich sicher, dass Joel Spolsky das auch nicht meint - es ist der verbleibende Teil, der eigentliche manuelle Test: das Umwandeln eines Anforderungsdokuments und einer Funktionsspezifikation in ein Testskript und dann akribische Ausführung dieses Skripts gegen das fertige Produkt.

Ein guter Tester zu sein, erfordert Qualitäten, die meist rechtwinklig zu denen sind, die einen guten Programmierer ausmachen. Es gibt ein wenig Überschneidungen - man muss analytisch denken können, man braucht eine gewisse Affinität zu Computern im Allgemeinen - aber ansonsten sind die Fähigkeiten eines Testers sehr unterschiedlich. Das an sich bedeutet nicht, dass Sie beide Fähigkeiten haben können, und in der Tat tun dies wahrscheinlich einige Leute. Um ein wirklich guter Programmierer zu sein, ist jedoch eine gewisse Faulheit erforderlich (der Wunsch, Ihre Aufgaben zu automatisieren), während ein wirklich guter Tester Ausdauer benötigt (überprüfen Sie alle dreitausend Formularfelder auf Inkonsistenzen), und folglich auch diejenigen Programmierer, die dies tun Ich habe das Zeug, ein Tester zu sein, und verabscheue normalerweise die Idee.

Und dann gibt es da noch die selektive Tendenz: Ein Programmierer, der bereits, wenn auch nur am Rande, an einem Projekt beteiligt ist, hat bereits einige Insider-Kenntnisse über die Codebasis und wird es aus Sicht des Endbenutzers schwer haben, sich dieser mit einem leeren Kopf zu nähern . Es muss nicht einmal explizit sein, wie in "Ich weiß, dass diese Schaltfläche funktioniert, also notiere ich nur 'pass'"; es kann viel subtiler sein und diese subtilen Effekte können dazu führen, dass kritische Randfälle beim Testen übersehen werden.

tdammers
quelle
1

Nach meiner Erfahrung sind Programmierer schlechte Tester. Zu oft habe ich gesehen, wie andere und ich "Huh, aber ich habe das getestet, bevor ich eingecheckt habe!" wenn Sie von einem Tester konfrontiert werden, der den Bug vor Ihnen reproduziert.

Warum? Nun, ich bin mir nicht sicher, warum das so ist, aber vielleicht wollen wir, dass das Zeug funktioniert. Oder wir wollen einfach damit fertig werden, dieses oder jenes Feature bereits zu testen.

Testen ist sowieso keine Fertigkeit, die wir gelernt haben, und wir arbeiten nicht als Programmierer, weil wir gut darin sind, Features zu brechen. Außerdem haben wir möglicherweise keine Ahnung, wie eine ordnungsgemäße Testplanung oder all die anderen Aufgaben der Qualitätssicherung durchzuführen sind. Wir sind nicht mehr qualifiziert, die Arbeit eines Testers zu erledigen als ein Tester, der für die Implementierung Ihrer neuen 3D-Rendering-Pipeline qualifiziert ist.

Wie in der Frage steht Testen für nichts Automatisiertes, sondern für das Testen mithilfe des Programms.

Morothar
quelle
1

Es gibt verschiedene Teststufen. Die "Low Level" -Tests können und müssen von Entwicklern durchgeführt werden. Ich denke bei Unit Testig.

Auf der anderen Seite sind "High-Level" -Tests eine völlig andere Sache. Im Allgemeinen denke ich, dass Entwickler schlechte Tester sind, nicht weil sie Fähigkeiten vermissen, sondern weil es sehr schwierig ist, in ein paar Minuten zu denken und zu arbeiten.

Ich versuche, meine Codes so gut wie möglich zu testen, aber nach mindestens 10 Minuten, die von einem Tester durchgeführt wurden, tritt etwas auf, das als Fehler oder Verbesserung zu betrachten ist. Dies bedeutet, dass das Testen von etwas, das Sie erstellen, eine schwere Aufgabe ist. Sie wissen, wohin Sie klicken müssen, wann Sie klicken müssen, Sie kennen die Geschäftslogik und wissen wahrscheinlich, wie Daten persistent sind. Du bist ein Gott, den du niemals fallen wirst.

AngeloBad
quelle
0

Welche Art von Tests meinst du? Wenn Sie umfassende ausführliche Tests meinen, könnte ich einige Gründe dafür finden, ja zu sagen, obwohl ich vermute, dass die meisten Menschen in dieser Kategorie arm wären, wenn man alle möglichen Kombinationen von Eingaben als Voraussetzung für solche Tests betrachtet.

Ich kann anerkennen, dass der Entwickler, der die Software entwickelt, möglicherweise Tunnelblick hat, wenn es darum geht, wie der Code behandelt werden soll, und einige mögliche Grenzfälle ignorieren, die möglicherweise nicht berücksichtigt wurden. Wenn ich beispielsweise ein Webformular erstelle, das eine Zahl n annimmt und dann von 1 bis n auf dem Bildschirm druckt, kann es vorkommen, dass einige Sonderfälle fehlen, z. B. wenn nichts eingegeben wird oder etwas, das keine natürliche Zahl wie e oder pi ist . Was das Programm in diesen Fällen tun soll, kann fraglich sein.

Test Driven Development wäre ein Beispiel für eine Entwicklungsmethode, die das Testen in ein anderes Licht rückt, was hier eine andere Sichtweise geben könnte.

JB King
quelle
Danke, dass Sie das gefragt haben. Ich habe meine Frage aktualisiert, um zu sagen, was ich für Testen halte. Im Grunde handelt es sich beim Testen um Dinge, die nach dem Erstellen und Bereitstellen der Software geschehen, nicht während der Entwicklung (wie z. B. Unit-Tests) oder im Rahmen einer Entwicklungsmethode (wie z. B. Peer Review).
jhsowter
0

Programmierer definieren Tests genau, wenn sie diese vor dem Schreiben des Codes definieren. Mit der Praxis werden sie noch besser.

Wenn sie Tests für Code definieren, den sie geschrieben haben, sind sie jedoch nicht sehr gut. Sie werden die gleichen blinden Flecken beim Testen haben, die sie beim Schreiben des Codes hatten.

Manuelle Tests mit Programmierern durchzuführen ist einfach albern. Manuelles Testen allein ist albern genug. Programmierer dazu zu bringen ist extrem dumm. Es ist teuer und vertreibt die kompetenten Programmierer.

Kevin Cline
quelle
So sehr ich das Schreiben von Unit- und Integrationstests befürworte, sehe ich nicht, wie TDD (oder das Schreiben der Tests zuerst) dies behebt. Wenn Sie die wichtigsten Erfolgsszenarien vor dem Code schreiben, werden Sie wahrscheinlich die meisten Fehler nicht finden. Man muss an all die Dinge denken, die schief gehen können. Haben Sie Code geschrieben, können Sie einige davon leichter finden, indem Sie die Zweige und die von Ihnen aufgerufenen Methoden durchgehen, um zu sehen, was sie beschädigen kann.
Danny Varod
Viele der Fehler, die Entwickler übersehen hatten, betrafen die API-Aufrufreihenfolge. Etwas, das die meisten Komponententests nicht abdecken, insbesondere wenn Sie nicht wissen, wie andere Methoden genannt werden könnten, die sich möglicherweise auf die von Ihnen getestete (und die noch nicht implementiert wurde) auswirken.
Danny Varod
@Danny: Mit TDD sollten Sie nur Zweige oder Methoden als Antwort auf einen fehlgeschlagenen Test schreiben und Sie schreiben nur den Code, der zum Bestehen des fehlgeschlagenen Tests erforderlich ist.
Kevin Cline
Ich kenne die Methodik von TDD und stimme den Schlussfolgerungen einfach nicht zu.
Danny Varod
0

Eine Art von Tests, bei denen ich besonders gesehen habe, wie Entwickler versagten, ist das Testen, ob die Anforderung erfüllt wurde. Was Entwickler in einer Anforderung für etwas halten und was Tester für etwas halten, sind oft zwei völlig verschiedene Dinge.

Ich kann mir eines vorstellen, bei dem der Entwickler vor kurzem gebeten wurde, einen Delta-Export durchzuführen, und der Entwickler dachte, es sollten alle Datensätze abgerufen werden, die nicht einmal gesendet wurden, und die Tester meinten, es gäbe neue Aufzeichnungen und Änderungen. Sie mussten zum Klienten zurückkehren, um herauszufinden, wer Recht hatte. Ich habe den Code überprüft und die gleiche Annahme gemacht, dass der Entwickler die Anforderungen erfüllt hat. Denn logischerweise hätten Sie Updates erwähnt, wenn Sie sie einschließen wollten. Und ich bin normalerweise gut darin, diese zweideutigen Dinge zu erkennen, weil ich früher am Ende der Dinge war.

Andere Entwickler, die die Tests durchführen, neigen dazu, viele der gleichen Annahmen zu treffen, weil auch sie bestimmte Annahmen treffen, wie "Nun, sie hätten mehr Details gehabt, wenn sie X Vize Y bedeuten, weil so viele Details zu beantworten sind, bevor ich dies tun könnte Aber Anforderungsschreiber denken nicht so. Also muss jemand, der eher wie Anforderungsschreiber denkt, die Annahmen der Entwickler testen, und jemand, der kein Entwickler ist, ist der bessere Mensch, um überhaupt zu erkennen, dass es ein Problem gibt.

HLGEM
quelle