Ich bin ein großer Fan von Tests. Ich schreibe darüber in meinem Blog und in meiner Mailingliste, diskutiere es in meiner Freizeit mit anderen Entwicklern und habe sogar einen Schulungskurs zum Testen in Go erstellt.
Trotz all meiner Liebe zum Testen empfehle ich es Anfängern nicht.
Klingt wild, oder? In diesem Artikel werde ich meinen Standpunkt genauer erläutern, aber der ganze Punkt besteht letztendlich aus zwei Punkten:
- Anfänger haben nicht genug Wissen, um etwas anderes als die einfachsten Tests zu schreiben. Dies führt unweigerlich zum nächsten Punkt ...
- Es ist äußerst schwierig, die Fähigkeiten zu trainieren, die erforderlich sind, um realistische Tests zu schreiben, während Sie das Programmieren lernen
Ich verstehe, dass dies im Prinzip ein Punkt ist. Auf jeden Fall habe ich es in zwei Teile geteilt, um es verständlicher zu machen.Ich weiß, dass viele von Ihnen mir nicht zustimmen werden, aber bitte lesen Sie den Artikel, und wenn Sie nach dem Lesen nicht überzeugt sind, werde ich dies gerne mit Ihnen besprechen. Am Ende bin ich hier, um zu studieren
Anfängern fehlt das Wissen, etwas anderes als die einfachsten Tests zu schreiben
Wenn ein Anfänger Code schreibt, besteht sein Hauptzweck nicht darin, Aufgaben zu zerlegen, globale Variablen zu vermeiden oder Testcode zu schreiben. Ehrlich gesagt haben die meisten Anfänger wahrscheinlich keine Ahnung, was das alles ist. In der Tat ist ihr Hauptziel einfach - dieses verdammte Ding zum Laufen zu bringen. Das ist alles.
Um zu bestätigen, dass dies wahrscheinlich keinen Aufwand erfordert, schauen Sie sich einfach den vom Neuling geschriebenen Code an.
Webanwendung gehen? Sicherlich schreiben sie SQL-Abfragen überall und überall im Code, und die Verbindung zur Datenbank wird fast garantiert in einer globalen Variablen gespeichert.
Schienenanwendung? Sicherlich werden Sie die Geschäftslogik in den Ansichten und Tonnen von Logikstaus in den Controllern sehen.
PHP Webanwendung? Ich bin nicht überrascht, wenn ALLE Logik in einer einzigen PHP-Datei enthalten ist - Formularanalyse, Interaktion mit der Datenbank usw.
Selbst wenn wir etwas Elementares nehmen, beispielsweise einen Taschenrechner mit eingeschränkter Funktionalität, stoßen wir dennoch auf Beispiele wie die von mir beschriebenen. Dies liegt überhaupt nicht daran, dass es Anfängern egal ist, sie wissen einfach noch nicht, wie sie es besser machen sollen.
Anfänger wissen nicht, was Abhängigkeitsinjektion ist, sie verstehen nicht, wie globale Variablen das Testen erschweren, wahrscheinlich wissen sie nicht, was Mock ist, und es ist ziemlich lächerlich zu erwarten, dass sie verstehen, wie man Code entwirft, der einfach zu codieren ist.
Für einen Anfänger sind daher nur die einfachsten Tests wie diese sinnvoll:
func Add(a, b int) int { return a+b }
Obwohl ich kein Problem damit habe, Anfängern dies zu zeigen und ihnen eine Vorstellung davon zu geben, was Testen ist, finde ich es ziemlich lächerlich, ihnen diesen Code zu zeigen und so zu tun, als wäre es so etwas wie ein echter Test.
Dies führt letztendlich dazu, dass wir beginnen, ihnen mehr beizubringen. Wir versuchen zu erklären, was Abhängigkeitsinjektion ist, warum globale Variablen das Testen erschweren, wie z. B. time.Now () kann es schwierig machen, Grenzfälle zu überprüfen. Und an dieser Stelle mache ich mir langsam Sorgen, weil wir dem Anfänger nicht mehr beibringen, wie man Code schreibt. In diesem Moment bringen wir ihm bei, wie man Code schreibt
und gleichzeitig testet . Und das bringt mich zum zweiten Punkt ...
Es ist äußerst schwierig, die Fähigkeiten zu trainieren, die erforderlich sind, um realistische Tests zu schreiben, während Sie das Programmieren lernen
Nach wie vor möchte ich, dass Sie über den Code nachdenken, den der Neuling geschrieben hat, aber dieses Mal möchte ich, dass Sie sich an einige der ersten Programme erinnern, die Sie geschrieben haben.
Wenn Sie wie ich wären, könnte Ihre erste Webanwendung ungefähr so aussehen:
<p> <?php
Ein Kunstwerk, oder?
Stellen Sie sich nun vor, Sie haben diesen Code gerade zum ersten Mal geschrieben und jemand sagt Ihnen, dass Sie ihn testen sollten. Und Sie müssen React verwenden. Und der Rahmen. Oh, und es würde Ihnen nicht schaden, die Datenbank und möglicherweise GraphQL zu optimieren, um damit zu arbeiten.
Ich weiß nicht warum, aber
wir Entwickler haben die Angewohnheit, die über langjährige Erfahrung und Praxis erworbenen Fähigkeiten zu nutzen und von anderen, insbesondere Anfängern, dasselbe zu erwarten . Das ist einfach lächerlich! Von jemandem ist zu erwarten, dass er Mathematik nur versteht, weil Sie selbst bereits Trigonometrie, Algebra und vieles mehr studiert haben und mit Mathematik bestimmte Probleme lösen können.
Wenn etwas für Sie gut funktioniert, bedeutet dies nicht, dass es für Anfänger geeignet ist. Sie können aus dem Zusammenhang geraten, ohne die Erfahrung und Übung, die erforderlich sind, um von dem, was Sie verwenden, zu profitieren. Oder vielleicht sind die Probleme, mit denen sie zu kämpfen haben, tatsächlich zu einfach, um all diese komplexen Lösungen zu verwenden.
Es ist, als hätten wir vergessen, wie wir Schritt für Schritt untersucht haben, wie HTTP-Anforderungen funktionieren. Wie Header funktionieren. Cookies Formulare. Wie funktioniert eine POST-Anfrage an den Server - oder sogar, dass es EXTREM unterschiedliche HTTP-Methoden gibt? Und das alles haben wir mit der guten alten Trial-and-Error-Methode gelernt.
Eigentlich glaube ich nicht, dass die Tests schuld sind. Das eigentliche Problem ist, dass wir fest davon überzeugt sind, dass Sie Programmieren, Testen, Erstellen von Websites und eine Million anderer Dinge gleichzeitig lernen sollten. Ich weiß nicht wirklich, wie das passiert ist, aber ich vermute, ein Teil des Problems ist, dass wir uns nicht die Mühe machen, darüber nachzudenken, was es kosten wird, all dies zu studieren. Ein Anfänger fragt: "Was soll ich lernen?" und wir beginnen mit "Lernen, testen, reagieren, grafisch darstellen und loslegen, aber nur die Standardbibliothek verwenden ..."
Nein, nein und wieder nein. Hör einfach auf.

