Was ist Unit Testing?

Unit Testing ist ein selbsterklärendes Wort, wenn man versteht, was mit Unit gemeint ist. Eine Unit ist der kleinstmögliche Code, der vom System logisch isoliert werden kann. Dies bedeutet, dass jeder Code, der Eingaben entgegennehmen, eine Aufgabe ausführen und eine Ausgabe generieren kann, auch wenn er vom gesamten System oder der gesamten Lösung unabhängig ist, als Einheit bezeichnet werden kann. Das Testen dieses Codeteils, um die erwartete Ausgabe für einen bestimmten Satz von Eingaben zu generieren, wird als Komponententest bezeichnet.

Arten von Unit-Tests

Lassen Sie uns einige der Unit Testing-Typen diskutieren.

1) Manuelle Prüfung

Beim manuellen Testen von Code muss der Entwickler jede Codezeile manuell debuggen und auf ihre Richtigkeit prüfen. Bei komplexen Funktionen ist möglicherweise auch ein schrittweiser Befehlssatz erforderlich.

2) Automatisiertes Testen

Beim Automatisierungstest schreibt der Entwickler Code in Testcode. Dies wird im Allgemeinen durch Unit-Test-Frameworks unterstützt, die nicht in der Produktion bereitgestellt werden. In anderen Fällen kann ein Entwickler entscheiden, Testcode ohne das Framework zu schreiben und ihn vor der Bereitstellung manuell auszukommentieren.

Das manuelle Testen scheint in den meisten Fällen zeitaufwändig zu sein. In einigen Fällen, in denen das Schreiben automatisierter Testfälle für jedes Szenario nicht möglich ist, wird häufig die manuelle Methode bevorzugt.

Warum ist Unit Testing wichtig?

Um zu verstehen, wie wichtig Unit-Tests sind, müssen wir das Gesamtbild betrachten. Es ist Teil des Software Development Life Cycle. Lassen Sie uns die anderen Teile kurz betrachten, um ein besseres Verständnis der Rolle des Unit Testing zu erhalten.

Das obige Bild ist eine einfache Darstellung eines normalen Softwareentwicklungszyklus und der damit verbundenen Testprozesse. Es ist unnötig zu erwähnen, dass abhängig von der Struktur des Projekts der gesamte Prozess mit dem Hinzufügen und Entfernen bestimmter Komponenten variiert. Der Testprozess umfasst jedoch mit Sicherheit vier Typen, die im Folgenden beschrieben werden:

  • Unit Testing - Die Grundstufe des gesamten Testprozesses. Dies wird vom Entwickler der Komponente oder einem seiner Kollegen durchgeführt. Im letzteren Fall wird es in der Software-Welt häufig als Peer-Test bezeichnet.
  • Integrationstest - Testen der Einheitenkomponente mit dem unmittelbar übergeordneten Modul. Ziel ist es, zu überprüfen, ob sich die Einheitskomponente gut in die anderen Komponenten integriert und keine Fehlfunktion anderer Komponenten verursacht hat.
  • Systemtest - Test des gesamten Systems, wenn die Einheitenkomponente an ihrer Position platziert ist.
  • Akzeptanztests - In der Regel von Unternehmen / Kunden durchgeführt, wird überprüft, ob das Ergebnis mit der vom Endbenutzer erwarteten Funktionalität übereinstimmt.

Man kann also sehr gut erkennen, dass alle Testprozesse von der elementaren Teststufe abhängen. Wenn die Grundstufe des Testens nicht durchgeführt wird, können alle anderen Tests vergeblich sein.

Angenommen, Sie haben einen Code, der aus zwei Teilen besteht

  1. Zinseszins berechnen.
  2. Addieren Sie die Zinsen zum Kapitalbetrag und berechnen Sie den Laufzeitvorteil.

