Udemy

Introduction to Testing Software

Ein kostenloses Video-Tutorial von John Thompson • 500,000+ Enrollments Worldwide
Spring Framework Guru - Best Selling Instructor
Bewertung: 4,5 von 5Dozentenbewertung
24 Kurse
384.350 Teilnehmer:innen
Introduction to Testing Software

Steige mit dem kompletten Kurs tiefer ins Thema ein

Testing Spring Boot: Beginner to Guru

Become an Expert Testing Java and Spring Boot Applications using JUnit 5, Mockito, Spring Boot, and More!

20:43:42 On-Demand-Video • Aktualisiert am August 2026

Learn Important Concepts behind Test Driven Development
Understand different types of testing - Unit, Integration, Functional
Master the JUnit 5 Testing API
Easily integrate Mockito with JUnit 5 Tests
Migrate JUnit 4 tests to JUnit 5
Test Spring Framework Applications with JUnit 5 and Mockito
Write Unit Tests with Spring MVC Test
Learn to use testing features of Spring Boot
Deutsch [autom.]
In diesem Video werden wir eine Einführung in das Testen geben. Ich möchte das Testen von Software in einem sehr allgemeinen Sinne betrachten. Sozusagen als Einstieg in die Materie, um eine Grundlagenterminologie festzulegen und über das Testen im Allgemeinen zu sprechen. Zunächst einmal: Warum sollten wir Tests schreiben? Viele Leute beklagen sich, dass das Schreiben all dieser Tests viel Zeit in Anspruch nimmt. Warum sollten wir uns überhaupt die Mühe machen, das zu tun? Vor allem jüngere Entwickler wollen sofort loslegen und den Code schreiben, ihn ausführen und sicherstellen, dass er funktioniert, so dass wir Druckzeilenanweisungen einfügen können, um zu sehen, was los ist. Das ist definitiv eine Sache für junge Entwickler. Der Grund, warum Sie Tests schreiben, ist, dass Sie damit die Qualität Ihrer Software insgesamt verbessern. Es wird die Qualität Ihres Codes auf jeden Fall verbessern. Es beweist, dass Ihr Code das tut, was er Ihrer Meinung nach tun sollte, und ist daher sehr wichtig. Ich habe Fehler gemacht, und es ist so einfach, normalerweise ein Größer-als-Zeichen anstelle eines Kleiner-als-Zeichens zu verwenden. Es ist sehr, sehr einfach, einen Fehler zu machen. Die Tests werden das also auffangen, wenn Sie solche Bedingungen testen wollen. Das Ziel der Testabdeckung ist es, das eine zu reparieren und das andere einzubrechen. Als ich also eher ein Junior-Entwickler war, war ich ehrlich gesagt die ganze Zeit dabei, eine Sache zu reparieren und eine andere kaputt zu machen, und dann jagt man nur noch nach Fehlern, und das liegt daran, dass ich keine Testabdeckung hatte. Wenn Sie eine gute Testabdeckung haben, ist es sehr einfach, eine Sache zu ändern und dann einen Test zu verletzen und die Auswirkungen Ihrer Änderung in der Folge zu sehen. Aus diesem Grund ist eine solide Testabdeckung in der Branche weithin als Best Practice anerkannt. Wenn Sie in größere Unternehmen kommen, Softwareentwicklungsunternehmen mit mehr Entwicklern und mehr erfahrenen Entwicklern, werden Sie sehen, dass Tests immer wichtiger werden und es Ihnen auch erlauben, bestehenden und funktionierenden Code mit Vertrauen zu ändern. Bei der Entwicklung von Software kommt es häufig vor, dass sich die Software weiterentwickelt und sich die geschäftlichen Anforderungen ändern. Man sieht sich die Dinge an und denkt sich: "Oh, so könnte man das vielleicht besser machen. So ist es effizienter, dies zu tun. Mit einem Test können Sie also bestehenden und funktionierenden Code mit Zuversicht ändern. Lassen Sie uns nun über einige Testterminologie sprechen. Zu testender Code: Dies ist der spezifische Code oder kann eine Anwendung sein, die Sie testen. A Test Fixture: Dies ist direkt aus der JUnit-Dokumentation. Eine Testfixture ist ein fester Zustand einer Reihe von Objekten, der als Grundlage für die Durchführung von Tests dient. Der Zweck einer Textfixtur ist es, eine bekannte und feste Umgebung zu schaffen, in der die Tests ausgeführt werden und wiederholbar sind. Dies kann nun Eingabedaten, Scheinobjekte oder das Laden einer Datenbank mit bekannten Daten umfassen. Im Grunde genommen wird der Test also so eingerichtet, dass Sie den zu testenden Code haben und dann ein Fixture, das die Umgebung für Ihren Code einrichtet, in der er laufen soll. Unit-Tests/Unit-Testing: Dies ist etwas, das weitgehend missbraucht wird, sollte ich sagen. Die Leute verwenden den Begriff "Unit Test" und meinen damit oft nicht den eigentlichen Unit Test, deshalb möchte ich hier genauer sein. Dies ist Code, der geschrieben wurde, um Code zu testen. Er ist dazu gedacht, bestimmte Codeabschnitte zu testen. Der Prozentsatz der getesteten Codezeilen ist die Codeabdeckung. Ein weiterer wichtiger Begriff ist die Codeabdeckung. Idealerweise sollte Ihr Abdeckungsgrad zwischen 70 und 80 % liegen, und ich sage "idealerweise", weil es Leute gibt, die sehr detailorientiert sind und eine hundertprozentige Abdeckung haben wollen, und wenn Sie anfangen, darüber hinauszugehen, und das ist wirklich eine ungefähre Zahl. Sobald Sie den Bereich von 80 % überschreiten, sinkt der Wert der Ergebnisse Ihres Tests. Es gibt also eine sehr kleine, sehr unbedeutende Sache. Es kann sein, dass Sie keine Zeit aufwenden wollen, um das zu testen, vor allem, wenn es sich um etwas sehr Offensichtliches handelt. Deshalb sage ich 70 bis 80 %, und das ist keine feste Regel. Sie könnten ganz einfach sagen: "Hey!", wenn Sie sagen, dass es mindestens 85 % sein sollten. Ich werde das nicht bestreiten, ich sage nur, dass dies eine sehr grobe Spanne ist. Ihr Unit-Test sollte unity sein, also sehr klein und sehr schnell ausgeführt werden. Damit sollten sie sehr zielgerichtet sein. Sie sollten auf eine ganz bestimmte Sache abzielen. Es werden viele Szenarien durchgespielt und getestet. Vielleicht sollten Sie einen Schritt zurücktreten und die Dinge neu überdenken. Entweder ist Ihr Test falsch oder Ihr Code ist falsch, das eine oder das andere. Ein Unit-Test sollte keine externen Abhängigkeiten haben, und ich habe gesagt, d.h. keine Datenbank, kein Spring-Kontext, der nicht mit einem Webservice oder einem Message Broker sprechen sollte. Unit-Tests sollten völlig unabhängig sein. Ich werde sagen, und Mock-Objekte, die ich denke wohl okay, aber definitiv, wenn Sie bringen eine h2 In-Memory-Datenbank, die ist, wenn Sie so etwas tun, Sie sind immer in den Bereich eines Integrationstests. Diese sind dazu gedacht, das Verhalten zwischen Objekten und Teilen des Gesamtsystems zu testen. Dies unterscheidet sich also von einem Unit-Test, der sich in der Regel auf ein bestimmtes Objekt konzentriert, einem Methodenaufruf innerhalb eines Objekts, auf das ein Unit-Test abzielt, während ein Integrationstest das Verhalten zwischen Objekten oder vielleicht sogar mehreren Objekten testet. Es ist also ein größerer Bereich. Sie sind komplexer, und mit Integrationstests kann man jetzt tatsächlich den Spring-Kontext aufrufen, Datenbanken, Message-Broker, Webdienste aufrufen, so dass viel mehr passiert. Das bedeutet, dass sie sehr viel langsamer laufen werden als Unit-Tests. Der Funktionstest ist ein weiterer Bereich, der meiner Meinung nach weitgehend missbraucht wird, und die Terminologie variiert hier. Es gibt verschiedene Bezeichnungen dafür, aber funktionale Tests bedeuten in erster Linie, dass Sie eine laufende, typischerweise eingesetzte Anwendung testen. Sie haben also vielleicht eine Testumgebung, in die Sie die Daten übertragen haben, und Sie werden funktionale Tests durchführen, also werden Sie, wie gesagt, funktionale Berührungspunkte machen. Sie könnten einen Web-Treiber verwenden, um eine Webseite anzusteuern, Sie könnten Web-Dienste aus dem bereitgestellten Dienst aufrufen. Sie senden und empfangen möglicherweise Nachrichten von einem Broker. Funktionstests sind also auf einer viel höheren Ebene angesiedelt, und da Sie alles kompiliert und in einer bekannten Umgebung implementiert haben, sind sie insgesamt sehr langsam. Was die Geschwindigkeit anbelangt, so sollten Sie bedenken, dass Unit-Tests sehr schnell sind, Integrationstests nicht so schnell, je nachdem, was Sie tun, und die langsamsten Tests werden Ihre funktionalen Tests sein. Und das führt mich zu dem nächsten Punkt, den Sie hier berücksichtigen müssen: die Testpyramide. Sie werden sehen, dass dies auf unterschiedliche Weise dargestellt wird. Das Konzept, das ich hier vermitteln möchte, ist, dass die meisten Ihrer Tests Unit-Tests sein sollten. Aus diesem Grund habe ich den Einheitstest ganz unten in der Pyramide. Das sollte Ihre überwältigende Mehrheit sein. Sie wollen kleine, schnelle, leichtgewichtige Tests, und ich habe schon viele Leute gesehen, die bei diesen Tests Fehler gemacht haben, vor allem Spring-Entwickler, die, um ehrlich zu sein, schrecklich darin sind. Sie führen im Frühjahr Wettbewerbe für eine Menge Dinge durch, für die sie es absolut nicht brauchen. Aber was passiert, ist, dass der Spring Contest immer und immer wieder beginnt, und wenn man anfängt, Hunderte von Tests zu machen, läuft der Test nicht mehr in ein paar Sekunden, sondern vielleicht in einer Minute bis hin zu fünf oder zehn Minuten, und das verlangsamt den Build, weil man eine schlechte Arbeitsweise hat. Sie führen Tests durch, aber Sie führen Integrationstests durch, obwohl das eigentlich nicht nötig wäre. Deshalb möchte ich betonen, dass Sie sehr leichtgewichtige Einheitstests brauchen. Sie sind sehr gezielt. Sie zielen auf sehr spezifische Dinge ab. Die Integrationstests haben durchaus ihre Berechtigung. Sie müssen zwar Interaktionen testen, aber Sie werden auf einer viel feineren Ebene testen. Sie werden also Interaktionen testen. Sie müssen nicht alle Getter- und Setter-Integrationstests durchführen. Das ist nicht der richtige Ort für einen Integrationstest. Sie müssen sicherstellen, dass eine Nachricht ein- und ausgeht. Sie haben einen Einheitstest, um zu prüfen, ob alle Eigenschaften festgelegt wurden. Und dann kommen wir endlich zum Funktionstest. Diese sind zahlenmäßig am kleinsten und in der Regel auch am wenigsten detailliert. Sie werden also den Dienst am Leben erhalten. Ich bin da ein wenig sarkastisch, aber sie werden viel weniger detailliert sein als der andere Test. Es ist eher so, dass manche Leute dort Details eintragen, insbesondere für verschiedene Webdienste. Manchmal handelt es sich dabei nur um eine Sicherheitsüberprüfung, um sicherzustellen, dass der Dienst funktioniert und die minimalen Informationen zurücksendet. Verschiedene Leute haben verschiedene Philosophien rund um den funktionalen Test, aber konzeptionell möchte ich sehen, dass die meisten der detaillierten Geschäftslogik innerhalb des Unit-Tests getestet wird. Funktionstests werden ein viel höheres Niveau haben. Die Integrationstests werden irgendwo dazwischen liegen. Aber die Menge der Tests, die absolute Masse von ihnen sollte Einheitstests sein, die schnell laufen werden. Sie sollten Hunderte, wenn nicht Tausende von Unit-Tests und etwa ein Dutzend, hoffentlich weniger als hundert funktionale Tests haben. Geben Sie mir also einfach eine Idee und es gibt keine festen Regeln. Das hängt ganz von Ihrer Anwendung und deren Anforderungen ab. Der nächste Punkt, über den ich sprechen möchte, ist die Bedeutung von sauberem Code. Ich habe darauf gestoßen, und wenn Sie meine E-Mail-Liste, habe ich tatsächlich eine E-Mail genannt, aber meine zweitausend Zeilen-Methode getestet gut. Und ich habe das absolut entlarvt. Das ist absolut unmöglich. Erstens habe ich das schon viel zu oft gesehen, dass eine einzige Java-Methode mehr als zwei Zeilen Code hat, und das war absolut unangenehm und man kann das nicht richtig testen. Es gibt zu viele Bedingungen, die darin vorkommen, es gibt einfach zu viele Dinge, die in dieser einen Methode vor sich gehen, die aufgeschlüsselt werden müssen, um sie in kleinere, besser handhabbare Teile zu zerlegen. Mein zweiter Punkt ist, dass Qualitätscode mit Qualitätscode beginnt und dass Sie gute Programmierpraktiken anwenden müssen. Ich kann in diesem Kurs nicht alles unterrichten. Wir sind speziell auf die Prüfung nicht objektorientierte Programmierung oder gute Muster oder irgendetwas in der Art, aber Sie wollen tun, die Solid OOP werden. Einfach gutes OOP im Allgemeinen. Gang of Four Entwurfsmuster. Diese müssen Sie verstehen. Ein ausgezeichnetes Buch, das ich in die Rubrik "Bonus" aufnehmen werde. Ich werde dort einen Link zu Amazon einrichten. Ein sauberer Code, es ist ein älteres Buch. Es ist von Robert "Onkel Bob" Martin. Er ist ein kultiger Programmierer, ein sehr kluger Mann. Es sind wirklich viele gute Tipps dabei, z. B. dass die Methode nicht mehr als einen Bildschirm voll sein sollte. Wenn Sie also mehr als einen Bildschirm voller Code aneinanderreihen, tun Sie wahrscheinlich zu viel in dieser einen Methode. Es sind also nur kleine Faustregeln, sehr pragmatische Dinge, und es ist ein absolut großartiges Buch. Wenn Sie ein neuerer Entwickler sind, kann ich Ihnen dieses Buch nicht genug empfehlen. Mein letzter Punkt ist also, dass die Testabdeckung schlechte Kodierungspraktiken nicht überwinden kann. Denken Sie also darüber nach, wieder zur 2.000-Zeilen-Methode überzugehen. Angeblich wurde er einwandfrei getestet. Nein, Sie können keinen Einheitstest schreiben, also wird das alles abdecken. Ich möchte ein wenig über agile Testmethoden sprechen. Testgetriebene Entwicklung, das werden wir im Laufe des Kurses noch sehen. Zuerst schreibt man Tests, dann schreibt man Code, um den Test zu korrigieren, und dann refaktorisiert man den Code, um ihn zu bereinigen und zu verbessern. Ein sehr einfacher Prozess also. Was dies tut testgetriebene Entwicklung tatsächlich bekommen Sie Ihre Tests zuerst zu schreiben, so dass Sie einen fehlgeschlagenen Test haben und dann gehen Sie und implementieren, so dass es macht Sie ein wenig mehr darüber nachdenken, was Sie tun, die mit den Tests und am Ende des Prozesses haben Sie bereits den Test geschrieben, so dass, wenn Sie brauchen, um zu refactor oder etwas sind Sie gut zu gehen. Wir werden uns auch mit verhaltensorientierter Entwicklung befassen. Dies ist der testgetriebenen Entwicklung sehr ähnlich. Man kann sie sogar ein wenig miteinander vermischen. Hier wird das erwartete Verhalten von Software beschrieben, so dass es ein wenig aussagekräftiger ist. Es gefällt mir sehr gut, und wenn man die richtigen Werkzeuge benutzt, ist es eigentlich ganz nett. Ich verwende gerne Spock, ein verhaltensorientiertes Framework. Es ist sehr schön. Häufig werden Sie Ihren BDD-Test als wenn und dann blockieren und dann erwarte ich dies ausdrücken, oder Sie könnten sagen, gegeben eine Bedingung, wenn dies geschieht und dann erwarte ich dieses Ergebnis. Diese Logik hilft Ihnen also dabei, Ihren Test visuell besser zu strukturieren, wenn Sie darüber nachdenken, wie Sie den Test schreiben wollen. Was ist nun besser zu verwenden? Ich würde sagen, verwenden Sie beides. Das hängt davon ab, was Sie testen wollen. Wenn Sie sich ansehen, was ich schreibe, dann schreibe ich in einer Reihe von verschiedenen Sprachen. Manchmal hängt es davon ab, was ich benutze, und ich habe das Gefühl, dass es ein besseres Werkzeug ist. Manchmal hängt es von meiner Stimmung ab, da will ich ehrlich sein. Aber ich benutze sie, und manchmal hängt es wirklich davon ab, was man genau macht. Ich habe da also keine feste Faustregel. Jetzt noch ein paar andere Dinge, über die wir sprechen müssen, weil wir sie auch im Kurs sehen werden. Testkomponenten: Mocks. Dies kann ein sehr verwirrendes Gebiet sein. Ich werde jetzt nicht zu sehr in die Tiefe gehen. Ein Mock ist eine gefälschte Implementierung einer Klasse oder eines Objekts, das Sie in Tests verwenden werden. Es ist wie ein Test-Double. Denken Sie an die Datenquelle. Jeder, der an diesem Kurs teilnimmt, sollte ein Java-Entwickler sein, so dass wir alle schon einmal eine JDBC-Datenquelle gesehen haben. Ein Mock wäre eine Implementierung davon. Anstatt also eine Datenquelle von MySQL zu erhalten, indem ich das Jar dafür verwende, um eine Datenquelle dafür zu erhalten, könnte ich meine eigene Implementierung davon schreiben und Antworten an meine Klasse zurückgeben, die ich erwarte. Mocks können also erwartete Antworten liefern. Sie können auch die erwartete Interaktion überprüfen. Es gibt also ein paar wichtige Dinge über Mocks. Jetzt werden Spione wie eine Attrappe, aber ein echtes Objekt verwendet. Ich denke, die Spies sind eher wie Wrapper, die das eigentliche Objekt umhüllen, so dass man sagen kann, ich möchte etwas an diesem Objekt mit einem Spy außer Kraft setzen, aber gleichzeitig kann man auch sagen, wir möchten das normale Verhalten auslösen lassen. Spione sind also ein wenig verwirrend, aber das eigentliche Objekt ist nicht betroffen, und wir werden uns beide im Laufe des Kurses näher ansehen.