Latest / Coding Buddies | Tech & Dev-Mindset / #155 Next Level Testing mit Testcontainers
Transcript
- 0:00Stell dir mal folgendes vor. Du schreibst einen
- 0:01integrationstest Test ist grün, das Ganze geht auf die Pipeline
- 0:05grün und trotzdem funktioniert deine Software am Ende nicht
- 0:09mehr, dein Code ist nicht kaputt, deine Logik ist es auch
- 0:11nicht, sondern deine Datenbank, warum genau, darüber sprechen
- 0:16wir in der heutigen Folge und warum es eine Lösung gibt, die
- 0:19für viele Teams ein Game Changer war.
- 0:21Coding Buddies Dein Podcast rund um Softwareentwicklung und
- 0:24aktueller Tech News herzlich Willkommen.
- 0:39Halli Hallo und herzlich Willkommen zur neuen Folge von
- 0:42Coding Buddies Podcast, Deinem Podcast für Themen rund um die
- 0:47Softwareentwicklung. Und zwar mit den Coding Buddies
- 0:49und zwar mit mir, dem Fabi und dem Tino.
- 0:51Der sitzt mir gegenüber, er hat, ich sag jetzt einfach mal Bock,
- 0:55er sieht aus als hätte er Bock. Tino, Wie geht es dir?
- 0:57Grüß dich, Fabi, was geht ab, was geht ab, was geht down?
- 1:03Ja, haben wir ja auf Twitch gelernt.
- 1:05Jetzt ne. Ja, richtig, richtig.
- 1:08Ja ja, was geht, was geht. Ich hab Bock, hast du gut
- 1:10erkannt, ich hab ich hab richtig.
- 1:11Bock ist schön, klingst sehr entspannt.
- 1:15Das ist. Doch klar, Mensch, aber lass
- 1:17dich nicht täuschen. Ja, ich bin Feuer und Flamme für
- 1:20das heutige Thema eher. Entspannt sein, das ist in
- 1:23Ordnung. Also ich war kurz fast nicht
- 1:25entspannt, weil kennst du das? Wenn du also es gibt ne Sache,
- 1:29die find ich richtig richtig schlimm ne.
- 1:31Und zwar wenn du so kennst, du so.
- 1:32Du hast Krümel, die liegen irgendwo rum, ne kennt man und
- 1:37jetzt fängst du an diese Krümel zu nehmen und willst die so
- 1:41runter wischen in deine Hand rein.
- 1:43Vom Tisch oder so. Ja, vom Tisch oder so.
- 1:45Aber am besten ist die Kante noch so.
- 1:47Du kommst nicht ganz mit der Hand runter, sondern du kannst
- 1:49nur so an diese Kante ran. Du hast nicht so n richtigen
- 1:52Tisch weißt du, sondern nur so wenig Platz, so dass du das
- 1:55nicht runter schieben kannst unter die Kante, dann wischt du
- 1:57das so runter. Und dann wird keine.
- 1:59Saubere Nummer oder nee? Und dann fallen, ich weiß nicht,
- 2:02wie es bei dir ist, aber manchmal fallen so Krümel durch
- 2:05die Löcher zwischen den Fingern. Ich weiß gar nicht, was ich dazu
- 2:11sagen soll. Also das hören wir weiter.
- 2:14Das ist einfach super schlimm. Also du willst ja einfach nur
- 2:17das so in die in die Handfläche machen, aber dadurch, dass du ja
- 2:21nicht die Handfläche so richtig ranbringen kannst fallen fällt
- 2:24es auf die Handfläche und auf auf die Finger und bei den
- 2:26Fingern dann zwischen diese. Fingerlöcher nenn ich es jetzt
- 2:29mal. Fingerlöcher warte, ich guck
- 2:31gerade in meine Hand, OK, aber kannst du die Hand nicht, sag
- 2:35ich mal für dieses Szenario besser formen in Position
- 2:38bringen, dass da nicht so große Fingerlöcher sind.
- 2:41Also ich hab es probiert, ich hab ne Menge probiert, das
- 2:44passiert trotzdem immer wieder und ich bin übelst angenervt
- 2:46davon. Ich hab das Gefühl du kennst das
- 2:49nicht so. Aber nee, ich finde das nicht so
- 2:52krass tatsächlich. Ich versuch mich aber gerade
- 2:54natürlich wie immer ja. Als guter, als guter war die
- 2:57Versuch ich mich natürlich in deine Lage zu versetzen.
- 3:00Ich frag mich grad, ob ich das auch so anpissen würde, aber ich
- 3:03stell es mir mal vor und wie wie hast du es gelöst?
- 3:06Ich hab es, ich kann es nicht lösen.
- 3:07Das fällt auf den Boden und das nervt dann vorsichtiger.
- 3:12Ach so OK, kommt drauf an wenn ich n guten.
- 3:14Tag, hab einmal runtergefallen. Bleibt es da?
- 3:18Mich würd ja mal interessieren, ob das jemand auch so kennt.
- 3:21Dann schreibt uns bestimmt. Also das ist halt eine
- 3:25Nachricht. Absolut.
- 3:26Anstrengend, genauso anstrengend?
- 3:28Ja, ist es zum Beispiel auch, wenn man Tests hat, die Grün
- 3:34sind, aber dann am Ende deiner Anwendung trotzdem nicht läuft
- 3:37ja auch super nervig und genau darum geht es heute in dieser
- 3:41Folge. Oh, starke Überleitung, genau,
- 3:48ja, du lernst dazu auf jeden Fall.
- 3:52Genau. Was ist unser heutiges Thema?
- 3:54Wir wollen genau darüber sprechen, was du angedeutet
- 3:58hast, weil es einfach super viele Entwickler trifft und
- 4:00betrifft und deswegen hau ich einfach mal das erste Stichwort
- 4:04so in den Ringen, in unseren Podcastring und zwar Integration
- 4:07Tests, das wird heut viel um Integration Tests gehen
- 4:12einerseits als Problem und gleichzeitig wie man mit
- 4:17gewissen Tools. Die Lösung für diese Integration
- 4:20Tests schaffen kann, um einfach das ganze, sag ich mal,
- 4:24angenehmer zu gestalten, weil Fakt ist Integration Test
- 4:28spielen eine sehr sehr wichtige Rolle, das würd ich gerne mit
- 4:30dir auch noch mal n bisschen motivieren, weil die Lösung ist
- 4:33jetzt nicht weil dann wär die Folge ziemlich kurz einfach
- 4:35keine schreiben nein das ist nicht die Lösung aber man merkt
- 4:40halt oft, dass Projekte zum Beispiel viele gute Unit Tests
- 4:44haben, ne oder auch zeigen so ja guck mal hier Code coverage ja.
- 4:4995% an der 100 arbeiten wir, aber es sind schon 95 so ist n
- 4:54bisschen überspitzt gesagt. Ja, Code coverage kann man
- 4:57halten, davon halten was man will, uns ist es zum Beispiel
- 4:59nicht ganz so wichtig, dann lieber n paar Integration Tests
- 5:03dazu ja, aber was ist jetzt so das Problem dabei bei
- 5:07Integration, Test und Kernproblem worauf man immer
- 5:09wieder stößt. Bei Integration Test na ja, das
- 5:13Problem ist halt genau diese Integration.
- 5:15Ne, also du hast ja Unit Test testet halt im Endeffekt
- 5:18eigentlich reines reine Logik, also wirklich so ne einfache
- 5:21Funktion. Du hast n Input, du hast n
- 5:23Output da drin passiert irgendwas, es ist ne Berechnung,
- 5:25also kann man sich vorstellen wenn du einfach sagst du
- 5:29möchtest halt irgendwie. Aus einem Array, zum Beispiel
- 5:33von Zahlen. Möchtest du irgendeine bestimmte
- 5:35Berechnung machen und erwartest dann halt zum Beispiel einfach
- 5:38irgendeinen Ausgabewert ne oder du willst irgendwie nach
- 5:41bestimmt irgendwie nach einer bestimmten Art und Weise etwas
- 5:44sortieren und erwartest dann eine Sortierung so wie du sie
- 5:48dir vorstellst, einer Liste oder so.
- 5:49Als kleines Beispiel, dass man sich das vorstellen kann und das
- 5:53sind sehr, sehr einfache Tests in Anführungsstrichen, einfach
- 5:56weil du hast keine Abhängigkeiten, du hast diese.
- 5:59Klasse zum Beispiel, oder diese Funktion.
- 6:01Und diese Funktion hängt von nichts ab.
- 6:04Du kannst einfach mit diesem Code, der läuft arbeiten und das
- 6:08ist bei Integration Tests nicht unbedingt der Fall oder
- 6:10eigentlich genau deshalb nicht der Fall, weil du zum Beispiel
- 6:13Abhängigkeiten hast. Du hast.
- 6:15Deine Logik und diese Logik nutzt einen Service zum Beispiel
- 6:19n anderen Service und dieser Service zum Beispiel nutzt
- 6:21wiederum irgendwie hat n ne Connection zur Datenbank oder du
- 6:25testest n Service der direkt ne Connection zur Datenbank hat,
- 6:28also rein theoretisch, also in in echt ne, aber wenn du jetzt
- 6:33gerade in diesem Unit testbereich bist zum Beispiel
- 6:36oder halt vielleicht auch sagst, OK, ich möchte zwar irgendwie,
- 6:40also ich hab eigentlich ne Integration irgendwohin.
- 6:44Aber diese Integration möchte ich wegkapseln, damit ich
- 6:46eigentlich nur diesen Unit, also diesen Unit testen kann.
- 6:49Ja, das heißt du Kapst hart diese Integration, also du
- 6:52kapselst quasi Abhängigkeiten aus, das ist es ja am Ende, wenn
- 6:56du sagst, du möchtest wirklich nur diese, diesen diese Unit
- 6:59testen. Das Problem an dieser Stelle ist
- 7:02jetzt natürlich, wie du meintest, du hast natürlich
- 7:06genau diesen diese Abhängigkeit nicht getestet, das heißt wenn
- 7:09du sagst, du möchtest beispielsweise irgendwie was
- 7:11testen, was mit der Datenbank funktioniert.
- 7:13Kannst du natürlich sagen, du Mogst das oder Fakest das, das
- 7:17heißt du gibst irgendwie nen festen Rückgabewert zurück oder
- 7:20du sagst du bildest dir ne eigene kleine Logik was da
- 7:23passiert, kann aber dazu führen, dass gerade diese Schnittstelle
- 7:28dann am Ende nicht richtig funktioniert oder diese
- 7:30Komponente die dahinter hängt nicht genauso funktioniert wie
- 7:33sie funktionieren soll. Ne oder du sagst also ne, das
- 7:37ist ja jetzt im Ende, du kannst es ja noch weiter treiben und
- 7:39sagen. Gut, man muss es ja nicht
- 7:40unbedingt mocken oder faken, aber du kannst ja auch ne andere
- 7:43Komponente daran hängen, die zwar irgendwie das ist was du
- 7:48willst, aber auch nicht hundertprozentig, was am Ende
- 7:50bedeutet. Das was du lokal hast oder was
- 7:53du in deiner Testumgebung hast, ist nicht gleich deiner prot
- 7:56Umgebung ne. Genau das ist so im Prinzip das
- 8:00Fazit. Wenn wir noch mal auf die Code
- 8:04Coverage kommen bei Unit Test. Ja du kann ja 100% sein und jede
- 8:07Codezeile wird angelaufen in den Tests, aber du testest wie du
- 8:12meinst ja immer nur von deiner Seite aus und gibst ja statisch
- 8:16zum Beispiel vor was nach draußen geht oder was du
- 8:19empfängst. Ja also das kapselst du ab und
- 8:22gibst es im Test vor, was ne gute Sache ist.
- 8:24Keine Frage, Unit Test sind super wichtig.
- 8:27Aber das Problem ist einfach. Wer gewährleistet dir jetzt das
- 8:30in Port, also in der Produktivumgebung auch wirklich
- 8:34die Daten gefordert sind vom Third Party zum Beispiel ne von
- 8:38einem anderen Service oder du auch wirklich die Daten so
- 8:41kriegst und kriegen kannst. Und das ist ja n riesen Punkt,
- 8:46weil du stellst dir eine idealisierte Welt in deinen
- 8:50Tests vor, wie du sie gerade annimmst.
- 8:52Aber ob sie wirklich so ist und das so funktioniert kannst du
- 8:54halt gar nicht wissen, ne? Und deswegen gibt es ja
- 8:58Integration, Tests und da sagt man sich ja, aber ich kann ja
- 9:02nicht immer die komplette Infrastruktur, wie du sie gerade
- 9:05angesprochen hast, aufbauen. Ja, das ist ja super stressig,
- 9:09gut, dann brauche ich jetzt den Service, ja und der braucht aber
- 9:11das OK und dann willst du ja nicht.
- 9:15Sagen immer in meinen Tests gehe ich gegen irgendwelche echten
- 9:18Services oder nehmen wir mal Datenbanken, daran kann man das
- 9:22auch ganz gut erklären, weil das ja auch Integration Test
- 9:25bedeutet zu sagen, ich möchte jetzt aber wirklich mal Daten
- 9:28aus meiner Datenbank ziehen, oder?
- 9:30Reinschreiben. Ja, du möchtest ja das nicht mit
- 9:33deiner Prot Datenbank machen. Du kannst ja nicht die Tests auf
- 9:36deiner produktiven Datenbank laufen lassen.
- 9:38Ja, also musst du ja wieder irgendwas schaffen, was
- 9:42einerseits das Ziel von Integration Tests erfüllt und
- 9:46andererseits aber wirklich noch ne Testumgebung ist.
- 9:49Und das ist ne super schwierige Sache und da gab es so
- 9:52verschiedene Lösungen in den letzten Jahren, die auch gut
- 9:54waren, die sich immer mal gegenseitig n bisschen überholt
- 9:57haben und verbessert haben. Aber beispielsweise ich glaub
- 10:01das kennt viele, sind so in Memory Datenbank.
- 10:04Ja dass du sagst ich habe ne Datenbank die ist so aufgebaut
- 10:07wie meine echte Datenbank, die läuft aber komplett in meinem
- 10:11Speicher im RAM. Das heißt, da kann eigentlich
- 10:13nichts passieren. Ich fahr die hoch, die wird im
- 10:15Speicher aufgebaut, ich kann dann Daten da reinschreiben und
- 10:18wenn ich die Runterfahre und dann ist die aus dem Speicher
- 10:21raus und fertig, ja ist halt flüchtig in dem Moment.
- 10:24Ja, das heißt, die Daten sind natürlich auch immer wieder weg,
- 10:26was ja aber für Tests voll OK ist sogar gewünscht, du möchtest
- 10:30ja immer die gleiche Ausgangssituation haben, denn
- 10:33deswegen ist es ja auch wichtig das Ganze reproduzierbar zu
- 10:37machen. Wenn ich jetzt zum Beispiel
- 10:38gegen die echte Datenbank gehe, ja und sage ich füge.
- 10:42Diesen Eintrag hinzu und danach gibt es in dieser Tabelle einen
- 10:46Eintrag. Sowas ist ja dann schon ziemlich
- 10:48schwierig, wenn das die echte Datenbank ist und da die ganze
- 10:50Zeit durch dein produktivsystem Daten rein und rausgehen ja,
- 10:54also nur mal als Beispiel jetzt. Ich mein, rein theoretisch hast
- 10:56du ja einmal, dass du sagst, du lässt den Test einmal laufen,
- 10:59wenn du ihn noch mal laufen lässt.
- 11:00Hast du diesen Eintrag ja schon drin.
- 11:01Ne, das ist das eine und das andere ist, du hast ja
- 11:04eventuell, also ganz sicher, wenn du das machst auf deiner
- 11:08Produktivdatenbank. Super viele Testdaten, einfach
- 11:11drin. Ja, also das findest du ja auch
- 11:13nicht, also selbst wenn du irgendwie n System hast wo du
- 11:16User irgendwie hast ist es ja dann am Ende zum Beispiel auch
- 11:19gar nicht mehr kann das kann du kannst ja auch gar nicht mehr ne
- 11:22Aussage treffen darüber wieviel User gibt es denn auf meinem
- 11:25Service? Weil keine Ahnung 90% sind davon
- 11:28Test User die einfach so entstanden.
- 11:31Richtig richtig kommt ja nach. Genau deswegen fängst du ja an,
- 11:33denn wieder Testumgebung zu schaffen, dann fängst du wieder
- 11:36an, Fakes und Mogs zu schreiben, ne oder halt ne in Memory
- 11:39Datenbank zu nehmen, das heißt du gehst zwar n Schritt weiter
- 11:42und Gaukelst wieder irgendeine Integration vor, aber sie ist
- 11:46auch nicht so richtig, also sie kommt sag ich mal deiner echten
- 11:51Umgebung natürlich wesentlich näher als n reiner Unit Test.
- 11:56Aber es ist immer noch nicht so deine echte Umgebung und
- 11:59deswegen trifft trifft man quasi bei dieser Art und Weise ja zum
- 12:04Beispiel mit in Memory Datenbank.
- 12:07Da haben wir auch ja selbst unsere Erfahrung gesammelt, würd
- 12:09ich gern mit dir nachher auch drüber sprechen wie warum wir
- 12:13zum Beispiel gewisse Dinge umgestellt haben und das ist
- 12:16nämlich ein Grund davon, du triffst halt zwangsläufig
- 12:18irgendwann auf Bugs, weil du sagst ey es läuft in meiner in
- 12:21Memory Datenbank alles cool. Beispielsweise auch so Datenbank
- 12:26Migration Riesen Stichwort können wir auch später noch mal
- 12:29genauer drauf eingehen, aber es ist halt nicht deine echte
- 12:33Datenbank. Du hast zum Beispiel produktiv
- 12:35postress laufen, ne ne postress SQL Datenbank und in Memory
- 12:41sagst du ja es ist ne meinetwegen ne Age to in Memory
- 12:45Datenbank postress angelehnt so ne aber es ist halt nicht das
- 12:49gleiche ja das eine. Simuliert das sag ich mal und
- 12:54das andere ist wirklich ne echte Datenbank.
- 12:56Und ja, die sind nicht schlecht, für gewisse Sachen ist immer die
- 12:59Frage wie umfangreich nutzt du das oder was machst du wirklich
- 13:02damit? Ja wie komplex ist deine
- 13:04Datenbank, ich will das ja nicht verteufeln, wir haben ja auch
- 13:07öfter schon in Memory Datenbanken genutzt, aber wenn
- 13:10es wirklich Richtung viele Migration geht, komplexere
- 13:15Statements zum Beispiel, ja dann merkst du halt dann kommt n
- 13:18Punkt dass gewisse Features. Die eine Datenbank unterstützt
- 13:23und die andere nicht. Dass gewisse Migrationen auf der
- 13:25einen Laufen und auf der anderen nicht und im Worst Case läuft es
- 13:28in Memory alles rund. Du sagst ey meine Tests sind
- 13:31grün, läuft doch alles schiebst das Ganze produktiv hoch und auf
- 13:35einmal sagt Deine Datenbank so ist nicht mehr das war es ja
- 13:38Migration fehlgeschlagen oder Daten irgendwie korrupt was auch
- 13:41immer denn passieren kann. Ja und das ist halt n echt n
- 13:44großes Problem ja und n großes Risiko und da hat man quasi.
- 13:50Sich dann über die Jahre Gedanken gemacht, wie kann ich
- 13:52das denn besser machen? Und jetzt denkt sich vielleicht
- 13:56der ein oder andere Na hier ja gut Integration Test hin oder
- 13:59her, so oft kommt das ja auch nicht vor, aber ganz klar muss
- 14:04man hier auch sagen, dass moderne Software sehr sehr oft
- 14:08viel Integration Code beinhaltet.
- 14:10Ja und das ist jetzt nicht nur Datenbank, Datenbank ist somit
- 14:13das Erste was beispielsweise bei Backends immer mit dranhängt
- 14:17oder oft. Ja.
- 14:19Aber du hast ja auch. Wie du meintest so Third Party
- 14:22Services zum Beispiel sowas wie Search Engines wie elastic
- 14:28Search oder so wo du sagst ja ich kann ja nicht immer gegen
- 14:31nen Service gehen der mich echt Geld kostet, auch am Ende ja ist
- 14:35ja auch n Punkt wenn da irgendein Abo ne Paywall
- 14:38sozusagen dahinter ist, dass ich sage jede Anfrage kostet mich
- 14:41Geld oder sagen wir mal heutzutage.
- 14:43Mit mit irgendwelchen APIS von von LLMS oder sowas.
- 14:48Ja ist ja auch n Punkt ne weil sich.
- 14:51APIS auch schnell wechseln können.
- 14:52Ne, da hatte ich jetzt zum Beispiel, also da hatten hatte
- 14:55ich mal in einem alten Projekt haben wir auch so eigentlich
- 15:00genau versucht dieses Thema so zu tackeln sag ich jetzt mal,
- 15:03weil da ging es auch wirklich darum, dass wir halt ne relativ
- 15:07komplexe Infrastruktur hatten, auch mit Services, von denen das
- 15:11ganze abhing und so weiter. Und diese Services hatten aber
- 15:15eben zum Beispiel keine. Du hattest keine Möglichkeit da
- 15:17so ne Art Testinstanz zu nutzen, ne, manchmal hast du ja bei
- 15:21Services, das ist ja ganz cool, wenn du wirklich sowas hast wie
- 15:24ne QR Instanz, ne prot Instanz und wirklich ne ne dev Instanz
- 15:29wo du wirklich gefühlt alles mitmachen kannst was du
- 15:31eigentlich machen möchtest, so dass das ist.
- 15:32So Play Ground, dann ne. Genau, dass es auch zur
- 15:34Verfügung gestellt wird, also dass.
- 15:36Ich zum Beispiel sage mal als Beispiel ne Tino, Ich hab hier
- 15:38nen Service und du kannst diese Instanz nutzen, da kannst du
- 15:42alles mitmachen wie du möchtest. So ne und die ist aber immer to
- 15:45Date zu dem was eigentlich die eigentliche Anwendung macht.
- 15:48Ne das ist natürlich auch wirklich wichtig an der Stelle,
- 15:50weil wenn du zum Beispiel deine Dev Anwendung anders gestaltest,
- 15:53also deutlich anders als die pod Anwendung und das nimmst du dann
- 15:55zum Testen ist natürlich auch wieder schwierig weil dann
- 15:58testest du gegen ne Instanz wie prot und wenn du dann aber am
- 16:01Ende gegen Prot arbeitest sozusagen, dann ist es natürlich
- 16:03schwierig. Was ich interessant fand, war,
- 16:06dass wir dann genau an der Stelle uns auch überlegt haben,
- 16:09was kann man denn jetzt machen, weil dann kommst du nämlich
- 16:11genau in diesen Punkt. Du willst Integrations
- 16:12Integration Tests schreiben ja und hast aber keine Instanz auf
- 16:24der du das machen kannst. Also fragt man sich dann OK mog
- 16:28ich das oder wie mach ich das? Und dann haben wir am Ende
- 16:30gesagt OK wir nehmen Dockercontainer und bauen da so
- 16:32n Kleines. Node backend rein in so
- 16:35nodexpress haben wir genommen, war ging halt super schnell das
- 16:38einfach zu machen und auf bestimmte Anfragen haben wir
- 16:40halt valide Antworten zurückgegeben, was auf jeden
- 16:44Fall ne gute Sache war und auf ich sag mal dem ganzen schon
- 16:47relativ nah kam für du hast eine Umgebung die einigermaßen
- 16:52ähnlich ist zu der mit der du arbeitest.
- 16:54Zumindest für diese Calls die du testen willst die du nutzt, aber
- 16:59weil du ja auch meintest so du hast zum Beispiel ne externe
- 17:01API, das war ja genau das gleiche.
- 17:03Und da hatten wir zum Beispiel auch das Problem, dass wir zwar
- 17:07lokal gemerkt haben, ey, wir lassen unsere ganzen Tests
- 17:09laufen, alles ist cool, aber auf einmal hat es auf der auf auf,
- 17:13ich sag mal zumindest auf der dev Umgebung nicht mehr
- 17:15funktioniert, weil da liefen dann zum Beispiel oder auf der
- 17:17QR Umgebung, weil ich glaub ne QR Stage hatten sie oder so oder
- 17:20irgendwo ne spätestens bei prot hat es halt geknallt, weil diese
- 17:26diese die API von denen sozusagen angepasst wurde.
- 17:29Das hast du natürlich nicht angepasst in deinem.
- 17:31Moc oder in deinem ich sag mal Container moc.
- 17:33Es war ja sozusagen irgendwo ne Art kleines kleiner
- 17:37Dockercontainer für Integrationtest, der aber am
- 17:39Ende doch nichts anderes als n moc war für diese API ne, aber
- 17:44wie gesagt war ganz nett gedacht, aber am Ende hast du
- 17:47immer noch dieses Problem, dass das halt nicht hundertprozentig
- 17:52funktioniert hat, was natürlich aber auch allgemein n
- 17:56schwieriges Thema ist. Ne, wenn du irgendwo n externen
- 17:58Service nutzt, den du halt nicht.
- 18:01Für Tests nutzen kannst in dem Fall, aber dir fehlt halt die
- 18:04Umgebung, ne. Aber man muss natürlich sagen,
- 18:07dadurch habt ihr ja die Integration Tests ja schon ein
- 18:13Stück realistischer gemacht, ne, weil ja wirklich ne echte
- 18:16Kommunikation dann stattfindet. Das heißt der Gedankengang
- 18:20dahinter war ja absolut richtig, es war ja auf jeden Fall ne gute
- 18:23Practice das so zu machen. Natürlich hast du recht, das
- 18:27Ding ist halt. Es gibt ne Sache, die kannst du
- 18:29halt schwer lösen, wenn der Service den du verwendest es
- 18:32nicht bereitstellt Testumgebung zu haben, wirst du natürlich
- 18:37niemals das so sauber sag ich mal faken können oder nachbauen
- 18:44können, dass es zu 100% immer dem dem echten Service
- 18:49entspricht. Also ihr seid ja sehr nah
- 18:51rangekommen, indem ihr quasi. Die Antworten realistisch
- 18:55übertragen habt, aber die waren natürlich am Ende gemockt.
- 18:57Aber das meine ich. Es ist halt, es ist halt quasi
- 19:00möglichst daran, wenn es nicht ganz dran geht, sozusagen ne,
- 19:05dann kann man wenigstens versuchen so weit wie möglich
- 19:07und. So genau.
- 19:07Aber wenn die natürlich was umstellen.
- 19:09Irgendwelche Versionen der APIS sich weiterentwickeln, ne, dass
- 19:14du auf einmal andere keine Ahnung, Endpunkte fallen weg,
- 19:17neue kommen dazu, sie ändern sich, ist ja gang und gäbe dass
- 19:20sowas passiert, ne. Dann kann es natürlich sein,
- 19:24dass dann das Ganze auch failed am Ende oder dir noch
- 19:28vorgaukelt, dass es funktioniert, aber auf prod.
- 19:31Dann halt nicht mehr. Aber deswegen finde ich auch das
- 19:34Beispiel deswegen ganz kurz noch, weil du gesagt hast,
- 19:37Datenbanken und lästig Search zum Beispiel, das sind ja zum
- 19:40Beispiel Dinge, die kannst du ja wirklich 1 zu 1 sozusagen ich,
- 19:44ich sag mal nachstellen und nicht mit einer Memory Datenbank
- 19:47zum Beispiel ne. Und das ist ja cool, ne?
- 19:49Also da deswegen nur noch mal ganz kurz, es geht nicht immer
- 19:52hundertprozentig, aber wenn es geht, dann kann man es halt
- 19:55machen und das ist halt dann das gute, genau weil sonst hast du
- 19:59am Ende immer das Problem dieses typische Works on My Machine
- 20:02greift hier halt auch ne, weil das was bei euch da auch noch
- 20:06der Fall war ich mein Ich weiß nicht genau wie ihr es umgesetzt
- 20:09habt, aber es ist zwar n Schritt weiter zu sagen ich fahr selbst
- 20:12dockercontainer hoch wo das läuft gegen die lass ich denn
- 20:15meine Tests laufen ist ne gute Sache aber bringt.
- 20:18Bringt natürlich auch ne gewisse Konfiguration Infrastruktur mit
- 20:22sich. Die Umgebung muss passen, bei
- 20:24dem anderen läuft es bei dir selbst nicht.
- 20:26Er sagt Works on my machine, not my Problem, so weißt du aber an
- 20:32der Stelle und auch mit diesen Def Ops Gedanken der hier auch
- 20:35wieder greift, wie schaffen wir es denn das Ganze automatisiert
- 20:41und quasi. Auf jeder Plattform, bei jedem
- 20:46so laufen lassen zu können, dass es immer gleich funktioniert,
- 20:48dass es bei dir lokal funktioniert, bei deinem
- 20:51Kollegen lokal funktioniert es auf der Pipeline funktioniert
- 20:54und im besten Falle natürlich auch noch dem Produktiven
- 20:57entspricht. Und da sind halt wie gesagt in
- 21:02in Memory Datenbanken haben wir schon drüber gesprochen, sind
- 21:04super bequem, sie sind vor allem schnell ne, weil das wird in
- 21:07Speicher geladen aus dem Speicher gezogen fertig super
- 21:10Sache und. Wir wollen ja auch immer so n
- 21:14bisschen über unsere Projekte reden und zum Beispiel das
- 21:17Backend, was wir für unsere Coding Buddies Services
- 21:21schreiben. Hatte ja im Prinzip auch anfangs
- 21:25in den Tests eine in Memory Datenbank, weil das Macht
- 21:28einfach Sinn auch so zu starten. Ja das geht schnell, ist schnell
- 21:31eingerichtet und es ist schnell, flexibel und pflegeleicht sag
- 21:36ich mal ne das Bedarf kein großes Setup, das heißt?
- 21:40Das knallst du in deine Testumgebung mit rein und wenn
- 21:43du jetzt beispielsweise das Ausführst und das Repo
- 21:46Auscheckst so gerade am Anfang, da musst du nicht viel machen.
- 21:49Weißt du, das läuft so. Wenn ich jetzt aber den Weg gehe
- 21:52und sage, na ja, aber warte mal, du brauchst hier den
- 21:55Dockercontainer und dann den Dockercontainer und warte man
- 21:58zieht dir mal das noch und weißt du ist jetzt überspitzt gesagt,
- 22:02lässt sich auch automatisieren ist mir klar, aber es bringt
- 22:06halt natürlich mehr Aufwand mit sich, ne und?
- 22:09Genau da sind wir aber und deswegen auch das Thema heute
- 22:13plus an die Anmerkung haben wir gar nicht gesagt, Wa wie es war
- 22:17auch n Community Wunsch auf das auf die Lösung des Problems wo
- 22:20wir gleich noch drauf eingehen und deswegen dachten wir uns ey
- 22:23Mensch das sind unsere Erfahrungen die genau mit dieser
- 22:25Lösung sehr gut matchen, deswegen haben wir uns natürlich
- 22:28dem Thema angenommen jetzt was wollte ich sagen Ach so genau
- 22:33aber wir sind natürlich dann trotzdem irgendwann in das
- 22:35Problem gelaufen, dass die in Memory Datenbank zu sehr.
- 22:38Abweichend war von unserer Produktivdatenbank spätestens
- 22:43bei Datenbankmigration auch n sehr spannendes Thema.
- 22:48Nutzen wir beispielsweise an der Stelle Flyway für liebe Zuhörer,
- 22:51liebe Zuhörer, falls sich das Thema interessiert
- 22:53Datenbankmigration, wo jetzt viele sagen.
- 22:57Hau bitte ab mit dem Thema, denkt sich ja vielleicht der ein
- 23:01oder andere ist n Cooles. Thema ist spannend, ist wichtig.
- 23:03Wichtig ist es auf jeden Fall, dann schreib uns gerne, wenn wir
- 23:07da mehr Content zu machen sollen oder meine eigene Folge zu
- 23:10definitiv, ich find es aber auf jeden Fall ganz interessant um
- 23:14kurz einzuhaken an der Stelle, weil genau die weil du
- 23:18datenbankmigration ansprichst und ich finde datenbankmigration
- 23:21ich finde du kannst alles eigentlich relativ entspannt
- 23:24testen, ne und? Auch bei dem Beispiel, was ich
- 23:27genannt hatte, zum Beispiel, da haben wir auch echt ne Menge
- 23:29Tests gehabt. Wir hatten halt Unit Tests, Wir
- 23:31hatten Integration, Tests, Wir sind noch weiter gegangen mit
- 23:33System Tests und hatten halt zum Beispiel diese Dockercontainer
- 23:36die wir da hatten, hatten wir auch für die System Tests
- 23:39laufen, im Endeffekt war es dann auch so, dass immer wenn wir die
- 23:42Tests gestartet haben einfach lokal ne kleiner Befehl, dass
- 23:45die Tests starten, da wurden dann auch weil am Anfang war es
- 23:48dann so irgendjemand kommt neu ins Team.
- 23:50Lässt die Tests laufen und sagt ja, es geht nicht.
- 23:52Hier failen Tests und ja OK hast du die Docker, also Docker
- 23:55compost gemacht so ne bis man dann irgendwie sich denkt so OK
- 23:58ist paar mal passiert, lass das mal noch in diesen Testbefehl
- 24:02mit reinpacken das wenn du den Testbefehl ne so nach modern ne
- 24:05NG test keine Ahnung frag mich nicht NPM test aber also egal
- 24:11welche Testumgebung du gerade laufen lässt, aber das was du
- 24:13wolltest einfach diesen testbefehl ne Test all mir egal.
- 24:19Lässt du laufen, dann sind halt die Docker Container
- 24:22hochgefahren und dann wurde alles getestet.
- 24:24Dann sind einmal die Unit Tests durchgelaufen, die Integration
- 24:26Tests, die E To e Tests und alles mögliche und das ist
- 24:30soweit ja auch ganz gut und es hat auch sehr wurde auch sehr
- 24:33viel abgetestet und die Test Abdeckung oder die ich sag mal
- 24:37die Verlässlichkeit. Dass deine, Deine, dass deine
- 24:43Software auch richtig funktioniert, die war echt hoch,
- 24:45muss ich sagen, die hat mir sehr gut gefallen und es gab aber
- 24:48wirklich einen Painpoint, der mir immer wieder Bauchschmerzen
- 24:52gemacht hat und das war datenbankmigration muss ich ganz
- 24:54ehrlich sagen, weil ich zum Beispiel auch schon geschafft
- 24:57habe ne wie du meintest, selbst wenn du ne Datenbank hast, die
- 25:01du irgendwie lokal nur mal so laufen lässt und aber zum
- 25:07Beispiel dann. Diese ganze Migration, ne, also
- 25:11von Flyway beispielsweise, oder es gibt ja auch Liqui Base oder
- 25:14was auch immer man da nehmen möchte, aber wenn diese nicht
- 25:17durchläuft in deinen Tests oder in deiner Umgebung, dann hab ich
- 25:21es zum Beispiel auch schon mal geschafft irgendwelche Foreign
- 25:24constraints zu zu zerstören, was man aber auch erst n bisschen
- 25:27später dann gemerkt hat, wo man dann sich gedacht hat, OK warte
- 25:30mal, wieso konnte ich zum Beispiel diese Entität löschen,
- 25:33obwohl es ja eigentlich. Ne Verbindung zu einem anderen
- 25:37Objekt gab was noch da ist. Also das dürfte eigentlich gar
- 25:39nicht gelöscht sein, oder? Das wurde nicht mitgelöscht,
- 25:42weil ne das sozusagen so ne Abhängigkeit auf das Objekt
- 25:44hatte. Wenn ich das lösche lösche ich
- 25:45auch das und das ist dann echt richtig schwierig, weil erstens
- 25:49musst du es auf der Produktivdatenbank wieder fixen
- 25:51ne und zweitens musst du erstmal checken, dass es da ist.
- 25:55Wie lange dauert es bis du es checkst und ich fand auch
- 25:59wirklich dieses Problem von Datenbankmigration was du
- 26:00angesprochen hast ist n super heftiges Problem.
- 26:04Was man eigentlich auch abtesten sollte, weil wenn du das nicht
- 26:07abtestest kann kannst. Du kann deine ganze Software
- 26:10wunderbar funktionieren, aber am Ende fliegt dir trotzdem alles
- 26:13um die Ohren. Das ist find.
- 26:15Ich sehr, sehr heikles Thema, weil du sagst Datenbanken
- 26:17langweilig schalt ich aus, niemals ausschalten an dieser
- 26:20Stelle. Nee, aber das ist halt genau der
- 26:24Punkt, was bei uns ja auch Probleme gemacht hat ist weil so
- 26:29sehr du quasi auf einer. In Memory Datenbank
- 26:32beispielsweise arbeitest die Tests laufen lässt irgendwas
- 26:36Hinzufügst, einträgst löscht, änderst.
- 26:38Wie auch immer das mag alles funktionieren, aber gerade wenn
- 26:41es so um Sachen wie Migration geht, hast du einfach das
- 26:44Problem, dass es eine falsche Datenbank ist am Ende, es ist
- 26:46nicht die Datenbank die produktiv läuft, es ist nicht
- 26:52die Version, es ist nicht der Typ, es ist einfach nur eine
- 26:55Nachbildung. Und das ist auch der Grund,
- 26:58warum wir dann umgestiegen sind und gesagt haben, OK, nein, es
- 27:02gibt Tools und Lösungen, die sind gut, die funktionieren gut.
- 27:05Wir nehmen uns jetzt die Zeit und bauen das um, weil einfach
- 27:08das Projekt, oder sag ich mal ja doch das ganze Softwareprojekt
- 27:14immer größer wurde, immer mehr Bedeutung gewonnen hatte und
- 27:17natürlich irgendwann gewisse Qualität fordert, sag ich mal
- 27:21auch in der Testumgebung, gerade in der Testumgebung.
- 27:24Und dann haben wir entschieden, dass wir sagen, OK, wir gehen
- 27:28weg von der h 2 Datenbank, also die in Memory Datenbank hinzu,
- 27:33einer echten Postquest Datenbank in der gleichen Version, wie sie
- 27:36produktiv läuft. Und wie machen wir das ganze
- 27:39Vollautomatisiert, dass es immer in unserer Test Automatisierung
- 27:43Testumgebung mitläuft, automatisiert so rum und sind ja
- 27:49letztendlich dann bei Testcontainers gelandet und
- 27:52testcontainers. Oder Testcontainer allgemein
- 27:55sind ne super Sache und das ist auch so die Hauptmotivation des
- 27:59Themas, weil es einfach Integration Test super super
- 28:03vereinfacht. Aber lass uns doch mal bevor.
- 28:08Also es gibt ja bestimmt den ein oder anderen Zuhörer oder
- 28:10Zuhörerin, die jetzt nicht weiß was testcontainer sind.
- 28:14Also bevor wir jetzt über vor und Nachteile sprechen, magst du
- 28:17mal grob anreißen. Was da eigentlich dahinter
- 28:22steckt und ich finde es ganz cool, dass du das Beispiel
- 28:24gebracht hast mit dem Skript, bevor die Tests starten.
- 28:29Ne, dass du n Skript schreibst. Docker compose hier und da, weil
- 28:33ich finde das ist quasi so ne Vorstufe, dass ihr gesagt habt,
- 28:37OK, das Problem ist da, weil der eine hat die Container nicht
- 28:39laufen, der andere hat sie noch gar nicht drauf, die Docker
- 28:42Images oder Container am Laufen, wie auch immer, jeder ist aber
- 28:45irgendwo an einem anderen.in seiner Umgebung.
- 28:48Und dann habt ihr angefangen, Skripte zu schreiben, um das zu
- 28:51automatisieren. Genau, und jetzt kommt
- 28:54Testcontainer. Jetzt kommt Testcontainer also
- 28:58Testcontainer ist nicht einfach nur n Container, den man zum
- 29:00Testen nimmt, also sowohl ja als auch nicht unbedingt, weil das
- 29:04ist der Name von der Library, so kann man sich das vorstellen,
- 29:07das heißt Testcontainer ist einfach.
- 29:09Ne Library die du halt nutzen kannst um halt eben genau das so
- 29:14zu machen oder diese das Problem zu lösen oder die Probleme zu
- 29:18lösen, die wir gerade so n bisschen geschildert haben oder
- 29:20diese Painpoints es erlaubt nämlich am Ende, dass du sagst,
- 29:24du hast Dockercontainer, also es arbeitet mit Dockercontainer,
- 29:27wenn du nicht weißt jetzt was n dockercontainer ist.
- 29:29Liebe zuhören lieber Zuhörer oder sagst ja ich weiß es zwar,
- 29:32aber irgendwie interessiert mich das noch mal.
- 29:33Wir haben ne Folge ausschließlich über
- 29:35Dockercontainer, also hör da gerne rein und dann hör jetzt
- 29:38hier weiter, oder? Mach hier einfach weiter danach.
- 29:41Genau, aber bis gleich, aber es nutzt halt Dockercontainer und
- 29:48du kannst halt in diesen Dockercontainern entsprechende
- 29:51Dinge starten, die du halt haben möchtest.
- 29:54Zum Beispiel sowas wie ne Post SQL Datenbank.
- 29:58Ich weiß nicht wie nennt man das Postgres QL postgres?
- 30:01Post ich sag mal postgres. Ja, jetzt kommt es
- 30:06wahrscheinlich auch der ein oder andere und sagt.
- 30:08Nein. Ich find das ist ja, es ist, es
- 30:11ist schwierig sich auf eine wie sagt man auf dem Naming zu
- 30:15einigen bei sowas, bei solchen Sachen, aber du kannst zum
- 30:18Beispiel so ne Datenbank nehmen und die starten, das heißt du
- 30:20hast am Ende wirklich in deinen Testcontainer zum Beispiel
- 30:24wirklich ne Datenbank drin die genauso ist 1 zu 1 wie die
- 30:27Datenbank die du auch ja lokal lokal Remote auf prot.
- 30:34Wie auch immer irgendwo laufen lassen hast.
- 30:36Ne das heißt du kannst. Dir es auch vorstellen und
- 30:39sagen, gut, du musst jetzt nicht unbedingt, weil Tina ja meintest
- 30:41ne Vorstufe, du musst jetzt nicht unbedingt sagen, du nimmst
- 30:45n testcontainer. Du kannst natürlich auch n
- 30:47eigenen Dockercontainer schreiben, wo du genau ne Post
- 30:50postgress Datenbank aufsetzt, was auch immer, geht ja auch du
- 30:55kannst es dir selber nachbauen oder du nimmst halt eben diese
- 30:57Library, die dir halt ne Menge abnimmt, ja weniger Arbeit, so
- 31:00kann man sich das vorstellen und im Endeffekt ist es dann nämlich
- 31:04genau so, dass die Tests dann auch wirklich.
- 31:08Also diese Container automatisch starten.
- 31:11Das heißt, du lässt deine Tests laufen und deine Container
- 31:15fahren hoch, deine testcontainer, wo halt eben
- 31:17deine ganzen Abhängigkeiten drin laufen, die du dir halt
- 31:20zusammenbastelst, so wie du sie brauchst und wie zum Beispiel
- 31:25halt eben die postgres Datenbank.
- 31:28Und dann laufen deine Tests. Also erstmal werden die
- 31:30Container hochgefahren, deine Tests starten und deine
- 31:34Integration kann sozusagen genau in deine Testcontainer ja
- 31:41reinintegrieren Reinintegrieren deine Integration Tests nutzen,
- 31:46dann die Testcontainer am Ende genau und.
- 31:51Wenn die Tests halt fertig sind, werden diese Testcontainer auch
- 31:53wieder gelöscht. Logischerweise, das heißt du
- 31:54hast auf jeden Fall immer wenn du diese Tests laufen lässt und
- 31:56wenn die Tests vorbei sind, hast du immer wieder einen clearen
- 31:59cleanen Zustand, mit dem du dann am Ende wieder arbeiten kannst
- 32:04und du musst dich nicht darum kümmern wie Tino, wie du es ja
- 32:07auch so schön meintest. Man muss jetzt nicht erstmal die
- 32:10irgendwie einen Docker compose abmachen.
- 32:12Gucken, dass die Dockercontainer alle soweit richtig sind et
- 32:15cetera PP, sondern du sagst halt einfach nur ich lass es.
- 32:18Also Start ist los, es geht los, es wird automatisch abgeräumt,
- 32:22alles fertig. Genau das ist halt ne super
- 32:25Sache, weil diese Container wirklich für den Testlauf
- 32:28erschaffen werden. Verwendet werden und abgeräumt
- 32:31werden und. Du musst dir auch nicht mal
- 32:35wirklich Gedanken drüber machen, auf welchem Port läuft das und
- 32:39so weiter weil das wird kann dir alles abgenommen werden.
- 32:41Du kannst natürlich auch in Konfiguration sagen Nein.
- 32:45Keine Ahnung, ich kann nur diesen Port dafür nehmen.
- 32:47OK, aber das Schöne ist, wenn du es automatisiert machst, dann
- 32:51nutzt er halt einen freien Port, sucht sich den und alles leitet
- 32:54automatisch dahin und du musst dir da gar keine Gedanken zu
- 32:57machen. Ja also es der Ablauf ist
- 32:59wirklich simpel und die Konfiguration ist auch simpel,
- 33:02gerade wenn du jetzt sagst ich möchte einfach nur nen
- 33:05Dockercontainer also mein Testcontainer soll den
- 33:08Dockercontainer mit einem Image haben wo ne Postgress in der
- 33:11Version XY drin ist und ich sage.
- 33:14Der User ist das Passwort ist das und die Datenbank heißt so
- 33:18und so fertig. Ja.
- 33:20Die URL dafür wird automatisch zusammengesetzt.
- 33:23Port wird entschieden wie gesagt, der Port wird natürlich
- 33:26in der URL auch berücksichtigt und dann läuft das Ding, also es
- 33:29ist wirklich so einfach wie es sich anhört an der Stelle.
- 33:33Klar, es gibt immer komplexe Fälle, wenn ich viele Partys hab
- 33:37die ich da drin abbilden möchte, muss ich natürlich mehr
- 33:40Konfiguration schreiben als jetzt so ne einfache Datenbank.
- 33:44Aber ich kann dann, wenn ich die echte Datenbank hab, zum
- 33:46Beispiel auch einfach alle meine Flyway Skripte da drüber jagen,
- 33:49was ne super Sache ist. Ne?
- 33:50Also die komplette Migration kann da einmal durchlaufen.
- 33:54Ne von den ersten Skripten die die Datenbank Tables beispiels
- 33:57beispielhaft beispielhaft aufbaut, meine Güte.
- 34:01Bis hinzu Migration, die später stattfindet, dass Tables wieder
- 34:04weg können, sich ändern. Wie auch immer, aber ich kann
- 34:06die ganze Historie noch mal da durchjahren, was ne super Sache
- 34:10ist, gerade bei so Migration. Ja und?
- 34:12Spätestens dann, ja spätestens dann, wenn du sagst, du hast
- 34:15deine Datenbankmigration, die durchläuft deine ganzen flyrate
- 34:18Skripte. Liebe zu lieber zu ganz kurz,
- 34:21falls sich flyray oder so interessiert wie das
- 34:22funktioniert, können wir auch gerne Folge drüber machen,
- 34:25ansonsten setzen wir jetzt einfach voraus, dass man weiß,
- 34:28was flyray ist. Aber Datenbankmigration ist halt
- 34:32so, wenn du deine Datenbasis n bisschen ändern möchtest, dann
- 34:35kannst du es nicht einfach so machen, sondern du musst halt
- 34:37was dafür tun oder irgendwas dafür nutzen und dafür kann man
- 34:40zum Beispiel Flyray nutzen und das Gute ist aber, wenn du das
- 34:43durchlaufen lassen kannst und deine Daten deiner Tables
- 34:46veränderst, sozusagen also deine, ich sag mal deine
- 34:51Tabellenköpfe zum Beispiel oder was auch immer.
- 34:54Und dann deine Systemtests zum Beispiel laufen lässt.
- 34:56Dann kannst du ja zum Beispiel wirklich auch checken, ob
- 34:59bestimmte Dinge abgeräumt werden können oder eben nicht, weil zum
- 35:04Beispiel, wie ich meinte, Foreign Constraints hinterher
- 35:07aus Versehen gelöscht wurden oder nicht ne, weil genau das
- 35:11war ja damals das Problem, was dann sozusagen aufgetreten ist.
- 35:14Und das sowas kann man natürlich auch.
- 35:17Darüber checken, das ist natürlich super, musst du
- 35:20natürlich auch n bisschen gucken, dass du deine Tests
- 35:22sozusagen dementsprechend gestaltest, dass du auch
- 35:24wirklich checkst oder abtestest cirtest, dass halt genau das
- 35:29auch so sein muss, ne, aber das ist natürlich dann testqualität
- 35:33am Ende, aber das hilft natürlich dann ne.
- 35:38Genau, und dadurch hatten wir natürlich jetzt einfach den
- 35:40Vorteil, dass wir gesagt haben, OK, wir haben die echte
- 35:42Datenbank natürlich nicht mit den echten Daten, aber dann die.
- 35:45Wie eingangs eingangs erwähnt, wollen wir sie ja auch nicht
- 35:48haben. Wir wollen ja auch nicht auf der
- 35:49echten Datenbank überall testdaten reinschreiben, sondern
- 35:52wirklich ne Datenbank hochfahren, testdaten
- 35:54Raufschreiben löschen, verarbeiten, wie auch immer und
- 35:57danach abräumen und dann wieder von vorne in dem Zustand
- 36:00starten, dass alles bei 0 ist. Ja, und das kannst du produktiv
- 36:03halt nicht machen, aber wir haben jetzt den Punkt erreicht,
- 36:05dass es die echte Datenbank ist. Am Ende ja.
- 36:08Und wenn man sich jetzt ganz kurz, vielleicht ist es noch
- 36:10nicht ganz, möglicherweise nicht ganz klar geworden, aber wenn
- 36:13man sagt, ja OKH 2 Datenbank nette Sache, ist ja ne Datenbank
- 36:17so die Tests laufen, wieso sollte es denn jetzt zum
- 36:20Beispiel nicht laufen, also wieso laufen die auf der H 2
- 36:22Datenbank aber zum Beispiel auf deiner Produktivdatenbank nicht
- 36:25und warum löst es das Problem, dass du wirklich die 1 zu 1
- 36:28Datenbank nimmst? Also genau, und das ist auch der
- 36:31Grund, warum wir am Ende zu dem Problem gekommen sind und
- 36:35umgestiegen sind, weil spätestens wenn ich bei
- 36:39Migration in den flyway skripten, ja, also ich kann halt
- 36:42gewisse Features nutzen, Datentypen auch zum Beispiel
- 36:47nutzen, die Postgress unterstützt ja die, die auch die
- 36:51Welt einfacher macht auf Datenbankebene aber die h 2 zum
- 36:55Beispiel nicht oder umgedreht umgedreht ist halt noch.
- 36:57Noch wilder, weil wenn denn die h 2 sagt, ja klar kann ich
- 37:02machen kein Thema und deine Produktivdatenbank aber sagt
- 37:05kenn ich nicht, kann ich nicht verarbeiten, kann ich nicht
- 37:07serialisieren was auch immer das ist halt n richtiger worst case,
- 37:11weil dann steht das ganze ja und so kam halt einfach das eine zum
- 37:17anderen, dass man sich dachte wir divergieren so stark.
- 37:21Dass es nervt, ja, dass ich mir nicht mehr sicher sein kann und
- 37:24nicht mehr die Überzeugung von meiner Testumgebung hab, dass
- 37:27sie wirklich mir gewährleistet, dass alles gut ist am Ende und
- 37:30alles läuft und dann hat man jetzt ne Library wie
- 37:34Testcontainers die sagt Ey ich integriere das komplett in deine
- 37:37Test Suite muss gar nichts machen, du konfigurierst mich
- 37:40was erstmal ne gute Sache ist, weil es total in Richtung
- 37:43Infrastructure is code geht. Ne, weil es ist ne versionierte
- 37:46Beschreibung deiner Infrastruktur in der
- 37:49Testumgebung, die reproduzierbar für alle ist was super ist und
- 37:55am Ende laufen die Tests genauso klar.
- 37:57Du hast so n paar Einschränkungen im Sinne von
- 38:01Laufzeit, zum Beispiel weil ich glaub das kann sich jeder denken
- 38:06einfach was in Memory laufen zu lassen und hochzufahren geht
- 38:09super schnell hier an der Stelle müssen Container.
- 38:13Erzeugt und hochgefahren werden. Sie müssen abgeräumt werden.
- 38:16Man hat natürlich ne gewisse Zugriffszeit da drauf, das heißt
- 38:20der Test an sich wird n bisschen langsamer und die Test Suite zu
- 38:25starten, das heißt diesen ganzen Aufbau zu machen dauert
- 38:28natürlich wesentlich länger, ja. Ja, je nachdem wieviel man da
- 38:32hochfährt. Also ich sag mal, wenn es jetzt
- 38:34einfach nur n Testcontainer mit einer Datenbank ist, dann ist
- 38:38das voll überschaubar und völlig in Ordnung.
- 38:40Ja weil da sind die Benefits und die Vorteile einfach riesig im
- 38:43Vergleich zu dem erhöhten Zeitanteil, den man dadurch hat.
- 38:47Ja, richtig. Also das Ding ist.
- 38:50Es ist ja wie gesagt auch nicht unbedingt notwendig, dass man
- 38:53sagt, Ey, du willst jetzt irgendwie deine Software, deine
- 38:56Anwendung abtesten. Nimm auf gar keinen Fall eine h
- 39:002. Ja, die Frage ist ja immer nur,
- 39:03also es ist ja, es ist logisch zu sagen, du kannst es natürlich
- 39:06erstmal mit h 2 machen, es geht schnell, du kommst erstmal
- 39:09schnell ins Doing, das ist alles in Ordnung, alles gut, du hast
- 39:12erstmal testsie Daten, du hast wahrscheinlich noch nicht einmal
- 39:14eine Migration machen müssen deiner Daten, aber wenn du
- 39:20irgendwann mal eine Datenbank gehostet hast, wo du Daten drin
- 39:22hast, wo du zum Beispiel die Migration machen musst.
- 39:25Dann willst du ja zum Beispiel auch wissen, funktioniert das,
- 39:27weil es gibt tatsächlich eine Sache, die ich irgendwie, ich
- 39:32weiß gar nicht, ob es so schlimm ist, aber ich finde es
- 39:34persönlich schon recht schlimm, wenn du ne Datenbankmigration
- 39:37machst, die fehlschlägt, weil dann kannst du nicht einfach mal
- 39:40soeben ohne Probleme sagen, OK, ich mach ich, ich fix das mal
- 39:45eben, sondern da, da hängt schon n bisschen was dran und wenn du
- 39:49dann aber ne deswegen am Anfang ist es OK das zu machen, du hast
- 39:52noch eigentlich nicht unbedingt ne Daten.
- 39:54Bankmigration du hast vielleicht nutzt vielleicht noch nicht mal
- 39:58flyway zu dem Zeitpunkt ne, dann ist es völlig in Ordnung, aber
- 40:01wenn du irgendwann an n Punkt kommst wo du dir denkst, ja ich
- 40:04weiß nicht, ich glaube ich brauch ne Migration und
- 40:07vielleicht zumindest zu dem Zeitpunkt wo das erste Mal die
- 40:09Migration failed, ja. Die aber wahrscheinlich noch
- 40:13relativ früh ist. Und es ist noch nicht so
- 40:14schlimm. Du kannst deine Datenbank locker
- 40:15noch mal komplett abräumen und neu aufsetzen, alles gut, ja, da
- 40:19sind noch nicht so wichtige Daten drin, aber zumindest an
- 40:22dem Zeitpunkt sollte man sich halt überlegen, na das
- 40:24funktioniert nicht mehr ganz so mit der H 2 Datenbank und dann
- 40:27kann man umsteigen und dann kann man zum Beispiel eben
- 40:30Testcontainer nutzen. Also das ist auf jeden Fall so.
- 40:34Ne, weil man sich ja vielleicht jetzt hinstellen sagt.
- 40:36OK, ich mach das jetzt sofort so, muss nicht sein, aber das
- 40:39wäre so n Anzeichen, weil man sagt es wäre jetzt vielleicht
- 40:42hilfreich und sinnvoll darauf. Umzusteigen?
- 40:45Ja, im Prinzip war es ja genauso der Werdegang bei unserem
- 40:48Projekt jetzt, was wir als Beispiel nehmen, ne, dass wir
- 40:51gesagt haben, OK, wir nehmen in Memory für Tests einfach erstmal
- 40:54Test schreiben gut funktioniert, dann lief die Datenbank
- 40:58produktiv und das ganze Backend ist produktiv gegangen so h hier
- 41:02bei den Daten. Lass das noch mal die ganze
- 41:05Struktur umbauen. Ne.
- 41:08Ja OK, ist ja eh noch nichts drin, so kannst du abräumen
- 41:12machst du neu, lösch da halt die Daten, Lösch dir die Datenbank
- 41:15tut nicht weh am Anfang aber du kommst zu einem Punkt wenn es
- 41:18halt ne Weile produktiv lief, also wirklich produktiv ist dann
- 41:22am Ende sag ich mal, dass du genau das nicht mehr da darfst
- 41:25und nicht machen möchtest. Und dann denkst du dir so, hm,
- 41:28jetzt brauchen wir Migration. Na gut, da haben wir Flyway mit
- 41:30reingenommen. Ja jetzt weichen wir irgendwie
- 41:33schon ziemlich ab von der H 2 Datenbank zu unserer echten
- 41:36Postquest testcontainers ja, und genauso entwickeln sich Projekte
- 41:41und das sagen wir ja auch immer wieder ne.
- 41:45Auch hier greift irgendwie so das globale Jagni You Ain't Go
- 41:49Need it nicht. Also mal klar kann man sagen,
- 41:52wir machen im Projekt was wird es, das wird ne MVP gut, alles
- 41:56klar, wir brauchen folgendes wir müssen das machen hier und da
- 41:58und dann müsste unsere Infrastruktur aussehen, die
- 42:00Pipeline wird das und das machen können, also machst du ja nicht
- 42:04sowas iteriert sich sowas entwickelt sich weiter und so
- 42:07finde ich kann man halt immer gerade an dieser Motivation die
- 42:11wir jetzt gegeben haben gut erkennen wann?
- 42:13Wird sowas notwendig? Warum macht man das irgendwann?
- 42:17Sind halt super wichtige Punkte und ich find halt Migration was
- 42:20du meintest geht mir genauso, ich find es n absoluter Pain
- 42:25große Migration zu machen wenn die Failen nervt ist n ungutes
- 42:30Gefühl wird man auch n bisschen unruhig, geht vielleicht anderen
- 42:33Leuten anders, aber mich macht das auch unruhig bin ich ehrlich
- 42:37klar du hast jetzt sag ich mal, je nachdem in welcher
- 42:41infrastrukturlandschaft du unterwegs bist, ne gibt es
- 42:44natürlich Möglichkeiten Sachen zurückzusetzen und so weiter
- 42:48alles cool, aber trotzdem kommt doch erstmal dieser Moment wo du
- 42:51denkst verdammt noch mal, warum hat diese Migration nicht
- 42:55geklappt, warum die Oh Gott nein was ist oh nein oh nein, das
- 42:59kann ich so nicht machen oh nein weißt du nervt ne ganz klar bin
- 43:02ich ganz bei dir. Ja, also ich weiß ja, dass du
- 43:06dann auch im Normalfall kannst du nicht einfach sagen, ich,
- 43:09ich, ich verändere einfach diesen Migrationsstep, weil er,
- 43:12weil dieser eine Migrationsstep, der dazu geführt hat, dass es
- 43:15failed ja schon in der Migrationshistory drin ist, ne,
- 43:18also du müsstest halt, du musst halt, also du hast halt
- 43:21Möglichkeiten, die hast du das zu fixen, aber es ist halt
- 43:25deutlich anstrengender und nerviger als zu sagen.
- 43:29Oh, warte mal, diese Funktionalität da ist n Bug
- 43:31drin, warte ich schreib n Test dazu.
- 43:33Der Test ist tatsächlich rot, ich fix ich fix die
- 43:35Implementierung Test grün alle Tests grün und los ne neuer
- 43:40Commit alles in Ordnung das das das ist noch das ist irgendwie
- 43:44finde ich noch einfacher aber wenn du wirklich merkst oh warte
- 43:47mal die Datenbasis funktioniert nicht mehr so wie sie soll zum
- 43:51Beispiel also entweder das entweder migrations Skript
- 43:54schlägt Fail dann hast du zumindest.
- 43:58N Punkt auf der Pipeline wo du dir sagst im Optimalfall OK, das
- 44:01hat nicht funktioniert, wir müssen was tun.
- 44:03Ja im besten Fall irgendwo auf auf einer anderen Instanz bevor
- 44:07es auf Prod geht, damit du das schon mal sowieso schon abfängst
- 44:10OK, aber wenn du irgendwas hoch auf Tools wie flyway ne aber
- 44:16wenn du aber wenn du wirklich mal sowas hast wo du sagst es
- 44:19funktioniert sogar, es geht durch Flyway funktioniert alles
- 44:22gut aber du machst was kaputt womit du gerade nicht rechnest.
- 44:27Und du kannst es nicht ab, hast es vielleicht nicht abgetestet,
- 44:29weil du deine flyray Migration vorher nicht abgetestet hast.
- 44:32Nicht so richtig, und deine automatisierten Tests sozusagen
- 44:35nicht anhand von dieser Basis deiner Migration sozusagen das
- 44:39testen würde. Und dann hast du irgendwelche
- 44:43fehlerhaften Verknüpfungen, constraints, was auch immer in
- 44:46deiner Datenbank, das ist scheiße, das ist wirklich ne
- 44:48Sache, die will man nicht haben und deswegen ist das halt
- 44:52wirklich wichtig. Und natürlich steht jetzt diese
- 44:53Datenbank, die wir hier sehr stark in den Fokus rücken.
- 44:56Für Testcontainer stellvertretend für externe
- 45:00Services, die du mit Test testcontainers halt eben Host.
- 45:04Also nutzt absolut absolut. Also das betrifft natürlich
- 45:07nicht nur Datenbanken, es passt halt nur rein, weil wir es ja
- 45:10erst über die letzten Wochen quasi diesen Weg wieder gegangen
- 45:14sind und wieder festgestellt haben, wie sowas sich
- 45:17weiterentwickeln kann. Dann noch der Wunsch kam dieser
- 45:19Folge, deswegen ist es natürlich jetzt immer als Beispiel die
- 45:22Datenbank, aber du hast natürlich recht, wie eingangs
- 45:25erwähnt. Das betrifft alle Abhängigkeiten
- 45:29nach außen. Ja, alles was das hört.
- 45:31Party ist auch zum Beispiel lästig, Search, hat man erwähnt,
- 45:33kann man damit auch ja nutzen sozusagen oder irgendwelche APIS
- 45:39und ich finde diesen riesen Vorteil, die müssen wir auch
- 45:41noch mal ganz klar sagen, warum das ganze ja gut kann ich ein 2
- 45:45Tests mehr schreiben, ja. Sollte man erstmal also
- 45:51Integration. Tests sind super wichtig, aber
- 45:54der Vorteil liegt ja nicht mal darin jetzt dass ich Integration
- 45:58Tests schreiben kann, konnte ich vorher auch, hatten wir auch die
- 46:02Tests und das ist ja der Witz jetzt an der Stelle oder sag ich
- 46:05mal das coole, die Tests haben sich ja nicht geändert, die
- 46:09gehen bloß nicht gegen ne in Memory Datenbank sondern einfach
- 46:12gegen ne echte und sind weiterhin grün gelaufen aber.
- 46:16Die sind dadurch viel realistischer geworden, weil es
- 46:22ne echte Datenbank dahinter ist. Es ist keine Simulation mehr, es
- 46:25ist auch keine Fake Datenbank. Jetzt ist natürlich die Frage,
- 46:28wo bin ich in meiner Software wo ich teste ne Stichwort Unit Test
- 46:32noch mal wenn ich den Service teste dann kann ich auch n Fake
- 46:34Repository dahinter haben, ist auch sehr angenehm und sollte
- 46:37man auch machen, ist auch ne gute Practice zu sagen ich hab
- 46:40ne. Ne ne, da also ne Repository
- 46:43stellvertretend für meine Datenbank.
- 46:45Ja und hab ne echte Implementierung und ne Fake
- 46:48Implementierung, dann nehm ich natürlich die Fake
- 46:50Implementierung wenn ich auf Unit testebene wie wir vorhin
- 46:53meinten zum Beispiel n Service da drüber geschaltet abtesten
- 46:56möchte komplett richtig ja aber wenn ich irgendwann auf
- 46:59spätestens Integration Ebene bin möchte ich ja testen ob es
- 47:04wirklich in die Datenbank reingeht richtig ob ich genau
- 47:07diese Daten auch wieder richtig auslesen kann und dann.
- 47:11Muss ich sagen, realistischer geht es dann halt einfach nicht,
- 47:13außer natürlich auf der echt live laufenden, aber das wollen
- 47:16wir nicht, da haben wir gesagt, da ist die rote Linie, ja ich
- 47:20mein das Beste ist halt genau dafür zu sorgen und das sollte
- 47:23halt auch das Ziel sein zu sagen.
- 47:25Wie kann ich denn mein meine ganzen, ich sag mal meine ganze
- 47:30Testumgebung so gestalten, dass sie halt eben wirklich möglichst
- 47:34identisch oder zumindest annähernd an die protte Umgebung
- 47:37rankommt? Ne, dass man halt wirklich das.
- 47:39Das Verhalten halt eben auch hat, weil je weiter dein
- 47:42Verhalten von der echten Instanz, auf der dein, dein
- 47:46Service, deine Anwendung auch noch mal läuft, abweicht, desto
- 47:50mehr kann natürlich auch irgendwas schiefgehen, womit man
- 47:52auch gar nicht rechnet und was man dann natürlich auch deutlich
- 47:55schwieriger wieder, ich sag mal greifen kann, wenn du in in die
- 48:00Fehlersuche gehst, ne? Ja, absolut.
- 48:06Den Punkt, den du vorhin meintest mit jeder Mitarbeiter
- 48:10muss ja, also vergiss vielleicht was auszuführen und so weiter
- 48:13oder hat denn vielleicht die Container nicht, ist natürlich
- 48:15der andere große Vorteil an der Stelle, um das noch mal klar auf
- 48:19den Punkt zu bringen, ich hab halt keine lokalen
- 48:22Installationen die notwendig sind und ich hab ne
- 48:24reproduzierbare Umgebung, es ist einfach Infrastructure is code
- 48:27an der Stelle. Und jeder Entwickler hat im
- 48:30Endeffekt die gleiche Umgebung, wenn er die Tests laufen lässt
- 48:33und nach den Tests ist das alles auch wieder sauber abgeräumt.
- 48:37Es ist halt vollautomatisiert es einfach.
- 48:40Ja es ist halt super angenehm es einfach zu verwenden.
- 48:43Ja gut, jetzt kann man sagen eine lokale Installation muss es
- 48:48geben, ich muss natürlich irgendwie dockercontainer laufen
- 48:50lassen können auf mein System wenn ich es lokal laufen lassen
- 48:52möchte ja OK fairness muss man sagen.
- 48:56Docker ist Voraussetzung, weil Testcontainer einfach auf Docker
- 48:59aufsetzt und damit die Container erzeugt.
- 49:01Ja, jetzt ist natürlich die Frage, auf welchem System, also
- 49:06auf einem Dev System, wo entwickelt wird, wo noch nicht
- 49:09Docker drauf ist. Wird man wahrscheinlich nicht so
- 49:11viele finden, deswegen denke ich kann man damit leben.
- 49:14Ja richtig, das ist auf jeden Fall, aber ich sag mal so,
- 49:18angenommen du hast den, also die.
- 49:22Die Beschränkung ja und wirklich sagst wo du, wo du wirklich
- 49:25sagst. Ja es darf kein Docker verwendet
- 49:28werden, dann ist es natürlich definitiv ne Sache wo man sagt
- 49:30gut dann ist Testcontainer definitiv nicht nicht geeignet.
- 49:33Ne das muss man halt dazu sagen, angenommen du hast diese
- 49:35Situation. Genau.
- 49:38Es ist halt einfach die Bedingung, ja, also die
- 49:41Voraussetzung muss halt gegeben sein.
- 49:45Ja, wie stehst du zu dem Thema, sie sind langsamer, ich hatte ja
- 49:49gesagt, das kann man gerne in Kauf nehmen.
- 49:51Es ist natürlich einfach die Frage, wieviel Systeme fahr ich
- 49:55hoch, wie viele muss ich wirklich hochfahren.
- 49:57Man muss halt wie gesagt differenzieren, brauche ich
- 50:00diese diesen Grad des Realismus oder kann ich halt sag ich mal
- 50:07es doch gut abtesten mit Fakes, mogs oder auch irgendwelche in
- 50:11Memory Lösung aber. Also aus meiner Sicht sind doch
- 50:16die Benefits größer als jetzt diese Dockercontainer da
- 50:19hochzufahren. Ich mein, Ihr habt euch ja
- 50:21damals auch aktiv dafür entschieden.
- 50:23Ja, die Frage ist natürlich immer, also es gibt ja zum
- 50:26Beispiel Testpyramide, wo man sagt, du hast sehr viele
- 50:28unitests, du hast weniger Integration Test als Unitests
- 50:31und du hast noch weniger System Test als Integration,
- 50:33Integration ey, was hab ich denn heute Integration?
- 50:36Integration klingt supergeil. Es tut mir leid.
- 50:41Und das ist natürlich auch jetzt nicht unbedingt aus der Luft
- 50:43gegriffen. Das ist natürlich nicht
- 50:45verkehrt, wirklich zu sagen, dadurch, dass sie halt eben
- 50:47langsamer sind, ist es natürlich sinnvoller, mehr Unit Tests zu
- 50:51haben, aber da muss man natürlich auch wieder sagen,
- 50:54einfach nur mehr Unit Tests zu haben um der Unit Test willen
- 50:58bringt auch nichts ne wichtig ist oder dass das der Kernpunkt
- 51:02an dieser Stelle es ist. Es muss wichtig sein oder
- 51:06möglich sein, dass man möglichst schnell.
- 51:09Fehler erkennt. Das heißt, wenn du sag ich jetzt
- 51:11mal n bestimmtes Verhalten mit einem Unit Test abfangen kannst
- 51:15oder abtesten kannst wofür du keinen Integration Test
- 51:19brauchst, dann mach das so, dann dann hilft dir halt das geht ja
- 51:22nicht genau dann hilft dir der Integration Test nicht genauso
- 51:24mit e to e tests ne System test e to e Test nennst wie du
- 51:28möchtest. Du brauchst jetzt zum Beispiel
- 51:30nicht alle Unit Tests noch mal mit.
- 51:32Integration, Tests, Abzutesten und noch mal mit E to e Tests
- 51:36bringt dir gar nichts, sondern wirklich an der Stelle zu sagen,
- 51:40du hast jetzt zum Beispiel die Logik, die wird Abgetestet über
- 51:42Unit Test. Super Sache, aber funktioniert
- 51:44denn auch wirklich die Connection zu einer Datenbank?
- 51:46Werden denn richtig die entsprechenden Entities in deine
- 51:50Datenbank reingeschrieben? Ja gut, dafür brauchst du halt
- 51:53deine Integration Tests und wenn du dann aber zum Beispiel sagst
- 51:56gut, ich brauche gar nicht so viele in Unit Tests und
- 52:00Integration Tests. Dass du wirklich ne Pyramide
- 52:03hast, sondern vielleicht ne in Quadrat, dann ist es so die
- 52:08wichtigste Regel oder die wichtigste Metrik an der Stelle
- 52:11ist, wie stark kann man sich darauf verlassen und das ganze
- 52:13kann ja auch n bisschen wachsen und es kommt halt auch Erfahrung
- 52:17mit hinzu, ne weil irgendwann kommst du halt an einem Punkt wo
- 52:21du dir vielleicht erst, also am Anfang denkst du dir vielleicht
- 52:23ja, was mach ich denn jetzt weiß ich nicht, sollt ich das lieber
- 52:25so machen oder so. Mach es einfach erstmal und dann
- 52:28lernst du daraus und dann guckst du und kriegst die Erfahrung, wo
- 52:32du beim nächsten Mal sagen kannst.
- 52:33Dafür brauch ich aber gar keinen Integration Test.
- 52:36Dafür kann ich n Unit Test nehmen oder andersrum.
- 52:38Wie auch immer ne, aber man muss sich jetzt nicht unbedingt auf
- 52:41ne Testpyramide festhalten, aber sie ist auch nicht aus der Luft
- 52:44gegriffen so das mein ich. Das stimmt, das stimmt absolut.
- 52:50Ich finde, dass das Verhältnis. Was also, welche Art, welche
- 52:56Tests ist auch alles projektabhängig und genauso ist
- 53:00es auch projektabhängig ob testcontainer Sinn machen oder
- 53:03nicht. Ne, jetzt war unser Beispiel
- 53:04Backend mit einer Datenbank war in dem Fall sinnvoll, wenn jetzt
- 53:10natürlich ne sehr kleine Datenbank ist oder kaum
- 53:13Migration stattfinden obwohl das auch immer so ne Sache ist weiß
- 53:17ich nicht, früher oder später kommt man sicherlich an den
- 53:20Punkt wo man sagt wir müssen mal n bisschen was ändern an der
- 53:22Datenbank. Aber sei mal dahingestellt.
- 53:24Es gibt natürlich auch ganz andere Fälle, ne, also wenn ich
- 53:27jetzt zum Beispiel n Projekt hab, was auf Microservices
- 53:30aufsetzt, also ne, dass man sagt, OK, unsere Architektur von
- 53:34dem gesamten Produkt ist jetzt Microservices und ich bau mir so
- 53:38ne Landschaft auf, dann ist das auch n super Fall, weil dann
- 53:41will ich ja einen Service abtesten wie er mit anderen
- 53:44Services arbeitet ne und wie der sich integriert in diese
- 53:48Landschaft und dann kommen wir auch an den Punkt wo das echt
- 53:50Sinn machen kann ne oder? Was ich auch mal gesehen hatte
- 53:55ist auch ne coole Sache zu sagen, ey ich fahr einfach in
- 53:58einem Container zum Beispiel nen Chrome oder Firefox hoch und
- 54:03mach so Millenniumtests beispielsweise ne ist ja auch ne
- 54:07Möglichkeit, dass ich halt wirklich sage ich habe jetzt n
- 54:09Browser sozusagen. Also ich habe so richtig n
- 54:12Container wo darin das läuft ja gibt es halt unterschiedlichste
- 54:17Möglichkeiten ne. Und ich denke, wir haben da auch
- 54:20jetzt genug genannt, um sich da das ganze Mal so vorstellen zu
- 54:23können. Aber ich finde, egal wo man es
- 54:26verwendet, es gibt halt so n paar Best Practices oder
- 54:30Erfahrung die man mitgeben kann und das würde ich gerne jetzt am
- 54:34Abschluss noch machen, das ist halt so mal n ganz nettes Take
- 54:38Home Ding so ne. Also wir haben jetzt zum
- 54:41Beispiel gesagt so fixe Ports einstellen für so n Container
- 54:45wie der erreichbar ist. Besser nicht, ne, weil
- 54:48Testcontainers bringt ja schon ne Automatismus mit zu sagen ich
- 54:51suche mir n freien Port und ich gebe den auch wieder frei wenn
- 54:54die Tests durch sind. Ich kann ja für jede
- 54:58Testumgebung das ganze hochfahren, ich kann das ja auch
- 55:01parallel betreiben, das geht ja alles theoretisch ne umso
- 55:04dynamischer muss ich ja meine Config am Ende machen ne klar
- 55:08wenn ich jetzt sage sag ich mal ich hab eine Testsuite.
- 55:11Fahr ich das einmal hoch? Alle Tests laufen durch, Fahr
- 55:14das runter fertig, aber wie du ja meintest, sowas kann ja auch
- 55:18gesplittet werden oder nur n Teil läuft wie auch immer wenn
- 55:21ich so in so n parallelen Betrieb komme ist es natürlich
- 55:23umso wichtiger das dynamisch in der Conflict zu halten und das
- 55:27ist halt zum Beispiel so n Punkt.
- 55:29Dass man da drauf achten sollte auch, dass der Host nicht
- 55:32unbedingt Hard gecoded ist oder die URL, das kann sich selbst
- 55:37zusammensetzen, also nutzt man das auch.
- 55:39Ne, das klingt so wie das ist Free Lunch.
- 55:41Also ich würd es halt auch einfach nutzen.
- 55:43An der Stelle ist immer noch was anderes, wenn ich nicht
- 55:45beispielsweise jeden Port nutzen kann, ja weil du ja auch
- 55:49meintest, vielleicht kann man ja doch gar gar nicht verwenden,
- 55:51soll vorkommen, soll auch vorkommen, dass nur gewisse
- 55:54Ports möglich sind, dann ist natürlich ne andere Sache, aber
- 55:57die CONFIG ist möglich. Und eine Sache tappt man gerne
- 56:01rein. Das würde ich gerne auch
- 56:02mitnehmen. Du grinst schon so, wenn ich das
- 56:07Image nehme, also wie gesagt, es ist ja wirklich simpel, ich sag
- 56:10einfach bau mir mal n Container auf mit einem postgress Image
- 56:14und Version sowieso kann ich bei sowas ja auch zum Beispiel
- 56:18Latest angeben. Ja gib mir doch einfach die
- 56:20letzte Version. Ja.
- 56:22Ja, klingt ja erstmal gut, immer schön State of the Art sein.
- 56:26Welches Problem haben wir aber dann an der Stelle?
- 56:28Und da tappt man wirklich gerne mal rein.
- 56:31Na ja, mit latest. Also du hast halt auch andere
- 56:34Abhängigkeiten, ne mit Latest. Also das kann halt sein, dass
- 56:37irgendeine Abhängigkeit in deiner Latest Version von denen,
- 56:40also ich sag mal, du hast ja irgendwie n Container und n
- 56:43Container besteht aus Abhängigkeiten und Latest ist
- 56:46wahrscheinlich die aktuellste Abhängigkeit, was aber am Ende
- 56:50bedeutet. Dass du vielleicht irgendwie ne
- 56:52falsche Note Version hast, möglicherweise die vielleicht
- 56:55gar nicht mehr passt für das was du willst.
- 56:57Oder zum Beispiel, wenn wir jetzt bei Datenbanken waren,
- 56:59dass du zum Beispiel ne postgress Datenbank hast, die
- 57:02halt jetzt auf einmal ne andere Version hat als deine Datenbank,
- 57:05die du tatsächlich produktiv nutzt, ne?
- 57:07Und das ist halt n riesen Painpoint, der dann echt zu also
- 57:10wirklich zuschlägt, früher oder später.
- 57:12Was man nicht so auf dem Schirm hat, weil ich sage in dem Punkt
- 57:16sag ich ja. Ich möchte jetzt so realistisch
- 57:19wie möglich an meine echte Produktivdatenbank rankommen und
- 57:23gleichzeitig sagt meine Infrastruktur, die hart, die
- 57:26jetzt codiert ist, ja, aber früher oder später werde ich
- 57:31weglaufen, so nach dem Motto Ne und dann kann es wieder sein,
- 57:34dass gewisse Sachen nicht mehr unterstützt sind.
- 57:36Neu dazu gekommen sind, umgeändert sind, was du gerade
- 57:39meintest und das ist halt n absolutes Learning zu sagen ne
- 57:44Version auch mal. Festpinnen also wirklich sagen,
- 57:47nimm diese Version, was nicht heißt, dass man so ne Version
- 57:51nicht mal hochziehen sollte, aber das muss ja bewusst
- 57:54passieren und nicht auf der einen Seite ja, auf der anderen
- 57:57Seite nicht. Deswegen ist das auf jeden Fall
- 57:59so n Ding worauf man achten sollte, meiner Meinung nach
- 58:02deiner Meinung nach, falls es da andere Ansichten gibt, sagt uns
- 58:07gerne Bescheid, wir lieben es über sowas zu reden und vor
- 58:10allen Dingen auch Sachen zu lernen, ne DW genau.
- 58:15Dann würd ich sagen, haben wir das Thema eigentlich ziemlich
- 58:18ausführlich besprochen. Ich würd sagen, du kannst den
- 58:20Sack noch zu machen, gib uns mal noch so ne letzte Weisheit mit.
- 58:25Ja, ne letzte Weisheit. Ich sag mal so überall dort ja
- 58:32wo ich sag mal du Abhängigkeiten im Code hast.
- 58:37Also du irgendwelche Integrationen halt eben hast.
- 58:40Ne also zum Beispiel dein Code muss.
- 58:43Hat ne Abhängigkeit zu einer Datenbank oder zu einem anderen
- 58:46Service. Wie auch immer, dann kannst du
- 58:50halt testcontainers nehmen um halt genau dieses Problem zu
- 58:53lösen, wie zum Beispiel mit den Datenbanken, was wir halt eben
- 58:55gerade schon ausführlich besprochen haben hier wie
- 58:57gesagt, stellvertretend für externe Services, man kennt es,
- 59:03haben viele gehabt und haben teilweise immer noch diese
- 59:06Probleme und. Du kannst halt schaffen, dass du
- 59:11Integration Tests laufen lassen kannst mit echter Infrastruktur,
- 59:14also nicht mit gemokkten Sachen, sondern mit echter
- 59:17Infrastruktur, wie ich eingehends auch meinte.
- 59:19Es klappt natürlich nicht immer, wenn du kein Docker Image
- 59:22hochfahren kannst. Von einer Anwendung von einem
- 59:25Service über das das wovon es kein Image gibt, was du nicht
- 59:30nutzen kannst, dann funktioniert es natürlich nicht, dann versuch
- 59:32halt möglichst nah da ranzukommen, aber ich sag mal
- 59:36so, überall wo es geht sollte man das dann auch am Ende
- 59:38nutzen. Um halt eben die bestmögliche,
- 59:42ja Testumgebung, Infrastruktur halt eben auch zu haben.
- 59:46Genau und genau dafür steht testcontainers ne, das ist halt
- 59:50wirklich n Problem was es immer schon irgendwie gab und dafür
- 59:54ist es auf jeden Fall ne ganz coole Lösung, da bleibt uns
- 59:57eigentlich nur noch eine Frage offen und zwar an dich liebe
- 1:00:00Zuhörer, liebe Zuhörer. Wie machst du denn das Ganze?
- 1:00:04Testest du eher mit einer in Memory Datenbank oder sagst du
- 1:00:07nee ich versuche auch nah an den echten Service ranzukommen oder
- 1:00:10nutzt zum Beispiel auch Testcontainers.
- 1:00:13Lass es uns gerne wissen und vor allem schreib uns auch welche
- 1:00:18Lösung du da so anstrebst und umgesetzt hast.
- 1:00:21Was dir Mehrwert gegeben hat, wir lieben den Austausch, kommen
- 1:00:24auch gerne auf unseren Discord vorbei, Diskutier mit uns da es
- 1:00:28ist eine mega coole entspannte Runde da am Link wie immer in
- 1:00:30den Shownotes. Ansonsten ja, wenn dir der
- 1:00:35Podcast gefällt, auch hier noch mal die Anmerkung.
- 1:00:38Lass gerne ne Bewertung da, falls du es noch nicht getan
- 1:00:40hast, empfiehl Ihnen weiter Leute die sich denken, Ach das
- 1:00:44wär eigentlich auch n guter Podcast für mich, die müssen
- 1:00:47davon natürlich erfahren und in Shownotes findest du auch n
- 1:00:51spendenlink wenn du Lust hast uns zu unterstützen, dann vielen
- 1:00:54vielen Dank und ansonsten hören wir uns alle nächste Woche
- 1:00:57wieder, habt ne gute Zeit bis dahin ciao ciao.
- 1:01:01Deine Coding Buddies gemeinsam besser Fabi, lass uns noch kurz
- 1:01:09auf dein Problem vom Anfang zurückkommen.
- 1:01:12Nimm einfach einen Lappen.