Angenommen, Sie haben keine dieser Komponenten getestet und sind direkt zum Systemtest übergegangen. Beim Systemtest tritt ein Fehler auf, der besagt, dass der Fälligkeitswert falsch ist. Welcher Teil des Codes weist nun einen Fehler auf?

  1. Es kann sich bei der Berechnung um Zinsen handeln.
  2. Es kann in der Anwendung der Compoundierungslogik liegen.
  3. Es kann zusätzlich zum Nennbetrag verzinst werden.

Sehen Sie, wie sich der Aufwand jetzt erhöht. All dies hätte vermieden werden können, wenn beide Codekomponenten einem Komponententest unterzogen worden wären.

Warum ist Unit Testing wichtig?

  • Es behebt Fehler nur früh in der Entwicklungsphase. Das spart viel Zeit, Mühe und Kosten. Stellen Sie sich vor, wenn keine Komponententests durchgeführt würden, würde der Code für sehr einfache Probleme an das Qualitätssicherungsteam weitergeleitet und von diesem zurückgesandt.
  • Gute Unit-Tests dienen auch der detaillierten Dokumentation. Wenn ein Entwickler Komponententestfälle schreibt, schreibt er versehentlich die erwartete Funktionalität des Codes. Dies ist einfach nichts anderes als eine Dokumentation, die die Funktionsweise des Codes erklärt.
  • Es erleichtert das Ändern und Verwalten von Code. Sobald Sie Änderungen am Code vorgenommen haben, führen Sie die Tests erneut durch und Viola, alle Fehler werden ohne Probleme abgefangen.
  • Es erzwingt auch Modularität. Komponententests werden für einzelne Komponenten ausgeführt, was bedeutet, dass der Code so detailliert wie möglich sein muss. Dies stellt sicher, dass der Code passend in Module unterteilt ist.

Die andere Seite der Münze

Es hat auch einige Nachteile. Obwohl die Vorteile die Nachteile überwiegen und es immer empfohlen wird, den Code in Einheiten zu testen, ist es auch sinnvoll, beide Seiten derselben Münze zu kennen.

  • Unit-Tests, wie auch immer, können manchmal auch nicht alle Fehler im einfachsten Code erfassen. Es ist einfach nicht möglich, alle Ausführungspfade auszuwerten. Unit-Tests sind daher oft einfache Happy-Path- und negative Szenarien.
  • Ein Entwickler muss über den Tellerrand hinausdenken und versuchen, seinen Code zu knacken. Dies ist oft schwierig, da die Wahrnehmung eines Entwicklers in Richtung Code verzerrt wird.

Unit-Testing-Tools

In der Branche gibt es verschiedene Tools, die bei automatisierten Komponententestfällen helfen. Sie erleichtern dem Entwickler das Schreiben und Ausführen von Unit-Testfällen. Es gibt eine Welt von Unit-Test-Frameworks, die von Entwicklern verteilt werden. Einige der beliebtesten und am häufigsten verwendeten Tools sind unten aufgeführt.

JUnit

JUnit ist ein kostenloses Testtool für Java. Es ist automatisch in vielen Projektvorlagen enthalten, die mit verschiedenen IDEs für die Java-Entwicklung verfügbar sind. Das Besondere an JUnit ist, dass zuerst die Daten und dann der Code nach dem Einfügen der Daten getestet werden. Es enthält auch Aussagen zur Identifizierung der Testmethoden.

NUnit

NUnit ist zu .Net wie JUnit zu Java. Es verfügt über alle wichtigen Funktionen von JUnit, jedoch für die Entwicklung in der Programmiersprache .Net. Es unterstützt auch die parallele Ausführung der Tests.

PHPUnit

Ähnlich wie JUnit und NUnit ist PHPUnit ein Tool für PHP-Entwickler. Es unterstützt auch alle grundlegenden Funktionen eines guten Testwerkzeugs.

XUnit

