Ein Leitfaden für Anfänger zum Testen: Fehler beim Umgang mit Kantenfällen

Wenn Sie komplexe Softwareteile unabhängig von der Sprache erstellen, bemerken Sie ein Muster in Ihren Testgewohnheiten. Dieselben ähnlich aussehenden Probleme treten auf verschiedenen Plattformen oder Projekten auf. Unabhängig davon, ob Sie eine weitere einfache Demo für eine Aufgabenliste für einen Vortrag erstellen oder ein umfassendes Back-End für ein PaaS-Startup erstellen, treten dieselben generischen Muster auf.

Es sollten sechs Fälle getestet werden, die eine überraschende Anzahl von Problemen beleuchten. Diese sind nicht als umfassend oder als vollständige Testsuite gedacht. Sie sind vielmehr eine leicht zu merkende Untergruppe gängiger Testparadigmen, die für jede Sprache, jedes Framework oder jede Umgebung gelten können.

Diese Fälle sind in zwei Aspekten der täglichen Codierungsroutinen sofort nützlich: beim Debuggen bestimmter auftretender Probleme und bei der Erstellung der Testsuite für eine Codebasis. Es handelt sich um generische, abstrakte Testformen, die einige der häufigsten Probleme von Junior-Entwicklern beleuchten.

Diese werden in der funktionalen Programmierung nur auf Umwegen nützlich sein. Die funktionale Programmierung umgeht viele der einfachsten Arten von Fehlern, die unten beschrieben werden. In jedem Fall ist es nützlich, diese Art von abstrakten Grenzfällen im Auge zu behalten, da sie eine Leitplanke gegen schlechte Praktiken im Code darstellen.

Die sechs Tests sind wie folgt:

  • Null
  • Einer
  • Zwei
  • Zwei bis max-1
  • max
  • max + 1

Obwohl dies Grenzfälle sind, liegt ihr Wert in dem, was sie darstellen. Während Sie sicherstellen, dass Ihre Tests alle Funktionen Ihres Programms abdecken, sollten Sie Ihre Tests so einfach wie möglich gestalten.

Null

Null wird verwendet, um jede Form der Null-Eingabe zu kennzeichnen, sei es undefiniert, null, ein leeres Array oder einfach die tatsächliche Zahl 0. Die wohl häufigste und einfachste Form des Fehlers ist das Verweisen auf einen Null-Wert und muss immer getestet werden. Testen Sie einfach eine Funktion, einen Endpunkt oder einen Upload mit einer Null-Eingabe und stellen Sie sicher, dass sie sich wie erwartet verhält.

Einer

Einer ist wie Zero die grundlegendste Form des generisierten Einzeltests. Die Funktion wird mit der ersten gültigen normalen Eingabe getestet. Dies ist am nützlichsten für Regressionstests. In zukünftigen Iterationen des Codes zeigt dieser Test schnell an, ob das Programm (oder der Prozess) wie erwartet funktioniert.

Ein Test gibt Ihnen eine Grundlage für den Erfolg, unabhängig davon, ob es sich um eine erfolgreiche Authentifizierung auf einem Administratorendpunkt, einen gültigen Datei-Upload oder eine korrekte Array-Änderung handelt.

Zwei

Bei zwei geht es nicht nur darum, den Array-Index 2 zu testen oder ob Ihr Algorithmus mit 2 Eingängen arbeitet. Es umfasst auch, was passiert, wenn Sie denselben Code zweimal ausführen.

Was passiert, wenn jemand zweimal hintereinander eine DELETE-HTTP-Anforderung an dieselbe Ressource sendet? Wenn die Sortierfunktion mit einem benutzerdefinierten Komparator zweimal hintereinander aufgerufen wird, verhält sie sich dann wie erwartet?

Zwei ist eine interessante Zahl, da es das erste Mal ist, dass gültiger Code, der beim einmaligen Aufruf funktioniert, Nebenwirkungen bei wiederholten Ausführungen zeigen kann. Nehmen Sie eine kleine Änderung an den oben getesteten Funktionen vor.

