In meiner Arbeit verwende ich ständig Unit-Tests. Und Sie? Nach meiner Erfahrung sind die meisten Programmierer sehr selten. Wenn ich Bewerber in meinem Team interviewe, stelle ich immer die Frage: "Haben Sie Testerfahrung?" Und am häufigsten höre ich als Antwort: "Nein." Und wenn Sie nach dem Grund fragen, lautet die häufigste Antwort: "Der Kunde hat mich das nicht zulassen."
Dieser Ansatz überrascht mich. Sagen Sie dem Bauherrn, welche Betonmarke er für den Bau eines Hauses wählen soll? Oder Automechaniker - welcher Teil des Motors muss repariert werden und welcher nicht, wenn der Motor im Auto geflasht hat? Dies ist unwahrscheinlich, da es sich um schwerwiegende technische Probleme handelt, deren Lösung einem Fachmann anvertraut werden muss. Ein Fachmann verfügt über die erforderlichen Fähigkeiten und Werkzeuge, um ein Problem schneller und kostengünstiger zu lösen.
Warum das Geld zählen?
Das Bürgerliche Gesetzbuch hat das Konzept, „einen Auftragnehmer durch Erfahrung und Wissen zu retten“. Seine Bedeutung ist, dass die Arbeit von einem Fachmann ausgeführt wird, der weiß, wie man den Prozess optimiert, wie man es besser macht, aber gleichzeitig billiger. Und Entwickler als Profis sollten dem Kunden die besten Lösungen für das geringste Geld bieten.
Aber eigentlich konzentrieren sich Programmierer auf etwas anderes. Viele von ihnen sind sich sicher, dass Softwareentwicklung ein rein technischer Prozess ist, der natürlich seinen Wert hat, aber es ist die Aufgabe des Programmierers, zu schreiben, nicht Geld zu zählen. Entwicklung ist jedoch meiner Meinung nach in erster Linie ein wirtschaftliches Projekt, hinter dem Geld und Berechnungen stecken, und erst danach eine technische Aufgabe.
Die Logik hier ist einfach: Das Geschäft - genau für die Kunden, die uns Softwareentwicklung für ihre Unternehmen bestellen - benötigt in der Tat überhaupt keine Software. Unternehmen brauchen Geld, die Vorteile, die diese Software mit sich bringt.
Dies bedeutet, dass Programmierer nicht auf ein Verständnis der Entwicklungsökonomie verzichten müssen, wenn sie die Kosten technischer Lösungen kennen und wissen, welche von ihnen nicht nur hinsichtlich der Technologie, sondern auch der Finanzen optimal sind.
Softwareentwicklung ist im Allgemeinen nicht der billigste Teil des Geschäfts, aber minderwertige Software kann zu großen Verlusten führen. Selbst Ausfallzeiten führen zu Gewinneinbußen, und Softwareprobleme können zu Millionen von Verlusten führen. Daher muss der Entwickler als Fachmann von der Qualität seines Produkts überzeugt sein und es seinem Kunden garantieren. Die Qualität des Produkts ist jedoch der wichtigste Indikator. Und der Kunde muss wissen, dass diese Qualität messbar und zuversichtlich ist. Und wie genau ist die Aufgabe des Programmierers?
Ich bin wie viele meiner Kollegen der Meinung, dass Programmierer keine technischen Lösungen mit dem Kunden besprechen sollten. Im Allgemeinen ist es ausreichend zu wissen, was für den Kunden wichtig ist, welche Funktionen und zu welchen Zwecken er benötigt. Welche Entscheidungen zu treffen sind, liegt in der Verantwortung des Programmierers. Und im Rahmen dieser Verantwortung muss er die besten Ingenieurspraktiken für ein bestimmtes Projekt mit wirtschaftlich gerechtfertigten Kosten anwenden. Daher gewinnen Profis, die wissen, wie man den Entwicklungsprozess billiger macht.
Welcher Test ist rentabler
Eine Praxis, mit der Sie die Produktqualität kontrollieren können, ist das Testen. Aber welcher Test ist rentabler? Um diese Frage zu beantworten, genügt es, mehrere Parameter zu vergleichen. Alle Tests können nicht nur nach Art der Technologie, sondern auch nach Geschwindigkeit und vor allem nach Kosten bedingt unterteilt werden.
Unit Test - Testen von Produktionseinheiten. Mit Einheiten meine ich Programmeinheiten, abhängig von der Sprache, die durch Klassen, Funktionen und seltener durch Dateien dargestellt wird. Bei Verwendung des TDD-Ansatzes werden Tests zunächst in den Produktentwicklungsprozess eingebunden. Ein Projekt kann Tausende solcher Tests verwenden, um einzelne Codeteile zu testen. Sie verfügen über einen hervorragenden Geschwindigkeitsindikator - die gesamte Testreihe kann in Sekunden abgeschlossen werden. Dies sind die billigsten Tests.
Integrationstests - 2x-3x oder mehr Einheiten zusammen testen. Abhängig vom Programmierer kann ein Projekt Hunderte oder Tausende solcher Tests enthalten. Geschwindigkeit - Sekunden oder Minuten für die gesamte Testsuite. Die Kosten sind höher als bei Unit-Tests.
Abnahmetests simulieren Benutzeraktionen mit einem Programm. Sie erfordern die Vorbereitung einer Betriebsumgebung und sind daher komplex und teuer. Menge pro Projekt - in der Regel wird ein Test für eine Geschäftsgeschichte durchgeführt. Die Arbeitsgeschwindigkeit beträgt in der Regel einige zehn Minuten bis mehrere Stunden für die gesamte Testreihe.
Das teuerste und schwierigste ist das
manuelle Testen . Sie müssen eine Person einstellen, sie schulen, erstellen und ihr eine Geschäftsverlaufskarte geben, damit sie die neue Software darauf testet. Solche Tests dauern mehrere Tage für den gesamten Satz von Tests.
Jede Art von Test erfordert Vorbereitung sowie eine gewisse Investition von Geld. Und um Einsparungen (und damit Vorteile) zu erzielen, müssen wir zuerst die Testgeschwindigkeit und die Komplexität ihrer Einführung berücksichtigen. Wenn das Projekt keine automatischen Tests hat, gibt es nur einen Ausweg - manuelle Tests, die teuersten und langsamsten.
Die moderne Herangehensweise an die Softwareentwicklung ist jedoch ein kontinuierlicher Zyklus: In einer Woche werden neue Funktionen oder eine neue Version erstellt und automatisch oder manuell überprüft. Das heißt, das Produkt ändert sich häufig, und alle diese Änderungen müssen kontrolliert werden, damit der Programmierer sicher ist, dass die neuen und alten Funktionen gut funktionieren. Manuelle Tests verlieren daher sofort an allen Indikatoren.
Bei den verschiedenen Arten der automatischen Prüfung sind drei weitere wichtige Aspekte zu berücksichtigen.
Zuallererst ist es
Zuverlässigkeit - wie einfach es ist, den Test zu brechen (dies ist der beste Indikator für Unit-Tests).
Dann die
Umgebung , die zum Ausführen der Tests benötigt wird. Unit-Tests sind sehr einfach und erzeugen selbst eine Umgebung um das zu testende Gerät. Integrationstests erfordern einen Dienst, der installiert sein muss, ausgeführt wird usw. Abnahmetests erfordern Vorbereitung, da die Anwendung in ihrer Umgebung funktionieren muss.
Und schließlich -
Berichterstattung (Testberichterstattung). Unit Tests haben eine gute Abdeckung und werden während des gesamten Projekts verwendet. Integrationstests werden normalerweise für bestimmte Teile des Projekts verwendet, dh, sie decken das Programm nicht vollständig ab. Die Abdeckung von Abnahmetests ist schlechter - dies liegt an der Komplexität des Schreibens und Ausführens, meistens decken sie die Hauptgeschäftsfälle ab, das sind 20-40% des gesamten Projektvolumens.
Fazit
Es stellt sich also heraus, dass Unit-Tests in allen Indikatoren dieser kurzen vergleichenden Analyse führend sind. In meiner Praxis benutze ich sie meistens, es gibt ausreichende Qualität. Wenn die Qualitätsanforderungen steigen, gehen wir zur Akzeptanz über. Die Verwendung von Integrationstests hängt vom Kunden ab, der bestimmte Teile des Projekts testen möchte.
Mein aktueller Technologie-Stack ist eckig und .net. Und wenn das Testen auf der Serverseite keine großen Fragen aufwirft, ist das Testen der Clientanwendung an vielen Stellen immer noch nicht für jeden offensichtlich. Bei meinen Kundenprojekten variiert die Anzahl der Komponententests zwischen einigen Hundert und einigen Tausend. Im nächsten Artikel werde ich versuchen, Schlüsseltechniken zum Testen von Winkelanwendungen zu beschreiben.