Ein weiteres Framework, das allgemeiner ist als seine Gegenstücke, ist XUnit. Es unterstützt mehrere Sprachen wie C ++, C #, ASP.Net usw. Es verfügt auch über ähnliche Funktionen wie andere auf dem Markt erhältliche Tools.

Jtest

Parasoft Jtest ist ein Plugin eines Drittanbieters, das Open Source-Frameworks wie JUnit nutzt und One-Click-Lösungen hinzufügt, um das Leben zu erleichtern. Mit Jtest können Sie mit wenigen Klicks automatisch Testcodes für Ihren Code generieren. Durch die Automatisierung dieser Aufgaben kann der Entwickler frei an der Geschäftslogik der Testfälle arbeiten.

QUnit

Ein sehr beliebtes Framework zum Testen von JavaScript-Einheiten. Es kann JavaScript-Code sowohl auf der Client- als auch auf der Serverseite testen.

Jasmin

Ein weiteres sehr verbreitetes Testwerkzeug für JavaScript-Frameworks. Es hat große Community-Unterstützung für Angular, React, etc.

JMockIt

JMockIt ist ein Open Source-Tool, das auch das Verspotten der API-Aufrufe mit Aufzeichnungs- und Überprüfungssyntax unterstützt.

Beispiel für einen Einzeltestfall

Eine Grundvoraussetzung für einen Unit-Testfall ist der zu testende Code. Nehmen wir an, wir haben eine Funktion, die überprüft, ob die Telefonnummern (in Bezug auf das Format) korrekt sind oder nicht. Abhängig vom geografischen Standort kann dieses Kriterium auch variieren. Daher werden wir die Kriterien nicht hervorheben. Vielmehr konzentrieren wir uns auf den Einzeltestfall.

public class PhoneValidator
(
public bool IsPhoneValid(string phone)
(
/* write some code to verify if the phone is valid or not. return true, if the phone is valid. return false, if invalid. */
)
)

Jetzt müssen wir diesen Code testen.

Wir können es entweder manuell testen, indem wir verschiedene Werte einfügen und die Ausgabe überprüfen. Dies mag auf den ersten Blick einfach erscheinen, wird jedoch wiederholt, wenn Änderungen am Code vorgenommen werden.

Alternativ können wir einen Einheitentestfall schreiben, der als mein Prüfer dienen kann, solange die Geschäftslogik dieselbe bleibt. Der Einheitentestfall wird sich auch dann nicht ändern, wenn wir den Code ändern. Schreiben wir also einen Unit-Testfall für den obigen Code.

public void TestPhoneValidator()
(
string validPhone = "(123) 456-7890";
string invalidPhone = "123 45"
PhoneValidator validator = new PhoneValidator();
Assert.IsTrue(validator.IsPhoneValid(valid phone));
Assert.IsFalse(validator.IsPhoneValid(invalidPhone));
)

Wie funktioniert der obige Unit-Test-Code? Beachten Sie die beiden Assert-Anweisungen. Sie stellen sicher, dass der Test nur bestanden wird, wenn die beiden Leitungen von den jeweiligen IsPhoneValid-Funktionsaufrufen true und false erhalten.

Sie würden sich fragen, welche Vorteile es hat, diesen Testfall zu schreiben? Wenn Sie in einem realen Szenario Tausende von Telefonnummern überprüfen müssen, müssen Sie dies nicht jedes Mal manuell überprüfen, wenn der Debugger auf den Code trifft. Rufen Sie den Testcode einfach tausende Male auf und erfahren Sie, welche Tests bestanden und welche nicht bestanden wurden. Jetzt müssen Sie nur noch die ausgefallenen prüfen.

