Softwareentwicklung ist ein komplexer Prozess. Neben der Beherrschung der verschiedenen Tools und Programmiersprachen geht es auch um das Verständnis der verschiedenen Rollen in der Softwareentwicklung. Wie die meisten von uns wissen, geht es bei großen Projekten nicht nur ums Programmieren. Bei großen Projekten werden auch andere Ressourcen für die Anforderungserfassung, das Prototyping und das Testen eingesetzt.
Der Prozess der Code-Validierung wird oft als Qualitätssicherung bezeichnet. Dieser Begriff ist jedoch etwas irreführend. Statt die Qualität des Codes zu sichern, besteht das eigentliche Ziel darin, sie zu messen – oft während der Entwicklung des Projekts. Dieser subtile Unterschied, der auch als testgetriebene Entwicklung (z. B. TDD) bezeichnet wird, wird deutlich, wenn man sich die Rollen der Qualitätsfunktionen ansieht. Dazu gehören die folgenden:
Warum UNIT-TESTS?
Wie gezeigt, wird die Qualitätsmessung oft in automatisierte und manuelle Aktivitäten unterteilt. Als jemand, der sich für Algorithmen interessiert, arbeiten zusätzliche Codes, die als Unit-Tests bekannt sind, um Ihr primäres Softwareprojekt zu testen. Unit-Tests werden in der Regel von Entwicklern geschrieben und stehen in einer TDD-Umgebung im Mittelpunkt. So sind Unit-Tests beispielsweise für die Entwicklung dieses Buches unerlässlich. Anhand des iOS XCTest Frameworks wollen wir uns ansehen, wie Unit-Tests in Swift funktionieren.
ARBEITEN MIT XCTEST
Wenn Sie sich mit den in diesem Buch besprochenen Swift-Konzepten vertraut gemacht haben, sollte das Schreiben von Unit-Tests ein Kinderspiel sein. Wie bereits erwähnt, dienen Unit-Tests dazu, Code zu testen, der keine Endbenutzerschnittstelle hat. Zur Veranschaulichung betrachten wir Testfälle, die eine Stack-Datenstruktur trainieren.
Auch wenn das Buch nicht auf die Besonderheiten der integrierten Entwicklungsumgebung (IDE) Xcode eingeht, sollte man wissen, dass Tests nach Funktion, Klasse oder Ziel ausgeführt werden können. In Xcode werden Unit-Tests durch Hinzufügen eines neuen Test-Targets zu Ihrem primären Code-Projekt eingerichtet. Einmal konfiguriert, können Unit-Tests von der IDE oder der Befehlszeile aus ausgeführt werden.
TEST RULES
Es ist zwar nicht erforderlich, aber es gilt als beste Praxis, wenn die Unit-Test-Datei eng mit der Namenskonvention unserer Implementierungsdatei(en) übereinstimmt. In unserem Fall werden wir StackTest.swift verwenden. Um Zugriff auf primäre Stack-Methoden und -Eigenschaften aus unserem Hauptprojekt zu erhalten, wird die Datei auch eine testbare Import-Anweisung enthalten:
Wie andere Unit-Test-Frameworks funktioniert XCTest durch die Integration von Swift-Sprachfunktionen mit spezifischen testbezogenen Funktionen. Die wesentlichen Methoden sind als Assertions gruppiert. Bei der Erstellung von Tests erkennt der Compiler Unit-Tests mit Funktionen, denen das Schlüsselwort test vorangestellt ist.
Im Gegensatz zu normalen Swift-Funktionen sind Unit-Tests absichtlich als in sich geschlossene Logikeinheiten konzipiert. Folglich akzeptieren Testmethoden keine Argumente und geben keine Werte zurück. Alternativ können die Testdaten über Hilfsmethoden und Initialisierungs-/Abbau-Sequenzen verwaltet werden. Betrachten Sie das Folgende:
TESTPLANUNG
Wie besprochen, besteht die Hauptoperation einer Stack-Datenstruktur im Hinzufügen und Entfernen von Elementen. Anstatt eine einzige Funktion zu schreiben, um alle Operationen zu testen, isoliert unser Testplan jede wichtige Stack-Operation mit einem eigenen Test. Wie bei testPushStack zu sehen, prüft die Assertion XCTAssertTrue die korrekte Initialisierung der Variablen Stack.count. Im nächsten Schritt wird Stack.push durch Iteration durch das Array der numberList-Elemente ausgeführt. Um sicherzustellen, dass jeder Test dieselben Daten verwendet, wird numberList mit der Setup-Methode der Klasse XCTestCase gefüllt.
Nachdem der Einheitstest für das Hinzufügen von Stack-Elementen implementiert wurde, können wir den nächsten Test für das Entfernen von Elementen schreiben: