Bild von Unit-Testing

19. Jul 2019

Unit-Testing

Was ist das? Wie werden diese aufgebaut und was muss man dabei beachten?

Was ist ein Unit-Test?

In unserem Cudos-Trail-Workshop haben wir uns intensiv mit Unit-Testing beschäftigt. Zu Beginn unseres Workshops ging es darum, den Begriff "Unit-Test" zu definieren und insbesondere von Tests abzugrenzen.

Ein Unit-Test wird auch Modultest genannt. In der Softwareentwicklung wird ein Unit-Test angewendet, um die funktionalen Einzelteile sprich Units oder Module von Computerprogrammen zu testen, d. h. sie auf korrekte Funktionalität zu prüfen.

Ein Unit Test ist kein Integrationstest und kein Systemtest.

 

Ein Unit-Test soll…

  • einen sprechenden Namen haben.
  • schnell durchlaufen sein. (einige ms)
  • einfach verständlich sein.
  • ein einzelnes Verhalten testen.
  • unabhängig von anderen Tests sein.
  • nicht auf externe Ressourcen (DB, Devices, etc.) zugreifen.
  • ein einfaches Resultat liefern: Fail oder Pass.

 

Unit-Test Frameworks

Es gibt eine Vielzahl von Unit-Test Frameworks. Für C# werden am häufigsten folgende Frameworks verwendet:

 

Aufbau von Unit-Tests

Unit-Tests werden hierarchisch aufgebaut, wie folgt:

  • Ein Testprojekt pro Assembly
  • Ein TestFixture pro Klasse
  • Ein Unit Test testet eine Unit im Code (und nicht zwingend eine Methode)


Dabei soll er immer aus folgenden Teilen bestehen:

  • Arrange: Daten und Device Under Test (DUT) erstellen
  • Act: Zu testende Methode vom DUT aufrufen
  • Assert: Resultate mit Sollwerten vergleichen

 

Umgang mit Dependencies

Dependency Injection

In realen Fällen hat ein Device Under Test (DUT) häufig viele Abhängigkeiten zu anderen Teilen der Codebasis:

Da ein Unit Test genau eine Unit testen soll, sollten die Abhängigkeiten des DUT so weit als möglich/nötig durch Mocks ersetzt werden:

Ein Mock ist ein Platzhalter für ein reales Objekt. Häufig werden Mocks auch verwendet, um in einem Unit Test keine externen Ressourcen wie Netzwerk, Filesystem, Datenbanken, Umsysteme, etc. aufzurufen.

Mocks können einerseits von Hand geschrieben werden, andererseits existieren Mocking Frameworks, welche dem Software Ingenieur diese Arbeit erleichtern können.

 

Mocking Frameworks

Mocks dienen dazu eine zu testende Komponente von anderen Teilen des Source Codes zu isolieren. Zum Beispiel kann eine Datenbankanbindung mit einem Mock ersetzt werden, um einen Unit-Test auch dann ausführen zu können, wenn keine Datenbank vorhanden ist. Um nicht eine Vielzahl von Dummy-Implementierungen schreiben zu müssen, gibt es Mocking Frameworks, welche beim Erstellen von Mocks unterstützen können. Mocking Frameworks helfen also Teile vorzutäuschen (zu "mocken"), welche für einen Unit Test benötigt werden, aber nicht selbst getestet werden.

Zwei Mocking Frameworks Beispiele für C#, die wir im Workshop behandelt haben:

  • Typemock Isolator
  • moq

 

Meine wichtigsten Learnings

  • 3 Schritte im Test: Arrange, Act, Assert
  • Tests sollen schnell durchlaufen sein
  • Tests oft und regelmässig ausführen
  • Fehlgeschlagene Test so schnell wie möglich fixen
  • Ein Test für jedes Verhalten durchführen
  • Tests müssen unabhängig voneinander sein
  • Tests müssen immer das gleiche Resultat liefern
  • Testresultate: Fail oder Pass
  • Keine „If()“, „Switch()“, „For()“ etc. in Tests -> Mehrere Tests erstellen
  • Klassen isoliert testen (Mocks verwenden)

 


Schliessen
Stamp Icon-Print Icon-Clear
S
M
L
XL
XXL