Unit-Testing-Tipps

  1. Verwenden Sie immer ein Tool oder Framework, das Ihre Sprache unterstützt. Tools erleichtern die Entwicklung von Unit-Testfällen. Andernfalls könnten Sie zusätzliche Anstrengungen unternehmen.
  2. Obwohl dies für alle empfohlen wird, ist es manchmal praktisch, Codes zu überspringen, die einfach sind und sich nicht direkt auf das Verhalten des Systems auswirken. Zum Beispiel können Getter- und Setter-Codes weniger fokussiert sein.
  3. Überspringen Sie niemals Codes, die sich direkt auf das System auswirken oder für die Implementierung der Geschäftslogik von entscheidender Bedeutung sind.
  4. Verwenden Sie Testdaten, die Produktionsdaten ähneln.
  5. Isolieren Sie Ihren Code. Wenn Ihr Code von Daten aus der Datenbank abhängt, schreiben Sie keinen Testfall, um die Datenbank aufzurufen und Werte abzurufen. Erstellen Sie stattdessen eine Schnittstelle und verspotten Sie die API- und Datenbankaufrufe.
  6. Schreiben Sie den Testfall, der den Fehler aufdeckt, bevor Sie einen Fehler beheben, der sich aus dem Testen der Einheit ergibt. Dafür gibt es drei Gründe:
    • Sie können die aus Ihrem Fix resultierenden Regressionsfehler abfangen.
    • Ihr Testfall ist jetzt umfassender.
    • Oft ist ein Entwickler zu faul, um seine einmal geschriebenen Testfälle zu aktualisieren.
  7. Schreiben Sie nicht nur Testfälle, die die Geschäftslogik verifizieren, sondern auch Fälle, die die Leistung Ihres Codes testen. Insbesondere bei Codes mit Schleifen ist die Leistung am stärksten betroffen.

Dinge, an die man sich erinnern sollte

  1. Unit-Test-Fälle sollten unabhängig von
    • Der zu testende Code - Jede Änderung des Codes sollte keine Änderung des Einheitentestfalls erfordern, es sei denn, die Geschäftslogik selbst ändert sich. Wenn die Logik jetzt beispielsweise verlangt, dass eine gültige Telefonnummer immer mit '+' beginnt, muss der Einheitentestfall geändert werden, andernfalls nicht.
    • Der andere Code - Es sollte keine Interaktion oder Abhängigkeit mit anderen Code- oder Datenbankwerten oder Ähnlichem geben. Eine Einheit sollte beim Testen isoliert werden.
  2. Befolgen Sie klare und konsistente Namenskonventionen für Ihre Testfälle. Dies erleichtert die Verfolgung der Szenarien. Sie können auch Tools zur Versionskontrolle verwenden, um Ihre Testfälle im Auge zu behalten.
  3. Übergeben Sie Ihren Code erst dann an die nächste Phase, wenn dies geschehen ist. Fehler werden behoben und erneut getestet.
  4. Machen Sie es sich vor allem zur Gewohnheit. Dies ist eine Codierungspraxis, die eingeschärft werden muss. Je mehr Sie ohne Unit-Tests codieren, desto fehleranfälliger ist Ihr Code.

Karriere im Unit Testing

Unit Testing ist zwar kein Feld als Ganzes, aber es ist ein zusätzlicher Pfeil in Ihrem Köcher. Es ist eine gute Codierungspraxis, und wann werden gute Codierer nicht bevorzugt?

Fazit

Es ist unbestritten, dass Unit-Tests manchmal einfach und manchmal komplex sein können. Dann helfen Ihnen die Tools und Frameworks. Selbst nach dem Testen der Einheit ist der Code nicht vollständig fehlersicher. Dann setzen die nächsten Testverfahren ein. Unter all diesen Unsicherheiten ist nur sicher, dass ein Unit-Test erforderlich ist.

Empfohlene Artikel

Dies war ein Leitfaden für Unit-Tests. Hier haben wir die Bedeutung, Tipps, Tools, Karriere und Arten von Unit-Tests mit ihren Beispielen besprochen. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -

  1. Testen von Interviewfragen
  2. Web-Testanwendung
  3. Fehlerlebenszyklus beim Testen von Software
  4. Karriere im Softwaretest
  5. Liste der Test-Frameworks für Java