Es kommt auf Zustandsänderungen und das Verständnis des Verhaltens einer Funktion an. Wenn wir nur den Funktionsnamen haben, verhält sich dieser Code genau wie erwartet. Sie haben eine Variable namens 0, Sie rufen die Funktion setVarToOne auf und dann behaupten Sie, dass sie gleich eins ist.

Auf den ersten Blick verhielt sich dies genau wie erwartet. Wenn Sie es jedoch mit der Idee von Two testen, werden tiefere Probleme mit dem Code hervorgehoben. Sie würden es testen, indem Sie es zweimal aufrufen und behaupten, dass mVar in beiden Fällen gleich 1 ist.

Zwei bis max-1

Zwei bis maximal 1 ist die Überprüfung der geistigen Gesundheit. Es ist dem One-Test sehr ähnlich, aber es gibt einen subtilen Unterschied. Dies sollte ein durchschnittlicher Anwendungsfall sein - nicht der einfachste oder einfachste oder am einfachsten zu lesende. Nur ein durchschnittlicher Anwendungsfall, der vielleicht nicht besonders einfach ist, aber ziemlich häufig vorkommt .

Max

Max ist ziemlich einfach: Es testet einfach die Grenzen Ihrer Anwendung, insbesondere um definierte Max-Konstanten.

Wenn Sie eine einfache Implementierung einer verknüpften Liste haben, können Sie sich vorstellen, dass Sie scheinbar unendlich viele zulässige Einfügungen haben. In der Realität gibt es eine Obergrenze - ob dies INT_MAX ist, die Anzahl der Dateideskriptoren, die Ihr Betriebssystem geöffnet haben kann, oder einfach die Menge an Speicher oder Speicherplatz, die Ihrem Programm zugewiesen ist.

Unter bestimmten Umständen scheint Max ein unmöglicher Test zu sein, da für alles, was Sie testen, kein Max bekannt ist. In diesen Fällen ist es jedoch ein anderes Ziel: Ihre Anwendung einem Stresstest zu unterziehen.

Beispielsweise ist es möglich, dass bestimmte vom Benutzer übermittelte Daten reduziert und durch Funktionen geleitet werden, bis sie eine von Ihnen definierte Schleife erreichen. Wenn es sich bei diesen Daten beispielsweise um INT_MAX handelt, kann es nicht zu vernachlässigen, bis Ihr Code vollständig ist. Schlimmer noch, es könnte Ihren Code in einen ununterbrochenen Zustand versetzen. Dies können subtile Probleme sein, die erst auftreten, wenn Ihr Code in Produktion geht. Daher ist es wichtig, sie während der Testphase zu erkennen.

Max + 1

Max + 1 ist ein Test, der hauptsächlich verwendet wird, um die vom Programmierer festgelegten Standards oder Regeln zu überprüfen. Dies beinhaltet das Testen von allem bis zu seiner theoretischen Grenze + Epsilon.

Dies kann sich als Array-Out-of-Bound-Problem, als Off-by-One-Fehler, als Integer-Überlauffehler oder als jede andere Art von Problem manifestieren, das auftritt, wenn Sie die Grenzen Ihrer Funktion oder Ihres Programms erreichen.

Wenn Sie eine maximale Upload-Größe von 2 MB haben, versuchen Sie, eine Datei mit einer Größe von 2 MB + 1 MB hochzuladen. Wenn Sie eine Obergrenze für die Anzahl der Einträge in einem Benutzerkatalog haben, stellen Sie sicher , dass die Überprüfung sowohl Client - Seite geschieht undServerseite.

Fazit

Wie oben erwähnt, ist dies kein vollständiges Bild davon, wie Ihre Debugging- oder Testroutinen aussehen sollten. Dies bietet einfach eine solide, generische Basislinie, die über eine bestimmte Testsuite oder ein bestimmtes Framework hinausgehen sollte.

Die Tests werden üblicherweise als Grenz- oder Randfälle angesehen, aber sie können ihren hässlichen Kopf an Stellen aufrichten, die nicht sofort offensichtlich sind.