Dies ist lächerlich, da unter anderen Bedingungen die Absurdität eines solchen Ansatzes offensichtlich ist. Wenn Sie jemandem das Fußballspielen beibringen möchten, beginnen Sie mit den Grundlagen wie Packen und Dribbeln. Sie werden zunächst nicht sagen: "So machen es Profis". Schalten Sie das Video von Ronaldo ein und gehen Sie. Was zum Teufel machen wir mit Programmierneulingen?
Wir versuchen uns zu rechtfertigen, indem wir sagen: "Natürlich verstehen sie, dass es unmöglich ist, all dies gleichzeitig zu lernen." Aber sie verstehen es nicht! Die Situation wird durch die Tatsache verschärft, dass unerfahrene Entwickler, die in diese Falle tappen, sich wie Mist fühlen, weil sie stecken bleiben. Es scheint ihnen, dass sie einfach nicht das Zeug haben, Entwickler zu werden, und es ist eine Schande für Sie und mich, denn viele von ihnen würden gerne programmieren, wenn sie nicht gegen diese Mauer stoßen würden.
Und das führt mich zu dem, was ich eigentlich sagen wollte - viele von uns lernen besser, wenn wir uns darauf konzentrieren, mehrere Dinge gleichzeitig zu studieren. Wir wollen neue Herausforderungen, wir wollen neue Dinge ausprobieren, aber wir wollen nicht verwirrt werden und in einen Stupor geraten. Das Erlernen von Tests und allem anderen - zum Beispiel das Erstellen einer Webanwendung, die Funktionsweise von http, Cookies usw. - ist eine einfache Möglichkeit, in diese Falle zu tappen. Aus diesem Grund empfehle ich normalerweise, den Rest zuerst zu studieren und zuletzt zu testen. Sie können jederzeit zu Ihren alten Projekten zurückkehren und sehen, wie Sie sie jetzt neu erstellen würden, wenn Sie das Testen studiert haben. Dies ist jedoch nur möglich, wenn Sie nicht überlastet, nicht verärgert und am Ende dieses Geschäft nicht aufgegeben haben.
Aber was ist, wenn ich lernen möchte, wie man testet ?! (und eine Million andere "Was wäre wenn")
Cool vorwärts! Natürlich können Sie zuerst das Testen studieren und erst dann die Webentwicklung oder ein anderes Thema. Ich bin mir sicher, dass einige genau das getan haben und Sie mögen diesen Weg vielleicht mehr. Wenn ich sage, dass das Testen nichts für Anfänger ist, sage ich nicht, dass dies ein schlechtes Thema ist. Ich meine, dass der Versuch, das Testen und alles andere zu lernen, ein Fehler ist.
Die meisten Menschen möchten zuerst lernen, wie man Webanwendungen oder etwas Visuelles erstellt. Dies bedeutet jedoch nicht, dass Sie damit beginnen müssen. Sie können sehr gut mit dem Testen beginnen. Sie werden wahrscheinlich nichts verstehen, bis Sie die Unebenheiten bekommen, aber lassen Sie sich nicht von mir davon abhalten, zu lernen, was Sie wollen.
Es bedeutet auch nicht, dass Sie während der Paarprogrammierung oder ähnlichem nicht lernen können. Mit einem Mentor können Sie viele Dinge gleichzeitig lernen und dieser Belastung erfolgreich standhalten, da Sie jemanden haben, der Sie durch all dies führt. Wenn Sie sich in dieser Situation verlaufen, geraten Sie nicht in eine Sackgasse und fühlen sich nicht als Versager, denn es wird jemanden geben, der sagt: „Es geht Ihnen gut, es ist einfach zu schwierig für den Moment. Versuchen Sie das nächste Mal stattdessen X und Y! “ Einfach ausgedrückt, in diesem Szenario werden Sie nicht verwirrt, enttäuscht und verlassen.