Transkript: Tests

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

Ja, hallo und herzlich willkommen zum Python-Podcast in der 24.

Dominik

Episode.

Dominik

Heute geht es mal zum Test und wir haben wieder einen Gast, der Ronny ist da.

Hi, hi.

Ronny, hallo.

Dominik

Und der Jochen natürlich auch.

Jochen

Ja, ja.

Jochen

Ich bin auch da.

Dominik

Ja, schön, dass ihr alle wieder eingeschaltet habt.

Dominik

Und Ronny, erzähl doch mal.

Dominik

Möchte ich euch einmal kurz vorstellen?

Ronny

Ja, ich heiße Ronny Vedriglia, ich arbeite in Köln bei Amin Innovation.

Ronny

Bin da jetzt seit einem Jahr ganz offiziell Tech-Evangelist für Django.

Ronny

Hab jetzt meine acht Jahre, die ich da bin, als auch großteils mit Backend-Arbeiten und Django verbracht.

Ronny

Hab in Köln Wirtschaftsinformatik studiert, also eigentlich eher so einen Beraterstudiengang, aber ich hatte immer mehr Spaß eigentlich am entwickelnden Beraten, beziehungsweise Beratung mit Entwicklung zusammen.

Dominik

Kann ich ja gar nicht erstehen.

Ronny

Und genau.

Ronny

Hab dann, wie haben wir uns eigentlich kennengelernt?

Ronny

Du warst PayColog oder Düsseldorfer?

Dominik

Ja, und du hast dann dieses Meetup ausgerichtet, das Django Meetup in Köln.

Hatten wir uns nicht vorher schon?

Dominik

Wir haben uns auf irgendeinem der Paikolons mal gesehen.

Jochen

Paikologon bestimmt, da haben wir es bestimmt schon mal gesehen.

Ronny

Genau, und wie Dominik gerade schon gesagt hat, seit glaube ich im knappen Jahr richten wir bei uns im Büro bei Ambient das Django Meetup Köln aus.

Ronny

Und genau, da sind die beiden auch immer regelmäßige Gäste.

Dominik

Falls ihr das Live kennenlernen wollt.

Jochen

Bis Corona all das verunmöglicht hatte, sozusagen.

Jochen

Also, na gut, es gibt halt das virtuelle Meetup und ja, genau, das ist natürlich.

Dominik

Ich fand es auch mal schön, die Leute live zu sehen.

Dominik

Apropos Live-Sen, wir haben heute tatsächlich eine Testfolge, die einen Test macht.

Dominik

Und zwar sind wir zum ersten Mal nicht im Wintergarten, sondern diesmal draußen und sitzen in einem Restaurantgarten.

Jochen

Wir waren auch schon mal woanders, aber wir waren noch nie draußen.

Dominik

Ja, genau.

Dominik

Und das ist jetzt quasi das erste Mal live vor Ort draußen.

Dominik

Also entschuldigt, so ein bisschen die Hintergrundgeräusche, so ein bisschen urbanes Leben.

Dominik

Ja, schreibt da gerne mal Feedback zu, ob ihr es wollt.

Jochen

Klingt das ganz schrecklich furchtbar oder kann man mit halbwegs leben?

Ich meine, das ist natürlich angenehm.

Jochen

Also gerade wenn es warm ist, irgendwie eher draußen zu sitzen und irgendwie ein bisschen was kühleres zu trinken, das ist natürlich schon sehr viel angenehmer als jetzt.

Dankeschön.

Naja, hört sich sofahren.

Dominik

Der sind zu voll.

Jochen

Ja, aber eben wenn man in so einem kleinen Raum setzt.

Jochen

Also das ist ja immer das Problem mit der Akustik.

Jochen

Man braucht entweder einen kleinen Raum, in dem viel Zeug ist, damit es halt nicht so HALT, weil HALL ist immer so der Feind von guter Akustik.

Jochen

Oder halt Weite.

Jochen

Hier haben wir jetzt Weite und wir haben leider sogar ein bisschen Wind.

Jochen

Vielleicht hört man ihn auch.

Jochen

Ja, auf jeden Fall, genau.

Jochen

Also wenn ein großer Raum, also so draußen, ist eigentlich auch nicht schlecht für die Akustik, aber Wind ist natürlich schon mal wieder nicht so toll.

Jochen

Aber ja, ich bin mal gespannt, wie das funktioniert.

Jochen

Und wir haben ja auch ein Mobilis-Equipment, dass wir neben auf ohne irgendwie Laptop oder Computer einfach so mit so einem portablen Aufnahmegerät und den üblichen Headsets und da mal schauen,

wie das so kommt.

Dominik

Ja, aber du kannst gerne nochmal ein bisschen über die Gerätschaften erzählen.

Dominik

Du machst ja schon ein letztes Mal irgendwie.

Jochen

Naja, das ist jetzt einfach so ein Zoom H6, das ist halt so ein Field-Recorder, das hast du das beworben.

Jochen

Es hat halt auch so XLR-Eingänge für Mikrofone, macht Phantomspeisungen und dann halt ist da noch so ein Kopfhörerverstärker dran, wo dann halt die Ausgänge, die alle das gleiche Line-Out-Signal von dem H6 kriegen, nochmal dranhängen, damit man sich auch selber und die anderen hören kann.

Jochen

Und genau, also was wirklich eine tolle Kombination ist, ist halt sozusagen die Standard-Podcaster-Konfiguration zurzeit, glaube ich, so, die am meisten Audioqualität bietet für Geld, ist halt so ein Zoom H6 plus irgendwie diese HMC660X oder C, keine Ahnung, Headsets, weil man kann an dem Zoom H6 nämlich auch 12 Volt Phantomspeisung einstellen.

Dominik

Ja, muss das nicht werden.

Jochen

Man braucht keine, muss nicht löten und braucht keinen Adapter oder so.

Jochen

Und die Dinger funktionieren einfach an dem Ding direkt.

Jochen

Was halt bei den meisten professionellen Audio-Interfaces nicht geht.

Jochen

Ja, mal schauen, wie das so wird.

Dominik

Ja, ich bin gespannt auf die Folge und wie sich das hinterher anhört.

Dominik

Also gerade mit der Hintergrundakustik.

Dominik

Also man hört ja manchmal den Windrauschen, das Lachen der Gäste, die leise Musik.

Dominik

Ronny, Tests heute.

Ja.

Jochen

Oder wollen wir zuerst irgendwie, gibt es irgendwelche News und die

Dominik

Pass überlegt?

Dominik

Ja, so Dango 3.1 kam ja raus, ich weiß nicht, jetzt ist tatsächlich final.

Dominik

Und Wagtail wurde auch schon auf Dangrote 1 gearbeitet.

Das habe ich auch noch mitbekommen.

Jochen

Ja, es gibt eine neue Wagtail-Version, wobei die da war nicht so weltbewegendes dabei.

Dominik

Doch, es geht jetzt mit Dangota 1.

Jochen

Achso, ja, okay, gut.

Dominik

Ich habe da recht tatsächlich umgestellt.

Dominik

Du hast einen tollen Artikel geschrieben, irgendwie auch.

Jochen

Ja, das war, ich meine, das ist halt irgendwie so mehrere Probleme mit einer Klappe fliegen erledigen, halt sozusagen, weil ich die Geld verstanden habe.

Dominik

Ja, wir schreiben auch noch gerade

Jochen

so einen Artikel, deswegen habe ich den zuerst irgendwie zur Release von Django 3.1 halt sozusagen veröffentlicht und davor haben wir halt diese Assung-Folge gemacht, die halt.

Dominik

Hast du Django News, Ronnie?

Dominik

Ja.

Dominik

Ja, der war ja, weil der erste Artikel war von ihm.

Ich hab's auch gesehen.

Ronny

Ich war ja schon intern vorher mitbekommen, dass du einen Artikel geschrieben hast.

Ronny

Nicht schlecht.

Jochen

Ja, was mich, also tatsächlich hat es.

Dominik

Jochen wird gerade von einer Wespe bearbeitet, die kriegt gerade über sein Brenglas.

Dominik

Jochen mag Insekten sehr gerne, wie ich schon mitbekommen durfte.

Dominik

Aber er bleibt relativ entspannt.

Jochen

Also ehrlich gesagt, die Insekten mögen mich mehr als sie, finde ich.

Jochen

Das ist etwas beunruhigend.

Jochen

Na gut.

Dominik

Es gab doch diesen Song.

Dominik

I don't like the insects, but the insects like me.

Jochen

Ja, genau.

Jochen

Aber genau, was ich daran eigentlich ganz gut fand, ich weiß jetzt nicht, der Artikel, naja, ich habe irgendwann auch einfach gedacht, ich habe keinen Bock mehr, weil das ist so machen, jetzt reicht's.

Jochen

Aber er hat relativ viel Aufmerksamkeit, also mehr Aufmerksamkeit gekriegt, als ich gedacht hätte.

Jochen

Und ich glaube, das lag halt daran, dass einfach auch viel Arbeit drin steckt, fürchte ich.

Dominik

Ich wollte gerade sagen, das ist ein bisschen so.

Dominik

Also ich habe ja irgendjemand so angefangen damit erstmal, ne?

Dominik

Jochen, der so um die Ohren gehauen, ist unglaublich.

Dominik

Er meinte ja so, nee, das geht gar nicht.

Dominik

Und hat dann irgendwie 15 oder 16 Seiten dran gehängt, wie man es richtig macht.

Dominik

Okay, danke, Jochen.

Jochen

Ja, aber ich wollte das eigentlich alles gar nicht.

Jochen

Aber na gut, also manchmal braucht man halt auch jemanden, da braucht man irgendwie so einen Anstoß, um das dann zu machen und den Handwänden damit.

Jochen

Und ja gut, jetzt ist es draußen und gut.

Jochen

Also insofern, ja, also viel Arbeit in irgendwas stecken hilft.

Jochen

Ja, wenn das irgendjemand weiterhilft, keine Ahnung.

Jochen

Ja, genau.

Jochen

Ach, es gab noch eine neue Release-Kandidat für Python 3.9.

Jochen

Ah ja.

Jochen

Den ersten.

Jochen

Gibt es jetzt.

Jochen

Also, und Leute, die das verwenden, haben schon gesagt, ach, es funktioniert eigentlich alles ganz fluffig.

Dominik

Was ist denn den neueren von 3.9 haben wir die nicht?

Jochen

Ich hab's.

Jochen

Und ich kann es jetzt auch nicht nachbauen.

Dominik

Die haben jetzt ja kein Rechner in der Nähe.

Wir können es nicht an.

Jochen

Wir können das nicht einfach, weil so online recherchieren geht halt gerade eben nicht.

Jochen

Aber ansonsten hat, weiß nicht, sonst irgendwelche Neuigkeiten.

Jochen

Nee, ne?

Dominik

Ist dir was eingefallen?

Ronny

Nein, außer Django 3.1.

Ronny

Was ich es auch schon nutze, funktioniert gut.

Ronny

Jason fängt

Dominik

zum Zoom, wir hält noch was ein und zwar ist von Daniel Royal Feetroy das Buch Two Scoops of Django in der Version 3, hat er gestern Abend seinen Twitch-Kanalbuch gefahren, weil es jetzt offiziell release worden ist.

Jochen

Ah, okay.

Jochen

Ich hatte es schon gekauft, aber immer die Updates nur gesehen, nur die dann nie, weil ich dachte, ach, ich warte auf die fertige Release.

Jochen

Wenn ich jetzt weiß, dass es Release ist, super, dann hole ich mir mal die Komponenten.

Dominik

Ganz genau, das war gestern Abend.

Jochen

Ah, sehr schön.

Jochen

Ja, nö, ansonsten, genau, können wir dann vielleicht direkt mit dem echten Thema einstellen.

Dominik

Ja, wollen wir vielleicht einen kurzen Überblick geben?

Dominik

Also ich glaube, wir reden einfach los, wie immer, über Tests und so ein bisschen mehr Tests und Tests und Tests und Tests, mehr Tests, also der Test funktioniert mit den Tests.

Dominik

Mögt ihr Tests?

Dominik

Jochen.

Jochen

Ja, also ich habe lange Zeit, ich hab wie früher die Leute, die so anfingen mit TDD oder so.

Jochen

Das hat dann irgendwie, als ich noch keine Tests geschrieben habe, oder noch nicht so viele, da habe ich so ein bisschen über diese Leute mal gelächelt und dachte ich so, ah ja, die mit ihrem komischen statischen Dingstarjava und so und Testschreibenhöhe.

Jochen

Das mache ich alles einfach mal so eben außerhalb.

Jochen

Und mein Kohle

Dominik

so perfekt, den braucht man gar nichts mehr.

Ronny

Man kann keine Fehler machen, so einfach ist

das, ne?

Jochen

Genau.

Jochen

Das ist alles kein Problem.

Jochen

Und dann irgendwann dachte ich so, okay, ich bin vielleicht einfach nicht so der Typ für längere Programme.

Jochen

Ich schreibe gern so kurze Sachen, die so auf eine Bildschirmseite gehen oder vielleicht ein bisschen länger sind, aber habe das nie so reflektiert, woran das eigentlich liegt.

Jochen

Und dann, als ich irgendwann angefangen habe, Tests zu schreiben, weil das halt in irgendeinem Projekt dann erforderlich wurde, merkte ich so, oh, ach, ich kann ja vielleicht doch längere Programme schreiben.

Jochen

Mit Tests geht das plötzlich.

Jochen

Das ist halt, wenn man, wenn man, man kann halt sich quasi ausruhen.

Jochen

Entweder man hält halt den kompletten State im Kopf und weiß dann halt, dass man wahrscheinlich keine Fehler gemacht haben wird, weil man das halt weiß, wie jeder einzelne Teil funktioniert und miteinander interagiert, oder wenn man das halt nicht mehr wissen kann, weil es einfach zu viel wird, dann braucht man halt Tests, ansonsten passieren schreckliche Dinge.

Jochen

Das ist halt einfach so.

Ronny

Oder halt auch für Refactoring.

Ronny

Das ist halt auch immer ein Riesenargument für Tests.

Dominik

Okay.

Dominik

Magst du Tests, Sonny?

Ronny

Ja, ich muss gestehen, wenn ich unter Zeitdruck viel entwickeln muss, dann ärgere ich mich manchmal nachher, dass da noch so viele Tests übrig bleiben, die man schreiben muss.

Ronny

Aber generell finde ich es eine super Sache und wie gesagt, allein schon wegen Refactoring.

Ronny

Ich arbeite an mehreren Django-Projekten, die jetzt schon Jahre laufen und ich weiß, wie mühsam das früher war, als wir noch keine Tests da drin hatten und wie unmöglich es war, irgendwelche Sachen anzufassen, ohne dass man nachher Stunden am besten tagelang.

Ronny

Genau, vor allem dann so zerbrechliche Sachen wie man hat dann zum Beispiel irgendwie eine Überstundenerfassung oder sowas gebaut und da dann irgendwie alle Sonderfälle irgendwie zu bedenken und durchzutesten manuell zu Fuß.

Ronny

Vor allem, wenn du noch so späße hast wie mit Daten und da musst du immer noch quasi in, also ohne dass man irgendwie jetzt in einer Testumgebung ist, wo man das Datum einfach mocken kann.

Ronny

So in manuellen Testen das Datum dann irgendwie und dann so lustige Sachen wie Wochenenden und Feiertage.

Ronny

Dafür bin ich schon sehr, sehr froh, dass es Unitests gibt und dass die so gut funktionieren.

Dominik

Ja, ja, ich muss sagen, also ich mag Tests eigentlich gar nicht, aber sind in gewisser Weise fand ich ja notwendig.

Dominik

Aber ich habe jetzt mitbekommen, ich bin jetzt noch nicht so lange dabei, dass es eine große philosophische Debatte gibt zwischen Menschen, die gerade haben mich viel Testabdeckung, also Coverage nennt man das ja, haben am liebsten 150% des Codes sollen getestet werden.

Dominik

Und andere Leute sagen, ja, ist eigentlich völlig egal, einfach Integrationstest, ob überhaupt so die Permissions so sind, wie ich mich das vorstelle.

Dominik

Und dann, wenn halt was schwierig schlägt, dann schreibt man danach dafür einen Test, dass es nicht nochmal passiert.

Dominik

Irgendwie so dazwischen ist so der Wahrheit.

Dominik

Ich weiß nicht, ob es sowas gibt wie so manches Mal.

Ronny

Aber ich glaube auch, also ich meine, es gibt ja dieses berühmte Pareto-Prinzip, 80-20-Regel und ich glaube, wenn man versucht, 100% der Sachen abzudecken, ich glaube, es gibt einfach Dinge, da ist einfach der Overhead so viel größer, dafür irgendwie Tests zu bauen, dass man da, glaube ich, auch einfach riskieren kann, dass gewisse Dinge vielleicht auch einfach mal in die Hose gehen dürfen.

Also vor allem,

es wird doch so starr, ne?

Dominik

Also wenn du halt ganz, ganz, ganz viel testest, dann kannst du eigentlich ja nichts mehr ändern, ohne dass irgendein Test viel schlägt.

Dominik

Ich meine, du merkst ganz zwar, was dann viel geschlagen ist vielleicht, aber das macht einen doch sehr unbeweglich.

Dominik

Und du hast halt tatsächlich auch, wenn du refactoren willst, wie du eben sagtest, Ronny, das Problem, dass du ganz, ganz viele Sachen und die Teste anfassen musst.

Dominik

Weil vielleicht auch die Tests dann gefactort werden müssen dann.

Jochen

Ja, also ich würde auch denken, es kommt halt auf den Anwendungsfall an, als wenn du halt irgendwie eine kleine Webseite hast, die irgendwas, keine Ahnung, für dich und ein paar Freunde irgendwie macht, dann braucht man vielleicht keine Tests, weil wenn irgendwas schief geht, dann fix man das halt und es hat ja keinen gestört, dass es irgendwie schiefgegangen ist.

Ronny

Steuerprogramm vom AKW bräuchte vielleicht ein paar mehr Tests.

Jochen

Genau.

Jochen

Da würde man sich dann vielleicht freuen, wenn die bemerken, dass etwas schiefläuft, bevor es irgendwie die ganze Region mit in den Abgrund reißt.

Jochen

Aber genau, und da braucht man halt vielleicht viele und gute Tests.

Jochen

Und ja, also ich meine, nur ein paar Integrationstests zu haben, ist ja auch schon mal auf jeden Fall besser, als keine Tests zu haben.

Jochen

Auch die fangen natürlich dann schon Sachen.

Jochen

Auf der anderen Seite, ja, es ist schwierig.

Jochen

Das mit den Metriken ist immer so eine Sache.

Jochen

Ich meine, es ist auf jeden Fall immer auch besser, irgendwas zu messen, als nichts zu messen und dass man irgendwas hat, worauf man optimieren kann.

Jochen

Aber gerade wenn man jetzt so schlechte Tests schreibt, dann kriegt man mit denen oft eine gute Testabdeckung hin beim Code.

Jochen

Weil man dicke Integrationstests, die ganz viel Code aufrufen und aber eigentlich sind die halt eher nicht so toll, weil die sind halt langsam und dann, die sind auch schwer zu ändern, wenn man dann Code ändert.

Jochen

Und was heißt das eigentlich 100% Test Coverage?

Jochen

Ich meine, die Brand Coverage ist ja auch nochmal vielleicht so eine Geschichte, das geht jetzt übrigens mit der neuesten, der Version 5 von Coverage geht das auch, dass man halt dem sagen kann, sag mir doch mal, wie viele von den IF-Verzweigungen, also es reicht nicht, dass das einmal drüber gelaufen ist, sondern auch, ob die tatsächlich beide Pfade genommen haben, ob der Test, ob irgendein Test getestet hat, ob beide Pfade genommen werden und so.

Jochen

Und dann sieht es halt schon anders aus.

Jochen

Und ich weiß, dass es Leute gibt, die dann sowas sagen wie, naja, das geht auch mit Cavali das auch, dass man sagt, man kann auch zu jedem Pfeil angeben, welches andere File für die Abdeckung verantwortlich sein soll.

Jochen

Also wenn man jetzt zum Beispiel im Django Projekt Models PY-File hat, dann sagt man, okay, da soll die Abdeckung gewährleistet werden von Test-Models PY.

Jochen

Und die Abdeckung, die daher kommt, dass das aus irgendwelchen anderen Integrationstests heraus auch aufgerufen wird, das zählt nicht.

Jochen

Weil ansonsten kannst du halt mit fetten Integrationstests deine Coverage hochbringen.

Jochen

Aber eigentlich ist das überhaupt nicht das, was du haben willst, sondern was du eigentlich haben willst, ist, dass du sicher sein kannst, wenn du jetzt was änderst, dass du tatsächlich nichts damit kaputt gemacht hast.

Jochen

Und das kriegst du gerade bei diesen dicken Tests ja gar nicht so richtig mit.

Jochen

Also außer du hast was wirklich Kabierendes kaputt gemacht.

Ja.

Ja.

Dominik

Ja, okay, wir sind durch mit Tests.

Jochen

Nee, nee.

Jochen

Ja, keine Ahnung, aber wie ist das denn praktisch?

Jochen

Wann habt ihr denn mit Testen angefangen?

Jochen

Ich glaube, ihr seid ja ja irgendwie, ihr macht ja bei euch ganz viel Django schon lange.

Ronny

Genau.

Jochen

Und habt ihr von Anfang an Tests verwendet?

Ronny

Tatsächlich nein.

Ronny

Ich meine, die Sinnhaftigkeit von Tests war uns natürlich schon klar, aber dadurch, dass wir halt im Agenturgeschäft sind, also sprich, da kommen Kunden und beauftragen dann irgendwas oder wir beraten Kunden, wie wir dann halt eine Software bauen, haben früher auch sehr viel Richtung Businesslösungen, also wie man irgendein speziellen Business Case halt digitalisieren kann.

Ronny

Das ist auch wegen dem Wirtschaftsinformatik-Hintergrund, wird das halt ein ganz, ganz gutes Match.

Ronny

Und haben halt dann früher am Ende gesagt, okay, Tests schreiben, dauert Zeit.

Ronny

Ja, also das ist schon einige Jahre her, aber es war halt, so, ich meine, quasi die Idee ist genau das Gegenteil von TDD.

Ronny

Also sprich, du schreibst das bei deinem Code und danach schreibst du die Tests und es ist ja quasi ein Mehrwert für den Kunden, weil die Software dann besser funktioniert und haben dann halt sehr idealistisch versucht, dem Kunden das zu verkaufen.

Ronny

Und selbst bei technisch affineren Kunden war dann halt relativ schnell immer die Aussage, naja, es soll ja funktionieren und wenn es kaputt geht, ohne Tests, dann müsstest du es ja trotzdem ganz machen und sparen wir Geld, weil wir die Tests nicht bezahlen.

Ronny

Und das war dann bei uns so ein gewisses Learning, bis wir dann einfach.

Dominik

Ich würde das ja den Kunden lernen lassen.

Dominik

Wenn der Kunde irgendwie auf die Nase fällt und du kannst ihm das vorher erzählt und er bezahlt es halt nicht.

Dominik

Dann fällt es halt auf die Nase, ja.

Dominik

Also man steht halt ein bisschen blöd da, ne?

Dominik

Das ist schon richtig.

Dominik

Aber also viele, die ich so mitbekommen habe, an kleineren Kunden vor allen Dingen, die dann sagt, naja, jetzt können wir es nicht leisten, Test machen wir jetzt nicht.

Dominik

Die kamen dann irgendwann rollmütig zurück, ja, wir haben jetzt so eine Software gebaut und es wurde kein Test geschrieben, es funktioniert alles nicht mehr.

Dominik

Wir haben irgendwas, vielleicht haben die selber irgendwas angepasst, ja, da konnte irgendjemand von den Menschen aus der Firma so ein bisschen Django und hat dann irgendwas umgebaut und irgendwas kaputt gemacht oder irgendwas anderes, was ihm erst später aufgefallen ist.

Ei, ei, ei.

Ronny

Ich muss sagen, also dafür, dass wir erst, also dass wir die ersten Jahre, als wir noch ganz klein waren, tatsächlich keine Tests geschrieben haben, haben die Sachen trotzdem überraschend gut funktioniert.

Ronny

Also es wundert mich rückblickend auch.

Dominik

Ihr seid also gut.

Ronny

Aber es ist echt überraschend.

Ronny

Also wenn ich heutzutage, wo ich das mit den Tests weiß, dann werde ich so schnell nervös, wenn ich für irgendwas Kritisches keinen Test schreibe.

Ronny

Naja, auf jeden Fall, wir haben dann halt irgendwann einfach gesagt, komm, das ist einfach Teil der Programmierarbeit, das steht nicht zur Debatte.

Ronny

Und ja, seitdem machen wir das und ja, ich glaube, der.

Dominik

Ihr habt ja richtig so eine Struktur da drin.

Ronny

Also wir haben jetzt keinen Coding-Guide in der Firma.

Ronny

Also ich meine, jeder kann es im Endeffekt machen, wie er möchte.

Ronny

Ich meine, natürlich haben wir halt diese typischen QA-Schritte wie Code Review, Content Review und sowas.

Ronny

Das ist natürlich ganz klar, dass wenn dann jemand irgendwie der Meinung ist, dass irgendwie Tests so und so geschrieben gehören und dass irgendeine wichtige Funktion nicht hinreichend getestet ist, dann kriegt man natürlich den Ball nochmal zurück.

Ronny

Aber im Endeffekt gibt es da jetzt keine offizielle Guideline oder sowas.

Ronny

Weil ich meine, wie es bei Python so schön heißt, we're all adults hier, ja.

Ronny

Also jeder weiß ja, was er macht und die Akzeptanz ist auch da.

Ronny

Also das finde ich halt bei uns auch ganz cool, dass unsere, die Geschäftsführer sind halt auch Wirtschaftsinformatiker, also auch Techniker.

Ronny

Das heißt, wir haben bei uns nie das Problem, was man halt sonst, zum Beispiel meinen Studentenjobs oder so, was ich öfters mal hatte, dass dann halt da ein Technikfremder halt sagt, das muss irgendwie ganz schnell funktionieren und dann wird halt lange gefrickelt und gewurschtelt und es kommt nie der Punkt, wo man mal das nötige Refactoring macht, weil Nicht-Techniker dann manchmal halt nicht den Mehrwert sehen.

Ronny

Also dass man dann auch einfach unterm Strich halt sehr viel Geld sparen kann, wenn Code einfach maintained ist und vielleicht dann auch getestet.

Dominik

Wir verkaufen das in internen mittlerweile als Security-relevant.

Dominik

Also wenn es keine Tests gibt, dann ist er ganz viel Sicherheiten da, muss er sicherstellen, dass das nicht mehr so ist.

Jochen

Also, ja, ich bin mir nicht sicher, ob es da nicht inzwischen, also wirklich, ich glaube, wir hatten das Thema auch schon mal in der Projektmanagement-Episode, aber ob es da nicht tatsächlich ein echter Interessenskonflikt ist, weil es kann sein, dass ich aus einer Wirtschaftssicht vielleicht tatsächlich sage, okay, für die Qualität bin ich nicht bereit zu bezahlen, weil ich hätte gern lieber mehr Geschwindigkeit.

Dominik

Die Musik hat sich übrigens gerade eben geändert, ich hoffe, ihr hört das nicht an.

Dominik

Es war eben so schön entspannt und jetzt haben sie ein bisschen mehr Beats reingebracht.

Jochen

Ja, ich treffe das ja so ein bisschen durch die Nacken.

Jochen

Ja, also es kann ja sein, dass ich aus einer wirtschaftlichen Sicht sage, das, was die mir an Qualität liefern, das ist mir ehrlich gesagt zu hoch.

Jochen

Ich hätte gern lieber weniger Qualität und dafür schneller.

Jochen

Und das hat den zusätzlichen Vorteil, dass wenn es dann schief geht, dann kann ich zu ihnen hingehen und mit ihnen schimpfen und sagen, hier so, das hat nicht richtig funktioniert, jetzt macht man noch schneller.

Jochen

Voll gut.

Jochen

Ja, ich muss ja nur ein bisschen besser sein als meine Konkurrenz und ein bisschen weniger zahlen für die Produktivität, die ich da irgendwie rausquetsche.

Jochen

Und dann schon läuft es bei mir besser als bei anderen.

Dominik

Ja, aber dann wäre das Problem auf der Entwicklerseite, weil dann kein Entwickler dürfte sich darauf einlassen, weil das ist nicht.

Jochen

Ja, ich glaube, Leute tun das dann trotzdem und geraten dadurch auch in blöde Situationen.

Jochen

Und das ist mir auch schon selber passiert.

Jochen

Und man muss eigentlich als Entwickler und dann halt vielleicht auch als Agentur, die das dann komplett anbietet, eigentlich sagen, okay, nee, das ist das, was ich an Qualität.

Jochen

Also sozusagen, das ist eigentlich meine einzige Verantwortung, ist zu sagen, ich übe meine Profession kompetent aus und wie ich das mache, ist eigentlich meine Sache.

Jochen

Und ja, du kannst halt das nehmen oder nicht, aber ich werde keine Einschnitte bei der Qualität machen, weil hinterher bin ich eh der Blöde.

Jochen

Wenn es schief geht, bin ich der Blöde.

Jochen

Und ich bin sowieso der Blöde, weil.

Jochen

Weil ich irgendwie damit sozusagen auch mich selbst sabotiere.

Jochen

Ich meine, man wird dann ja auch schlechter, wenn man irgendwie, man lernt das dann ja, dass man halt rumschlammt und so.

Jochen

Und das ist eigentlich alles, das will man einfach alles gar nicht, sondern man möchte eigentlich mit weniger Zeit mehr hinbekommen.

Dominik

Man lernt rumzuschlampen, das finde ich auch nicht so schön.

Dominik

Und Tests lösen das.

Ronny

Ja, ich meine, die Frage ist halt auch, was man für einen Anspruch hat oder was der Lebenszyklus der Software ist.

Ronny

Also als wir noch ganz klein waren, da haben wir dann öfters mal so ein Marketing-One-Pager gemacht, keine Ahnung, also so Kaugummi-Werbung und sowas.

Ronny

Das ist so ein Ding, da ist ein Gewinnspiel drin, das läuft genau für einen Monat und danach wird das Ding eingestampft und das braucht kein Mensch mehr.

Ja, gut, klar.

Ronny

Das sollte natürlich trotzdem funktionieren.

Dominik

Das merkt man ja beim Angucken schon fast, ne?

Dominik

Also wenn man einfach Lugalhust aufmacht.

Ronny

Aber wenn man halt sagt, so, hey, das ist irgendwie jetzt vielleicht was, was Firmen strategisch relevant ist, da kommetet sich die Firma auch ein bisschen drauf, dass jetzt vielleicht auch über Jahre, dass sie da halt irgendwie investiert hat und das muss gut laufen.

Ronny

Ja, also ich meine, bei den Projekten, die wir jetzt lange betreuen und die wir damals auch ohne Test angefangen haben, ziehen wir die jetzt auch einfach nach.

Ronny

Weil ich meine, das ist halt einfach sinnvoll.

Ronny

Und man kann inzwischen.

Dominik

Man macht das dann auf eigene Kosten oder sagt dann der Kunde, ja, okay, das ist jetzt hier in unserem Supportaufwand.

Ronny

Wir machen das eigentlich so, dass wir jetzt halt sagen, die Tests sind ein elementarer Teil der Programmierung.

Ronny

Also das ist halt so, als ob man sagt.

Dominik

10 Minuten aus einer Stunde nur für Tests oder so.

Ronny

Ja, ich würde sagen, wie gesagt, also ich bin jetzt auch keiner, der sagt, cover it 100%, weil wie gesagt, ich glaube einfach 80-20-Regel, ich glaube in 80% der Zeit, also 80% des Notwendigen kriegt man 20% der Zeit hin.

Ronny

Und keine Ahnung, wenn ich irgendwelche Django-Views oder sowas habe, die mehr oder weniger einfach getestete Django-Funktionalität ausführen, ich schreibe ich keinen Test dafür.

Ronny

Wenn ich irgendwelche Permissions drin habe, an denen ich selber rumgebastelt habe, okay, das ist was anderes, ja, weil das kann echt mal schnell in die Hose gehen.

Ronny

Aber so Standardfunktionalität teste ich jetzt auch nicht unbedingt.

Ronny

Also umso mehr es Richtung Zahlen und Details und Services geht, also weiter weg von dem Django-Standard.

Dominik

Also was uns übrigens interessant für unsere Hörer, wir reden gerade die ganze Zeit noch von Django, ja.

Dominik

Also Testing kann man ja auch außerhalb von Django Test.

Dominik

Das stimmt.

Dominik

Aber wir machen halt einfach viel Django, deswegen reden wir jetzt erstmal weiter über Django-Tests.

Ronny

Aber ich meine, die meisten Sachen sind ja universal.

Ronny

Also ist ja jetzt nichts Django-spezifisches.

Ronny

Also selbst bei Flask gibt es Views.

Jochen

Ja, und eigentlich hat man bei jedem Projekt, also es sei denn, man macht halt irgendwas, was halt tatsächlich nicht so einen wichtigen Anwendungsfall hat, aber eigentlich hat man immer Tests mit dabei.

Jochen

Und auch bei Django ist genau das, was man halt sonst verwendet, irgendwie üblich, nämlich entweder das eingebaute Unitests-Modul aus der Stande-Bibliothek oder halt eben PyTest, wobei ich sagen würde, wenn ich mich so umgucke bei den Projekten, in denen ich irgendwie beteiligt bin, ist die Mehrheit inzwischen auf Py-Test.

Jochen

Und Unitest fühlt sich so ein bisschen an, als das sind immer so die etwas älteren Sachen und die etwas nicht so ganz gut abgepflegten.

Jochen

Und ich meine, natürlich hat das irgendeinen gewissen Charme, dass es für eine.

Dominik

Erklär mir nochmal kurz, was denn überhaupt der Unterschied zwischen Unitest ist und was Pytest an Neu rumbringt.

Dominik

Und es gibt noch einen Nose-Test oder sowas.

Jochen

Ja, Nose war früher ein Testfraner.

Jochen

Ich glaube, das ist inzwischen gar nicht mehr wirklich maintained.

Dominik

Ich habe gehört, Johannes benutzt noch viel Nose.

Jochen

Ernsthaft?

Jochen

Okay.

Dominik

Vielleicht bist du ja auch Unitest, ich weiß es.

Dominik

Er möge mich schlagen, wenn er das hört.

Jochen

Ja, keine Ahnung.

Jochen

Also Nose kenne ich auch noch, aber das ist schon echt lange her.

Jochen

Also aus meiner Perspektive ist es, also Unitest ist irgendwie eine Portierung von J-Unit und hat halt viele der Konzepte dort mitgebracht, die ja auch jetzt vielleicht gar nicht so schlecht sind, aber das passt halt in vielen Fällen nicht so richtig auf das, wie man in Python normalerweise programmiert.

Dominik

Was heißt das denn?

Dominik

Also was macht Jaden Unit und warum ist das so anders als das?

Jochen

Ja, zum Beispiel einfach allein, dass die Methoden namen Camel Case sind, ist halt dann, dass du halt Assert-Methoden hast auf dem Test, dass jeder Test eine Klasse sein muss.

Jochen

Das ist halt, also ich meine.

Dominik

Wie testet man was?

Dominik

Also man macht eine Testklasse und da setzt man quasi die Umgebung auf und dann prüft man, ob bestimmte Bedingungen erfüllt sind und dann baut man alles wie das man da.

Ja, also wenn man jetzt zu, wie schreibt man Tests, kommt, also da ist es halt, nennt man so AAA, wie heißt das, Range,

wenn man es baut?

Jochen

Oder sowas und es hört oder weiß ich nicht.

Jochen

Also man arrangiert sozusagen die Dinge, die man halt die Welt sozusagen so hinten, dass man testen kann, dann ruft man halt die Funktion, die man testet auf.

Jochen

Oder halt was auch immer man da testen möchte und dann guckt man halt hinterher, ist jetzt alles in sozusagen gefälligerweise wieder drüber zerfallen und es ist so passiert, wie es hätte, wie es ist ja sozusagen Schornstein in die richtige Richtung, der Baum in die richtige Richtung umgefallen sozusagen nach dem Jahr.

Jochen

Und das macht man halt bei Unitest in der Klasse.

Dominik

Die Task-Test-Case, ich glaube, Django Test-Case ist auch, erbt auch von einem Unit-Test-Case, oder?

Jochen

Ja.

Jochen

Also es gibt bei Django vier Test Case-Klassen, aber ich glaube, die erben alle von Test Case, ja.

Jochen

Genau, bei PyTests ist es so, da können auch Tests einfach Funktionen sein.

Jochen

Und es ist halt nicht Camel-Case, sondern Snake-Case oder keine Ahnung, mit Anderscores halt.

Jochen

Und man verwendet halt nicht Methoden auf dem Test, um zu assorten, sondern man benutzt einfach das Assert-Statement.

Dominik

Das macht PyTest ja jetzt auch dann.

Jochen

Das macht PyTest.

Jochen

Unitest macht das nicht.

Dominik

Okay, also bei Unitest gehst mal diese Asset Equals, das hat mich immer so ein bisschen gewundert.

Jochen

Genau, genau.

Jochen

Super, super Beispiel, genau.

Jochen

Wisst ihr das, was die richtige Methode ist, Assert Equals oder Assert Equal?

Ronny

Ich glaube ohne S, oder?

Jochen

Ja, siehst du, weiß ich jetzt auch gar nicht.

Jochen

Eins von beiden ist richtig, das andere ist nicht gut.

Ronny

Python zeigt mir mal an, dass, glaube ich, das mit S, das ist immer durchgestrichen wegen Deprecation.

Jochen

Ja.

Dominik

Assert Equal.

Jochen

So, eins von beiden ist deprecated, genau.

Jochen

Ja, aber das ist halt so, das ist halt das Problem, das man bekommt, wenn man halt so Spezialkram macht.

Dominik

Ja, das versteht man auch nicht.

Dominik

Also warum kann man nicht einfach die Python implementierte Funktion Assert nehmen und dann die zwei Dinge direkt vergleichen, anstatt Assert-Equal hinzuschreiben und zwei Dinge, die sind die Funktionsaufrufe zu geben.

Dominik

Da passieren irgendwelche magischen Dinge im Hintergrund, wo ich gar nicht weiß, ob das so stimmt.

Jochen

Ja gut, wenn eben, wenn du sozusagen bestimmte Sachen mit einem gefälten Test machen willst oder so, dann kannst du das ja quasi nicht gar nicht so richtig gut anders machen, oder?

Jochen

Ich weiß nicht genau.

Jochen

Ich weiß es nicht.

Jochen

Vielleicht ist auch einfach nur Geschmacksgeschichte.

Ronny

Wie ist das denn mit zum Beispiel mit den anderen Assert, zum Beispiel Assert Races?

Ronny

Kannst du das auch über Assert-Statement abbilden bei PyTest?

Jochen

Ja, aber es kann sein, dass man jetzt Test.

Jochen

Nein, nein.

Jochen

Aber das kann sein, also das ist auch ein Kontextmanager, es ist irgendwie with irgendwas, Races, aber ich glaube, man importiert da irgendwas aus PyTest.

Ronny

Also Hintergrund ist ja einfach nur, dass eine Funktion Fehler werfen soll und man genau diesen Case testen möchte.

Jochen

Ja, also das gibt es auf jeden Fall.

Ronny

Ich muss gestehen, ich nutze auch das, was Django von Haus aus mitbringt.

Ronny

Ich habe einen Kollegen, der sehr auf PyTest schwört und meint, das ist ja alles viel besser und schneller.

Ronny

Ich habe das auch auf meiner Liste, dass ich mir das nochmal anschaue.

Ronny

Ja, es ist halt sehr convenient, wenn du halt in der Django eigenen Welt bleibst, dann muss man halt wenig nachdenken.

Dominik

Von Jochen, jetzt Py-Test irgendwie gelernt, in Afonso.

Dominik

Modus hast du immer viel und da gibt es halt diese Fixtures.

Dominik

Gibt es die auch so bei Müll-Tests ohne Py-Tests?

Dominik

Also ich dachte, das wäre so ein PyTest-Exfeature.

Ronny

Also in Django kannst du es laden.

Ronny

Also in Django gibt es in dieser Django-Test-Case-Klasse kannst du einfach ein Array mit Strings und diese Strings sucht er dann, der sucht dann nach Fixture JSON-Dateien.

Dominik

Okay, aber ich mache tatsächlich Fixture JSONs und ich muss halt dann dadurch meine Sachen bösen.

Ronny

Aber das ist jetzt nur Django, das ist nicht Unit-Test.

Ronny

Also ich weiß nicht, wie nur ein Test das machen würde.

Dominik

Also ich kenne das jetzt als Pi-Test, dass ich tatsächlich meine Fixture-Funktion baue in der Comptest und dann irgendwie meine Objekte schon so erzeuge, wie sie, glaube ich, im echten realen Django-Leben dann auch wären.

Dominik

Und das hat vielleicht auch viele Vorteile, weil ich halt genau auch die Attribute und so weiter alles zugreifen kann und ich dann halt Factories nutzen kann, um die zu erzeugen und halt eben nicht nur irgendwie Fictures.

Jochen

Also das macht man in Unitest auch.

Jochen

Also so Factory Boy oder Factories, um halt aber ja, aber diese Art, wie man in Pile-Test halt, dass man das quasi einfach magisch, dass man es halt in den Testaufruf mit reinschreibt, halt das, was man haben möchte, und ist es dann halt einfach da.

Jochen

Das ist auch so natürlich so ein bisschen magisch.

Jochen

Das gibt es in Unitest nicht.

Jochen

Dann muss man was explizit machen.

Dominik

Okay, aber das finde ich eigentlich relativ smart, weil das gefällt mir.

Dominik

Ich kann einfach meine Fixtures definieren pro App, die ich dann irgendwie entwickelt habe und dann kann ich die importieren in anderen Apps als Contest und habe dann alle Funktionalitäten, die ich da brauche.

Ronny

Ich löse das halt über Vererbung.

Ronny

Also ich habe halt dann einen Base-Test, der dann halt für mein Projekt halt irgendwie die Rollen, die User vielleicht irgendwie ein wichtiges Projekt oder irgendwas erstellt und dann halt pro App, dass ich dann halt, wenn ich das brauche, dann nochmal eine Ebene dazwischen ziehe und dass dann jeder von den richtigen Tests, also die Endtests, dass die halt dann von dieser Klasse erben und da ist dann das dementsprechende Setup im Setup drin.

Ronny

Das heißt, ich nutze diese Django Fixtures auch eher selten.

Jochen

Ja, ich genau, ich habe auch viel, also in Projekt mit Unitests, dass ich dann halt so viele Test-Mix-Ins importiere oder das habe ich halt früher immer gemacht, die dann halt bestimmte Funktionalität bieten.

Jochen

Und was ich jetzt aber inzwischen so mache, ist, ich erbe von Test-Case oder halt Transaction-Test-Case oder was auch immer, also einem der Grundtesttypen von Django und mixe die Sachen dann da schon mal rein und verwende dann nur noch meine eigenen Test Cases.

Jochen

Und sozusagen habe dann die ganzen Importe nicht mehr in den Tests stehen, sondern ich sage dann halt irgendwie, keine Ahnung, nimm halt den App-Test Case von irgendeiner App und da sind die ganzen Mix-Ins dann halt drin.

Jochen

Und genau, dann ist es halt deutlich weniger Schreibarbeit.

Dominik

Ja, das sieht auch hübscher aus, glaube ich.

Dominik

Also ich habe, glaube ich, eine Sache gemacht, ich weiß nicht, ob man diese macht.

Dominik

Ich habe dynamische Importe gemacht für Tests von den Factories, die ich dann halt haben wollte.

Dominik

In der Core-App, weil ich halt nicht genau weiß, wie viele Apps gibt es denn noch, um die Core App herum.

Dominik

Ich weiß nicht, ob das so eine gute Idee ist, aber es funktioniert bisher.

Jochen

Dynamische Importe klingt so ein bisschen.

Ja, naja.

Jochen

Ich meine, manchmal muss man auch Sachen ausprobieren, manchmal sind sie super.

Jochen

Manchmal stellt man irgendwann fest, war nicht so gut.

Jochen

Muss man sich wieder ändern, aber es ist halt, ja.

Jochen

Ja.

Was ja fast schon ein Stichwort wäre zum Sachen ausprobieren.

Ronny

Ich hatte vor einiger Zeit eine Django-Software gebaut, da ging es um Projektstundenerfassung und Zeiterfassung.

Ronny

Und alles, was irgendwie mit Daten, also Datums, also mit Zeit zu tun hat, ist ja schon relativ kompliziert.

Ronny

Und da ging es dann darum, dass halt eine Zeiterfassung abgebildet werden soll.

Ronny

Das Mitarbeiter können sich in- und auschecken und dann gibt es natürlich so Späße wie jemand ist krank, jemand ist im Urlaub, es gibt einen Feiertag, es gibt halbe Feiertage.

Ronny

Zum Beispiel Weihnachts- und Silvester, also Heiligabend Silvester sind halbe Feiertage.

Ronny

Das heißt, man hat, hier wird je nach Firma anders ausgelegt, aber in dem Fall war das, dass dann vier Stunden das normale Arbeitszeit wäre.

Ronny

Und die ganze Logik lief und war auch, hat auch gut funktioniert.

Ronny

Und da habe ich immer gemerkt, wenn ich irgendwas reflectern möchte, ich hatte jedes Mal die Hosen voll und habe mich halt wirklich nicht dran getraut, weil das halt einfach so unmöglich zu testen ist.

Ronny

Und hab dann halt erstmal angefangen, ganz normal zu Fuß-Tests zu schreiben.

Ronny

Also einfach zu schauen, ich setze den und den Case auf, also keine Ahnung, Mitarbeiter arbeitet, normal fünf Tage die Woche, also diese ganzen Datenbankobjekte erstellt.

Ronny

Hab gemerkt, da komme ich echt irgendwie nicht weit.

Ronny

Das sind so viele Fälle und auch immer diese ganzen Variationen.

Ronny

Was ist denn, wenn jemand zum Beispiel Teilzeit arbeitet und dann kommt ein Feiertag und dann vielleicht noch ein halber Feiertag und ja.

Dominik

Das ist ausgefallen, also die Vertretung und die Vertretung übernimmt dann aber noch anderthalb Tage, weil dann den halben Tag eine andere Vertretung da reinkommt.

Genau.

Ronny

Und dann habe ich angefangen, eine abstrakte Testklasse zu schreiben, die im Endeffekt alle Testmethoden implementiert.

Ronny

Und die quasi diese Berechnung, also diese Zeitenberechnung, habe ich im Endeffekt nochmal abgespeckt nachprogrammiert in dieser abstrakten Testklasse.

Ronny

Und diese abstrakte Klasse wird befüttert durch ein Dictionary von Objekten.

Ronny

Und diese Objekte, die sind zum Beispiel, der eine Mitarbeiter arbeitet ganz normal acht Stunden und macht so lange Pause.

Ronny

So, das ist ein Objekt, das da reingehen kann.

Ronny

Der andere ist zum Beispiel ein anderer Mitarbeiter, der ist nur halbtags da und der arbeitet diese, seine halbtags mehr seine vier Stunden arbeitet der auch voll.

Ronny

Oder es ist ein Wochenendtag.

Ronny

Und ich konnte dann, wenn ich dann einen aktuellen, also einen tatsächlichen Test schreiben möchte, leite ich davon ab.

Ronny

Da sind gar keine Testmethoden in dieser Kind-Klasse drin, sondern ich befülle nur dieses Dictionary, diese Klassenvariable und gebe da eine Liste von Objekten rein.

Ronny

Sag zum Beispiel, okay, ich weiß, der, keine Ahnung, 1.01.2017, 2017 habe ich es gemacht, darum, das war jetzt ein Sonntag.

Ronny

Das heißt, da gebe ich das Objekt rein, ist normaler Wochenendtag, da hat niemand gearbeitet.

Ronny

Am Montag kommt das Objekt rein, alle arbeiten normal und dann vielleicht die ganze Woche voll und dann schaue ich einfach, ob zu erwarten ist, dass niemand, also alle haben normal gearbeitet, dass es null Überstunden sind.

Ronny

Das macht dann aber wieder die abstrakte Klasse.

Ronny

Und das heißt, für jeden Testfall, den es gibt, also alle komischen Kombinationen, kann ich einfach diese Objekte befüllen.

Ronny

Und wenn ich jetzt einen neuen Testfall habe, muss ich entweder nur diese Liste neu zusammenstellen oder halt ein neues Objekt bauen, das halt die Sachen so einstellt, dass es funktioniert.

Ronny

War ziemlich abgefahren, ich habe doch ziemlich lange dafür gebraucht.

Ronny

Im Endeffekt war es ziemlich cool, weil jedes Mal, wenn ich einen Bug gefunden habe, konnte ich halt in drei Minuten, also literally drei Minuten, halt einfach diesen Fall nachstellen mit meinen ganzen Objekten und konnte sicherstellen, dass es beim nächsten Mal nicht mehr kaputt geht.

Ronny

Die größte Herausforderung dabei, und das ist auch so ein bisschen das große Fragezeichen dahinter, ist halt, wer kontrolliert den Kontrolleur?

Ronny

Weil ich habe den Code nochmal teilweise nachgebaut.

Ronny

Also ich habe ihn jetzt explizit nicht kopiert, sondern ich habe ihn neu geschrieben und auch ein bisschen abgespeckt.

Ronny

Aber was ist, wenn man jetzt einen Bug im Test Case hat?

Ronny

Und tatsächlich glaube ich, 80% der fehlgeschlagenen Tests lagen daran, dass ich dann in der Nachimplementierung einen Bug hatte.

Ronny

Ich glaube, ich hatte eine richtigen Implementierung, die ich damals noch vor vielen, vielen Jahren ohne Tests geschrieben habe, war tatsächlich auch kein Fehler mehr drin, weil es halt schon so lange lief und die alle ausgemerzt waren.

Ronny

Ich war mir sehr unsicher, ob das überhaupt eine gute Idee ist, das so zu machen, wegen der offensichtlichen Nachteile, die es halt gibt.

Ronny

Also dauert lang und wer kontrolliert das nachher oder wie kontrolliert man das?

Ronny

Und hab dann auf dem PyCologne Meetup, zufällig war da jemand, der mehr oder weniger in einer großen Firma genau sowas macht für sehr komplizierte Fälle.

Ronny

Ich glaube, das war ein medizinischer Bereich, wo es halt wirklich stimmen muss.

Ronny

Und der meinte, wenn es wirklich, wirklich kompliziert ist, dann geht es nicht anders.

Ronny

Also die meinte, es gibt sogar Software, die so kritisch ist, dass die einfach den Auftrag, das gleiche Pflichtenheft an zwei verschiedene Teams geben, die sich nicht kennen, lassen es beide programmieren und das eine ist halt das Testsystem vom anderen.

Ronny

Also es ist schon absurd.

Dominik

Das ist ja Mocken auf einem ganz hohen Niveau.

Jochen

Ja, das ist, ich meine, das ist ja auch immer die Frage, wie aufwendig ist es halt irgendwas zu ändern.

Jochen

Also wenn man jetzt, ich meine, die Prozessorhersteller machen das ja auch, dass sie halt irgendwie wahnsinnig viele Tests machen, dann Stresstests irgendwie für neue Designs von ihren Chips und so und versuchen das letzte bisschen, was überhaupt testbar ist, da rauszukitzeln.

Jochen

Einfach deswegen, weil wenn die Maschinen erstmal eingestellt sind und die Wafer irgendwie belichtet, dann ist es halt schlecht, wenn das irgendwie schief gegangen ist.

Jochen

Man kann man auch nicht mehr ändern, kann man halt hinterher nicht mehr fixen.

Jochen

Während, naja, Code kann man halt noch ändern.

Jochen

Das heißt, so furchtbar intensiv muss man es vielleicht auch nicht testen.

Jochen

Aber natürlich ist es halt immer noch blöd, wenn Sachen schief gehen.

Jochen

Daher, ja, irgendwo ist da ein Sweet Spot.

Jochen

Aber es ist halt nicht so ganz klar, wo.

Dominik

Testen ist alles schon ein bisschen dunkle Magie auch.

Dominik

Also ich hatte gemacht, ich habe einen Test geschrieben, dann habe ich die Tests ausgeführt.

Dominik

Dann war kein Problem mehr, alles richtig, dann habe ich es nochmal ausgeführt, einfach ohne irgendwas zu ändern, dann trug die Test fehl.

Dominik

Dann stand ich da natürlich, was ist denn das jetzt?

Dominik

Habe ich nochmal ausgeführt, dann ging es wieder, dann habe ich nochmal ausgeführt, dann ging es wieder, dann habe ich nochmal ausgeführt, dann schlug es wieder fehl.

Dominik

Ja, dann hat mir jemand erklärt, ich habe einen non-deterministischen Test geschrieben, also Test, der ein Ausgang ungewiss ist.

Dominik

Und ich habe überhaupt nicht verstanden, von welchen Zeiteffekten, von welchen Gegebenheiten das hätte kommen können.

Dominik

Das fand ich total schwierig zu begreifen.

Dominik

Warum der gleiche Test in mehrfacher Ausführung mal gecheckt, mal nicht.

Jochen

Ja, das Ganze gibt es dann natürlich auch irgendwie in sozusagen Reihenfolgenabhängigkeiten.

Jochen

Das ist wahrscheinlich somit das Häufigste, dass man quasi zwei Tests hatte und ohne dass man das jetzt beim Schreiben vielleicht so gedacht hätte, aber man macht es halt einfach so, weil das dann halt logisch hinterher passiert oder so.

Jochen

Man macht zuerst das, dann testet man das nächste und verändert aber den State jetzt bei dem Django-Modell irgendwie so, dass der zweite Test halt funktioniert.

Jochen

Und wenn man jetzt die Tests in umgekehrter Reihenfolge ausführt, dann funktioniert das nicht mehr.

Jochen

Und das ist halt auch so ein Ding.

Jochen

Man muss halt eigentlich sicherstellen, dass die ganzen Tests isoliert funktionieren, weil Anton.

Ronny

Da gibt es ein sehr schönes Beispiel, das auch ganz brandaktuell zu Django 3.1.

Ronny

Die haben da jetzt nämlich einen Bug gefixt, der schon, glaube ich, seit 2012 drin war, mit dem Order By beim Aggregate.

Ronny

Ich weiß nicht, ob euch das mal über den Weg gelaufen ist.

Ronny

Ist mir am Anfang, als ich neu mit Django war, immer wieder mal passiert.

Ronny

Ich bin mir nicht mehr so hundertprozentig sicher, ich habe es länger nicht mehr selber erlebt, aber wenn man eine Aggregierung oder ein Annotate macht, dann Orderby, beziehungsweise nein, wenn das Model selbst in der Meta-Option, in Order By, der so ein standardmäßiges, eine standardmäßige Sortierung aktiv hat, dann gab es Bugs, dann hat das ORM teilweise komische oder falsche Sachen zurückgegeben.

Ronny

Das ist wie der Bug, das Ticket ist 3000 Jahre alt und die haben das jetzt tatsächlich repariert.

Ronny

Und das führt dazu, dass die Lösung war einfach, das ist halt aus Gründen funktioniert es nicht und das heißt, wenn du aggregierst oder annotierst, dann wird dieses Order bei im Model-Meter ignoriert.

Ronny

Das heißt, bei meinen Cases, wo ich das gemacht hatte, habe ich in meinen Test-Cases natürlich erwartet, dass die Sachen sortiert kommen, weil ich ja wusste, meine Projektliste oder meine Mitarbeiterliste, die wird ja übers Model sortiert.

Ronny

Hatte ich natürlich keinen XP-Order bei gemacht.

Ronny

So, plötzlich schlagen irgendwelche Tests fehlt, nachdem ich auf Django 3.1 hochgegangen bin, weil der die Reihenfolge anders ist, weil es gibt es kein Order bei mehr.

Ronny

Es gibt halt irgendeine Reihenfolge, die die Datenbank zurückgibt.

Dominik

Okay, ja, ja, das ist ein Danger ist aufgefallen, ja.

Ronny

Ziemlich abgefallen.

Ronny

Ich habe auch erst gedacht, das kann doch nicht sein.

Ronny

Also ich hab doch nur, ich habe Django hochgezogen, was ist denn da los?

Ronny

Bis mir dann ein lieber Kollege sagte, schau mal, such mal nach Orderby in den.

Ronny

Also Orderby

Dominik

ist er echt rausgeflogen, das habe ich keinen.

Ronny

Nee, das ist nur für diesen Sonderfall.

Ronny

Das war ein Bug und den haben die jetzt rausgenommen.

Ronny

Also den haben die gefixt und die Lösung dafür ist, dass es halt nicht mehr genommen wird.

Ronny

Also du kannst es manuell dahinter schreiben, dann funktioniert es.

Aber du musst es halt manuell machen.

Dominik

Aber in der Meta-Klasse geht es nicht mehr, oder?

Ronny

Immer, außer du machst Annotated Aggregate.

Ah, okay.

Ronny

Da gibt es auch einen eigenen Eintrag dazu und das ist auch irgendwo im Ticket nochmal festgehalten und verlinkt, etc.

Ronny

etc.

Ronny

Ich bin da jetzt auch nicht 100% in den Details drin, ich bin halt nur drüber gestolpert, weil das war auch genau das mit der Reihenfolge.

Ronny

Plötzlich war mein Element, das ich an Stelle 1 erwarte, an Stelle 2 und umgekehrt.

Ronny

Und wenn man halt die Tests so gebaut hat, dass der halt die Reihenfolge explizit erwartet, weil ich ja wusste, damals noch sortiert war, dann steht man da plötzlich.

Ja.

Jochen

Ja, und das mit der Reihenfolge von Tests ist halt auch deswegen so wichtig, weil nämlich ein Feature braucht quasi, die Isolation, also dass halt alle Tests einzeln isoliert voneinander sind und nicht abhängig von irgendwelchen anderen Tests sind.

Jochen

Und das ist nämlich, dass man die Tests, wenn man die Tests parallel ausführen möchte, dann müssen die so sein, weil ansonsten kriegt man halt ein Problem.

Jochen

Und da gibt es dann halt auch, ich weiß nicht, ich glaube, da muss man irgendwas installieren, ich weiß es nicht mehr so genau.

Jochen

Also man kann auf jeden Fall, und ich weiß auch nicht, das ist bei PyTests und bei Unitests anders, aber man kann halt mit einer bestimmten Option sagen, so für die Tests mal in umgekehrter Reihenfolge aus.

Jochen

Wenn das schief geht, dann weiß man schon, dass man ein Problem hat.

Jochen

Oder für die mal in zufälliger Reihenfolge aus, dann muss man es halt wahrscheinlich ein paar Mal ausführen und wenn es dann funktioniert hat, hat man vielleicht wirklich gehabt und man kann es parallelisieren.

Jochen

Aber genau, wenn die Tests isoliert voneinander funktionieren, dann kann man halt die halt auch parallel ausführen und dann halt es halt quasi um den Faktor, wie viele CPUs man halt hat, beschleunigen.

Jochen

Und das ist natürlich auch sehr nett, weil ich meine, ja, schnell.

Dominik

Die hat heute nicht schon ganz, ganz viele CPU-Serverview.

Jochen

Genau, ja.

Jochen

Ja, es gibt sogar noch ein Ding, XS oder so, mit dem kann man dann halt Sachen noch auf mehrere Rechner verteilen, aber wie ein Rechner ist ja schon mal nicht so schlecht.

Jochen

Wenn man da so acht Cores hat, dann geht das schon mal deutlich schneller, wenn man die alle verwenden kann.

Jochen

Aber wenn man eine große Basis, ein Projekt hat mit vielen Testbasis und die sind nicht unabhängig voneinander, dann kann man das mit dem Parallelisieren eigentlich fast vergessen, weil das kriegst du halt nicht so einfach umgestellt.

Jochen

Ja.

Jochen

Ja.

Jochen

Genau.

Jochen

Wie ist das?

Jochen

Habt ihr da häufig Probleme mit langlaufenden Tests?

Dominik

Wie viele Tests habt ihr denn überhaupt oder?

Dominik

Also bei großen Projekten muss das ja in die Zehntausende gehen.

Ronny

Ja, tatsächlich.

Ronny

Also bei unseren langlaufendsten Projekten bin ich nicht mehr aktiv dabei.

Ronny

Also bin ich nicht im Dev-Team.

Ronny

Das heißt, ich habe da jetzt keine Zahlen, aber ich weiß, dass die Pipelines da teilweise auch Stunden brauchen.

Ronny

Also einfach, weil die haben da inzwischen auch Optimierung gemacht.

Dominik

Wenn man da genau die Agile irgendwie dran sitzt, dann.

Ronny

Tatsächlich haben wir da jetzt auch Lösungen irgendwie gebaut, dass halt manche Tests laufen dann irgendwie nicht mehr pro Commit.

Ronny

Oder irgendwie Sachen werden lokal getestet, weil es lokalen doch mal manchmal ein bisschen schneller geht oder so eine Parallelisierung.

Ronny

Bei dem längsten Projekt, das ich betreue, das ist eine interne Software, da habe ich jetzt die 1200, glaube ich, geknackt.

Ronny

Ja, und das ist ganz lustig.

Ronny

Ich hatte da, ja, das waren ungefähr ja, also in der Pipeline lief das immer so 25 Minuten, die Tests, was vertretbar ist, das hat mich trotzdem immer ein bisschen geärgert.

Ronny

Und habe ich irgendwann mal einen Artikel auf Medium gefunden, wo jemand meinte, ja, wenn man die Tests ganz klassisch mit Setup geschrieben hat, dann das geht besser.

Ronny

Weil bei dem Setup, also jetzt wir reden sie wieder vom Django Unitest-Welt oder ich glaube, das ist insgesamt Unitest-Welt.

Ronny

Beim Setup ist es halt so, dass halt vor jeder Testmethode alles, was im Setup steht, ausgeführt wird.

Ronny

Und es gibt eine Klassenmethode, die halt quasi nur einmal pro Testklasse ausgeführt wird.

Ronny

Also eine Test-Klasse 10 Test, dann wird es halt nur einmal ausgeführt, bei Setup wird es jedes Mal ausgeführt.

Ronny

Und Django hat halt so eine magische Funktion, das nennt sich Setup-Test Data.

Ronny

Und da wird es in eine Transaction gewrappt.

Ronny

Das heißt, die Daten werden nur einmal ausgeführt, also es ist auch eine Class Method, also es ist nur einmal pro Klasse, aber die kann man quasi recyceln.

Ronny

Also bei jedem Testaufruf.

Ronny

Das heißt, man hat so ein bisschen das Beste von beiden Welten.

Ronny

Ich habe das dann gelesen, fand das cool und dachte, ach, mal gucken, was das bringt.

Ronny

Ich habe gedacht, ah, es ist 1000 Tests, das dauert bestimmt ewig, aber tatsächlich ging es relativ fix.

Ronny

Nach zwei, drei Stunden war ich fertig.

Ronny

Und ja, habe die Pipeline von 25 Minuten auf 5 Minuten gedrückt für die Tests.

Ronny

Und das hat mich halt echt richtig, richtig, richtig überrascht, dass das so viel bringt tatsächlich.

Ronny

Ich meine, klar, wenn man überlegt, dass jede Testklasse vielleicht 20 Tests hat, dann

50 schneller.

Dominik

Da gab es doch jetzt auch genau dieses Buch dazu, wie man Django-Tests spielt.

Jochen

Ja, von Adam Johnson jetzt irgendwann im Mai rausgekommen, Speed up Your Django Tests, heißt das irgendwie.

Jochen

Genau.

Jochen

Und da, ich habe es nicht ganz komplett gelesen, ich habe so ein bisschen, also ich hab's und ich habe es auch so ein bisschen quer gelesen schon, aber noch nicht so.

Jochen

Ja, da stehen viele coole Sachen drin.

Jochen

Also auch ganz gut.

Jochen

Nein, ich habe es wirklich, ich habe das ganze Kapitel doch gar nicht gelesen.

Jochen

Aber da stehen auch viele interessante Dinge drin, ja.

Jochen

Also zum Beispiel, dass man halt, ja, also auch Vergleich Unitest, PyTest zum Beispiel, der sagt da halt auch, ja, PyTests ist eigentlich schon cooler.

Jochen

Bei vielen Kapiteln steht dran, so, das ist jetzt nur für Unitests relevant.

Jochen

Bei Pytest muss man das nicht machen, da ist das schon richtig so von Natur aus sozusagen.

Jochen

Und der schreibt auch, ja, PyTest ist ein Stück schneller.

Jochen

Es ist auch so, wenn man das zum Beispiel, sowohl PyTests wie Unitests geben ja aus, wie lange sie laufen.

Jochen

Aber Unitest ist so ein bisschen gemogelt.

Jochen

Also viele Sachen kommen da nicht mit rein.

Jochen

Da muss man halt, also auf einem Unit schreibt man halt Time davor, um halt zu sehen, wie viel hat es denn, wie lange hat es denn wirklich gedauert.

Jochen

Und tatsächlich die Real-Time, wie lange hat das gedauert, ist halt das, was einer eigentlich interessiert.

Jochen

Und da ist Py-Test schon normalerweise ein Stück schneller.

Jochen

Und bei der reporteten Zeit ist es relativ ähnlich, aber das liegt halt daran, dass Pytest einfach mehr Sachen dazu zählt, zu dem, das hat jetzt, solange hat der Test gedauert.

Jochen

Und ja, also was er empfiehlt, was man halt am Anfang machen kann, ist, also man sollte erstmal gucken, erstmal messen, also halt zum Beispiel sich anschauen, was sind denn eigentlich so die langsamsten Tests, die man so hat, weil normalerweise hat man da auch so eine Pareto-Verteilung, dass halt 20% der Tests machen halt 80% der Zeit aus.

Jochen

Und mit Pi-Tests geht das einfach Minus, Minus Durations und dann eine Zahl und dann kriegt man halt die Zahl langsamsten Tests einfach am Schluss ausgegeben.

Jochen

Und bei Unitests muss man halt irgendwie Django-Slow-Tests installieren oder so.

Jochen

Aber damit geht das in der Art auch.

Jochen

Und dann den Testrunner ersetzen und dann kriegt man die halt auch ausgegeben.

Jochen

Und dann kann man halt bei den Tests halt dann mit einem Profiler nachgucken, was macht die eigentlich so langsam.

Jochen

Und dann findet man wahrscheinlich schon Dinge, die man halt verbessern kann.

Jochen

Und ja, da gibt es dann auch so Dinge wie, ja, man kann halt, es gibt da diverse Tools, mit denen man sich denn.

Jochen

Also man kann einen C-Profile, kann man Ausgaben anzeugen, die man sich dann angucken kann, mit K-Cache-Grind oder naja gut, muss man sich, also gibt es eine Menge Zeugs.

Jochen

Dann gibt es so Easy-Wins, so einfache Dinge, die man halt mal tun kann, um halt die Geschwindigkeit von Tests zu verbessern.

Jochen

Und da ist, glaube ich, das Erste, was er schreibt, ist halt den Passwort-Hasher zu ersetzen.

Jochen

Das ist halt auch noch so ein Standard, weil man erzeugt halt viele User und so und da muss man halt auch.

Jochen

Und die echte, echte Passwort-Hash, die echten Passwort-Hash-Agorithmen sind natürlich extra so designt, dass sie möglichst langsam sind, damit man halt nicht viele Hashes durchprobieren kann, weil es einfach zu teuer wäre.

Jochen

Das will man jetzt natürlich, wenn man Sachen beschleunigen möchte, möchte man nicht, möchte man es halt aber eher schnell haben.

Jochen

Und dann, wenn man dann den MD5-Hasher nimmt, oder der ist halt nicht sicher, aber der ist auch mal.

Jochen

Bei dem Hash ist es halt egal, weil da kennt man die Passwörter ja eh, die man da hasht.

Ronny

Das würde man dann über eine Mock-Funktion wahrscheinlich machen, oder?

Nee, das kann man einstellen.

Jochen

Das ist ein Setting.

Dominik

Du kannst die Mittelware-Antwort in den Settings testen.

Dominik

Kannst du die Middleware dann einfach nehmen?

Jochen

Nee, nee, das ist keine Middleware.

Jochen

Du kannst den Passwort-Hasher setzen.

Dominik

Ja, okay.

Dominik

In den Settings setzen.

Jochen

Du sagst dann halt nicht Passwort-Hasher, irgendwas von denen, importierst halt deinen MD5-Passwort-Hasher und schreibst halt den String zu dem Hasher einfach in die Config rein.

Jochen

Fertig.

Ronny

Ich meine, rein theoretisch brauchen wir auch gar keinen Passwort-Hasher.

Ronny

Ich meine, du willst dich ja nicht einloggen in Tests.

Jochen

Ja, ja, ja, keine Ahnung.

Jochen

Ich weiß nicht, es wird halt empfohlen, in den MD5-Dings zu nehmen, keine Ahnung warum.

Jochen

Vielleicht hat das auch noch irgendwelche Seiteneffekte, ich weiß es nicht genau, wenn man jetzt da sagt, gar nichts, ob das irgendwas ändert.

Jochen

Ich weiß es nicht.

Ronny

Ach, gemacht.

Jochen

Keine Ahnung.

Jochen

Genau, das war so das Erste, was er empfiehlt.

Jochen

Dann sagt er sowas wie, ja, irgendwie vor allen Tests wird irgendwie die Datenbank serialisiert.

Jochen

Man kann jetzt an den Datenbanksting ranschreiben, also für die Testdatenbank Serializable Doppelpunkt Falls oder so auch eine Config-Option.

Jochen

Und dann wird das halt nicht gemacht.

Jochen

Man braucht das eigentlich fast nie.

Jochen

Es gibt ganz selten Testfelder, die sowas benötigen, aber eigentlich braucht man das nicht und macht auch Sachen schneller.

Jochen

Dann, was war da noch drin?

Jochen

Also, solche Dinge wie man kann, das kannte ich gar nicht.

Jochen

Also, das war mir neu.

Jochen

Ich habe tatsächlich, also wie ich weiß nicht, wie du das machst mit Files, wenn du halt irgendwelche Bilddaten oder so testest oder so, hat man ja auch viel mit Files zu tun.

Jochen

Ich hatte zum Beispiel immer das Problem, dass dann halt viele Files einfach noch am Schluss rumgelegen sind und dann habe ich halt irgendwelche Cleanup Scripts geschrieben.

Jochen

Genau, Dinger geschrieben.

Jochen

Nicht Cleanup Scripts, sondern halt schon das quasi so mit in die, ich habe dann das in Dekoratoren reingeschrieben und dann halt die Testklassen dekoriert und die haben dann hinterher quasi das Media-Route wieder aufgeräumt oder so.

Jochen

Ich weiß gar nicht gar nicht mehr genau, wie ich das gemacht habe.

Jochen

Aber auf jeden Fall habe ich da halt irgendwie Aufwand reingesteckt und dachte so, oh, das war ätzend.

Jochen

Und es gibt Diod In-Memory Storage, heißt das Paket, glaube ich.

Jochen

Und da kann man das Default-Storage ersetzen durch halt In-Memory-Storage.

Jochen

Und dann wird überhaupt nichts gespeichert.

Jochen

Und es ist halt viel schneller, weil es ist halt in Memory.

Jochen

Es funktioniert halt genauso, aber es halt landet hinterher gar nichts auf der Platte.

Jochen

Und wenn man viel mit Files macht, dann ist es halt sofort deutlich schneller.

Jochen

Ja, das war auch so ein Ting, das ist wahrscheinlich echt gut.

Jochen

Das ist sehr praktisch.

Jochen

Dann gab es noch so Salary-Optimierungen.

Jochen

Da kann man auch ein Memory-Backend verwenden.

Jochen

Und naja, man muss halt gucken, dass man halt AlwaysEager auf True setzt und auch noch irgendwas anderes, weiß ich mehr genau.

Jochen

Ja, sowieso diese ganzen Async-Task-Dinger, da gibt es dann halt Jungle Q, das will ich mir mal angucken.

Jochen

Salary habe ich letztens wieder, ah, Salary, Salary!

Ja, genau, genau, damit genau dann mal.

Jochen

Euch vielleicht auch.

Jochen

Mich hat es auf jeden Fall vor ein paar Tagen gebissen, mal wieder, als ich irgendwie dachte, so irgendwie seltsam ruhig hier so alles.

Jochen

Irgendwie passiert das zu wenig auf dem Produktionssystem.

Jochen

Wie kommt denn das?

Jochen

Und ich hatte gerade irgendwie released und gucke dann halt so in die Logfile und sagt so, was sind die ganzen Satellitests?

Wo sind denn die hier?

Jochen

Wieso?

Jochen

Was?

Jochen

Warum werden da keine Saturny-Tests mehr ausgeführt?

Jochen

Und dann habt ihr so ein bisschen gegoogelt und dann ja, jetzt, ich glaube 447 war das oder so, hat irgendeine Regression, eine böse Regression drin gehabt, dass halt die Salary Broker URL oder so aus den Settings nicht mehr benutzt wird.

Jochen

Oh.

Jochen

Und ja, ich weiß nicht, wie viele Produktionssysteme das weltweit gebrochen hat.

Jochen

Es dürften viele gewesen sein.

Dominik

Ja, ein netter Change, ja.

Jochen

Ja.

Jochen

Und dann habe ich wieder downgegrad auf 4.46 oder sowas und dann war es wieder okay, aber so, wow, okay, das war schon, hm, naja.

Jochen

Ich muss mir mal Jungle Q angucken.

Ronny

Eine Sache, die eigentlich total selbstverständlich ist, die ich aber für mich persönlich erst relativ spät erkannt habe, ist, wenn man, also man hat eine Funktion, also man hat einen Service, man hat eine höherlevelige Funktion, die man testen möchte.

Ronny

Und darunter laufen noch andere Sachen zum Beispiel.

Ronny

Es können jetzt API-Calls sein, da kam ich jetzt gerade drauf, wegen diesen externen Sachen mit den Files, aber auch andere Sachen, die tendenziell noch länger laufen.

Ronny

Und wenn man den Aufruf der unteren Funktion, also der unterliegenden Funktion einfach mockt, dann spart man natürlich einen ganzen Laufen Zeit, weil der halt dann nicht versucht, eine API anzusprechen und man irgendwie die API mocken muss oder keine Ahnung was, sondern sagt einfach, das Ding gibt 27 zurück und gut ist.

Ronny

Und auf der anderen Seite werden die Tests natürlich auch deutlich besser, weil man isoliert nun den Teil testet, den man eigentlich testen möchte.

Dominik

Also du musst jetzt einmal noch kurz neu antennen, also einmal muss man ganz kurz erklären, was überhaupt Services sind, vielleicht für alle Menschen, die es noch nicht so benutzen haben.

Ronny

Okay.

Ronny

Also Django hat von sich aus ja keine, bringt da kein Pattern mit, wo man Logik hinpackt.

Ronny

Es gibt Manager für Datenbankqueries, es gibt Models, es gibt Views, aber wenn man jetzt einfach Logik bauen möchte, die irgendwas tut, also die irgendwie ein CSV generiert, Daten verarbeitet, dafür gibt es halt offiziell nichts, wo man das hinpacken kann.

Dominik

Utils, helpers.

Jochen

Nee, nee, das ist auch Utils, immer wenn du ein Modul hast, das Utils heißt.

Ronny

Tatsächlich auf der auf der Kopenhagener DjangoCon letztes Jahr.

Dominik

Jetzt muss ich meine ganze Applikation direkt weg drin, das weißt du mal.

Jochen

Ich weiß, ich habe selber solche, aber ich weiß, also allehands.

Jochen

Weil das Problem ist halt, dass, naja, was sagt dir das, wenn da, wenn du bei irgendjemandem siehst, da liegt halt ein UTIS-Modul rum, was ist da drin?

Dominik

Als möglicher Unsinn.

Ja, weißt du halt nicht.

Jochen

Ja, genau.

Jochen

Das ist gar nicht so gut, wenn nur der Zack rumliegt und weiß nicht, was das ist.

Ronny

Tatsächlich gab es da auch einen Vortrag auf der letzten DjungoCon in Kopenhagen, wo dann auch ein paar Franzosen, glaube ich, drüber geredet haben, dass die halt das Konzept vermissen, dass das nicht offiziell in Doku drin steht, mach das so, weil es halt sehr viele Leute so machen, dass man einfach eine Klasse anlegt, die kann man dann einsortieren, die kann man sinnvoll benennen.

Ronny

Und dass man da dann halt seinen Code halt irgendwo sinnvoll parken kann.

Ronny

Und dann auch, ich meine, das ist halt so eine Art Best Practice.

Ronny

Das hat kein offizielles Django Pattern, aber ich glaube, das gilt inzwischen als Best Practice.

Ronny

Korrigiere mich, wenn du es anders siehst, aber.

Jochen

Nee, ich weiß, weißt du es nicht, ich weiß jetzt, es ist aber nicht diese Geschichte, wo irgendwelche Leute versucht haben, den ORM so ein bisschen wegzuabstrahieren.

Der gab es nicht.

Jochen

Genau, auch auf Django News, die haben auch da Werbung gemacht.

Jochen

Auch die haben das auch irgendwie Services genannt, aber ich glaube, das war was anderes.

Ronny

Jetzt ist gegen das Wadi das Projekt irgendwie Maintaining a Jungle Project over 10,000 Commits oder so, was hieß das.

Ronny

Die hatten so ein paar ketzerische Ideen, die wollten absichtlich ein bisschen Unruhe stiften, glaube ich, im positiven Sinne.

Jochen

Ja, nö, ist ja gut.

Jochen

Die sind mir, glaube ich, mal angucken.

Kenne ich gar nicht.

Ronny

Also wie gesagt, es waren halt insgesamt so ein paar ketzerische Ideen, die waren dann auch und meinten dann so, sie nutzen eigentlich gar keine Packages mehr, weil wenn das Projekt so lange läuft, hast du Frühler später immer schwerer rein und sowas.

Ronny

Wie gesagt, die waren da gebrannte Kinder auf jeden Fall, das hat man gemerkt.

Ronny

Aber wie gesagt, die haben halt dann auch, ich habe nachher im Nachgang auch mit denen gesprochen und die meinten halt auch, dass die es halt sehr cool fänden, wenn dieses Django-Ding in die Django Doku reinkommen würde, das mit den Services.

Ronny

Einfach dass dann halt auch Newbies, die halt vielleicht nicht so genau wissen, wie es mir damals auch nicht, ich wusste auch nicht, wie ich das mache.

Ronny

Ich habe auch mit Utils angefangen und hatte dann immer ein ziemliches Chaos überall rum.

Ronny

Core-App und Utils.

Jochen

Ja, Core-App ist auch, ja.

Ronny

Genau.

Ronny

Ja, das zu Services.

Dominik

Ja, und du hast gesagt, die kann man mocken oder die will man mocken oder wann möchte man das?

Ronny

Genau, also es gibt ja beim Testing kann man ja alles Mögliche mocken.

Ronny

Also man kann die aktuelle Zeit mocken, was sehr praktisch ist.

Ronny

Also was sagen, heute ist nicht heute, sondern irgendwann anders.

Ronny

Montag.

Ronny

Und man kann aber auch einen Mock-Block verwenden.

Ronny

Das heißt, man kann einfach dann sagen, alles was in diesem Mock-Block passiert, wenn da eine bestimmte Funktion aufgerufen wird, führt er die nicht aus, sondern gibt einen festen Werkzeug.

Ronny

Zum Beispiel, wenn man eine Funktion hat, Load Data vom API oder sowas, kann man einfach sagen, das gibt ein fixes JSON zurück.

Ein Mock-Block.

Dominik

Schön.

Ronny

Ja, sagt man, oder?

Ronny

Und wie gesagt, also ich meine, das ist eigentlich, wenn man das Mocking einmal gesehen hat, ist es eigentlich total offensichtlich, aber ich habe halt irgendwie nie so realisiert oder lange nicht realisiert, dass es halt einerseits total viel Zeit sparen kann und andererseits auch noch deinen Code oder deinen Testcode verbessert, weil dadurch, dass halt die unterliegende Funktion einen festen Rückgabewert haben, wenn da jetzt ein Fehler drin ist, dann tangiert das halt nicht die anderen Sachen, sondern die unter Funktionen, die ja hoffentlich auch getestet sind, failen dann isoliert und man hat dann nachher nicht irgendwie 50 gefällte Tests.

Ronny

Man muss erstmal anfangen zu suchen, sondern im Optimalfall, wenn alles isoliert genug ist, fällt genau der Test, der nicht mehr das tut, was er, das bringt, was er möchte.

Ronny

Und diesen Doppel-Win, das fand ich echt ziemlich neat, das nochmal so zu realisieren.

Jochen

Ja, ja, nee, klingt gut.

Jochen

Also ich packe meistens meine Logik irgendwie so in den Modell-Layer, mehr oder weniger.

Jochen

Genau, oder beziehungsweise dann halt in Mixins, die dann halt irgendwie.

Dominik

Models aufblähen.

Jochen

Ja.

Jochen

Wenn das dann zu lang wird, stecke ich die halt in andere Files und importiere die dann aus Models PY dann halt da rein.

Jochen

Genau, aber ja, ja, ich weiß auch noch nicht so genau.

Jochen

Ich muss mir dann, ich muss mal die Vortrag angucken.

Jochen

Genau.

Dominik

Es gibt verschiedene Meinungen zu, glaube ich, ja.

Ja.

Definitiv.

Ronny

Das ist wahrscheinlich auch der Grund, warum das noch nicht in Djangodoku gelandet ist.

Ja, bei

Dominik

Tuscro sagt ja auch, dass total Katastrophe für Fettmodels, aber ich finde das eigentlich auch gar nicht so schlecht, weil ich es bei Jochen gesehen habe natürlich.

Dominik

Dass man da viele gute Dinge reinpackt, die halt da hingehören irgendwie.

Dominik

So vom Gefühl her machen die halt mit der Datenbank oder so.

Dominik

Vielleicht sind sie dann am Model.

Ronny

Ich mag das auch.

Ronny

Also ich würde jetzt nicht sagen, ich mache jetzt, da ist alles rein, weil wie gesagt, ich finde das Service-Prinzip ganz nett und mag das auch ganz gern, aber die sind auf jeden Fall nicht dünn, die Models, die ich baue.

Dominik

Ja, aber wir hatten nochmal ganz kurz über das Mocken geredet und ich glaube, Mocken ist auch was, was noch sehr interessant ist.

Dominik

Weil man kann natürlich alles mocken und so tun, als gäbe es irgendeine Umgebung und dann da testen, ob dann das, was man so geschrieben hatte, für diese isolierte Umgebung dann funktioniert.

Jochen

Ja, und dann funktioniert es in der Realität nicht mehr, weil der Mock halt anders aussieht als die Relative.

Jochen

Das ist halt, ja.

Dominik

Ja, genau, und vielleicht ist das eins der Probleme.

Dominik

Also ich hatte das schon öfter mal mitbekommen, dass gerade Menschen, die irgendwie viel Coverage erreichen wollen, haben sich irgendwie sich dann so mit vielen Mocks und also es gab sogar Menschen, die haben sich dann Screenshots von den Webseiten irgendwie besorgt und dann geguckt, ob die dann am Ende genauso aussieht, weil sie dann irgendwie Templates noch versucht haben zu generieren und dann die Bilder miteinander verglichen und so solche Sachen, also wirklich abgefahrener Gott.

Dominik

Ja, also mock die ihr überhaupt irgendwas oder findet ihr das anstrengend?

Dominik

Oder wann macht man das?

Wieso?

Jochen

Also ich benutze das sehr häufig und ja, muss man muss man auch, denke ich.

Jochen

Also gerade wenn man irgendwie APIs fragt oder so mit externen sonstigen Systemen redet, dann geht das ja quasi gar nicht anders.

Jochen

Man kann nicht mehr so gut.

Dominik

Das heißt, die externen Antworten von Dingen, die du nicht im Test eigentlich abbilden kannst, die musst du dann tatsächlich machen.

Dominik

Die muss man

Jochen

emulieren bocken, denke ich.

Jochen

Das geht gar nicht anders.

Dominik

Ja gut, das sind eine Abfrage von externen API, die kann man sich tatsächlich vorstellen, dass das sinnhaftig sein kann, ja.

Ronny

Ich mache es tatsächlich bei Daten enorm viel, weil das halt einfach, also das ist nicht schlimmer, als wenn du irgendwie am Freitag einen Test ausführst und plötzlich geht er nicht mehr.

Dominik

Was sind Daten?

Ronny

Also Datums.

Dominik

Ja, ja, okay, wieder der, ja.

Ronny

Das ist ein bisschen schwierig im Deutschen.

Ronny

Aber also wirklich irgendwelche Zeiten, das ist total super.

Ronny

Man kann auch mit diesem, also das heißt Freescan das Tool, mit dem man das machen kann.

Ronny

Und da kann man halt auch einen Block machen, also sprich alles, was eingerückt unter diesem With Tag ist, kriegt dann einen anderen Timestamp, was halt sehr praktisch ist, man kann das als Decorator verwenden, zum Beispiel sagen, heute ist der 26.06.

Ronny

Obwohl das, also egal, wann der Test läuft.

Ronny

Und wenn man jetzt aber zum Beispiel sagt, ich möchte jetzt aber Objekte erstellen mit einem bestimmten Timestamp, dann kann ich halt das in diesem Wiss-Tag machen.

Ronny

Obwohl der ganze Test sagt, ich bin am 26.06.

Ronny

Kann ich dann trotzdem sagen, dieses Objekt ist aber schon zwei Jahre alt.

Ronny

Und das ist halt ziemlich praktisch.

Ronny

Wenn man da so zwei, drei Dinge verstanden hat, dann kann man sich das Leben sehr leicht machen.

Ronny

Ansonsten, das Mocken nutze ich viel weniger als man es wahrscheinlich sollte.

Ronny

Ich nutze es halt für APIs, also für externe Sachen, die ich halt mocken muss auf Unit- oder Functional-Test-Ebene.

Ronny

Und ansonsten, wenn ich halt eine Funktion habe, die halt sehr lange läuft, wo ich halt weiß, ich will die nicht jedes Mal durchjubeln auf allen höheren Ebenen, weil mir jetzt einfach zu lange dauert.

Ronny

Aber wahrscheinlich wäre es sinnvoll, das mehr zu machen.

Ronny

Obwohl natürlich du auch vollkommen recht hast, umso mehr man sich irgendwie da seine Fantasiewelt aufbaut, umso weiter weg bist du irgendwann natürlich von der Realität.

Dominik

Ja, also das User-Endpack oder sowas, das kann man ja auch in Frontend weiterdenken, was man halt irgendwie alles dann mocken kann.

Dominik

Habt ihr viel Frontend schon getestet irgendwie?

Dominik

Was gibt es da alles bei Mota und?

Jochen

Nee, nicht wirklich viel, ja.

Jochen

So Unit-Tests im Frontend, das ist ja, glaube ich, hat sich inzwischen so Just als der Standard etabliert so ein bisschen.

Ronny

Reden wir jetzt von JavaScript oder reden wir von normalem Django-Template?

Jochen

Ich werde Frontend direkt immer schon bei JavaScript.

Ronny

Ja, ja, eh, aber.

Dominik

Ja, leider, leider.

Dominik

In der Python-Welt auch, aber vielleicht ist das Test das derselbe Thema.

Jochen

Ja, meintest du denn Django-Templates?

Nein.

Dominik

Nein, ich meine tatsächlich, JavaScript, Tomuta und was man da alles so bauen kann.

Jochen

Ja, also ich würde sagen, da gibt es ja halt eben den Unterschied zwischen End-to-End-Tests, also Cypress oder weiß ich nicht, was Leute da noch verwenden.

Jochen

Ah ja, habe ich gar nicht mitbekommen.

Jochen

Ja.

Cool.

Jochen

Ja, und ich habe so ein bisschen was damit gemacht, aber noch nicht so wahnsinnig viel.

Dominik

Muss man da mehr mocken?

Jochen

Nö, eigentlich nicht.

Jochen

Ja gut, ich meine mehr auch.

Jochen

Ja, also ich habe damit auch nicht so wahnsinnig viel Erfahrung, ehrlich gesagt.

Jochen

Doch meistens für Djungle-Seite.

Dominik

Ja, also entweder baut man halt gute, richtig gut funktionierende Apps schon von sich aus oder man braucht halt Tests.

Dominik

Ja, aber man kann halt auch tatsächlich andersrum anfangen und kann sagen, man baut zuerst seine Tests.

Dominik

Das ist man dann Test-Driven Development und wenn man erst die Tests hat, die alle fisch gehen und dann den Code baut, was halt ihr denn davon?

Dominik

Also vielleicht für mich, ich finde das immer sehr verwirrend, sowas zu tun, weil um das zu tun, also erst Tests zu bauen, dann müsste ich erstmal wissen, was meine Anwendungen überhaupt machen sollen oder macht, um dann Tests zu bauen zu können, wo die dann diese hypothetische Anwendung irgendwie stimmen kann.

Dominik

Und das alleine schon ziemlich herausfordernd, finde ich.

Jochen

Ja.

Jochen

Ehrlich gesagt, ich habe das noch nie so wirklich probiert, weil ich immer dachte, ich muss das vielleicht mal machen, tatsächlich mal versuchen, wie es ist, Test-Driven zu entwickeln.

Jochen

Aber ja, da ist die Idee ja im Grunde, dass du genau erst immer den Test schreibst und dann erst den Code.

Jochen

Und man hört dann halt auf, wenn der Test funktioniert.

Jochen

Aber also gerade auch bei Django, ich fange meistens, wenn ich anfange, irgendwas zu schreiben, schreibe ich erstmal das in einem Jupyter Notebook.

Jochen

Weil, genau, also da gibt es halt, es gibt ja die Django Shell Plus zum Beispiel, in den Django Extensions, wo man halt die ganzen Modelle schon drin hat, sozusagen.

Jochen

Das gibt es halt auch in einem Jupyter-Frontend.

Jochen

Und man hat dann quasi so eine Umgebung wie in der Shell Plus, bloß halt mit dem ganzen anderen Jupyter-Kram drumherum.

Dominik

Man kann halt die ganzen Zellen immer wieder ausführen.

Jochen

Genau, dann probiere ich halt so lange rum, bis ich weiß, dass es ungefähr das tut, was ich gerne hätte.

Dominik

Wenn man so funktionieren machen möchte, die machen.

Jochen

Ja, weil oft Sachen muss man halt irgendwie ausprobieren.

Jochen

Das geht nicht, da muss man es irgendwie anders machen.

Jochen

Und damit geht das eigentlich tatsächlich sehr, sehr, sehr schön, während man halt, wenn man jetzt das tatsächlich direkt in den Code schreiben würde, müsste man das immer irgendwie ausführen, man müsste jetzt erstmal an die Stelle kommen, wo das dann ausgeführt wird.

Jochen

Klick, klick, klick, klick.

Jochen

Und das ist halt alles immer ein bisschen schwieriger.

Jochen

Und im Notebook hast du das halt, da änderst du dann wieder deinen Code fürs nochmal die Zelle aus und weißt dann, okay, jetzt passt es.

Jochen

Und dann, also meistens, also da fange ich an, Sachen zu basteln.

Jochen

Und wenn das dann halt so halbwegs passt, dann überführe ich es halt in tatsächlich Django-App-Code irgendwo.

Jochen

Und dann fange ich meistens an auch Tests zu schreiben.

Jochen

Manchmal stelle ich dann noch was um, weil es irgendwie dann einfacher ist zu testen oder so, aber oft ist es dann auch mehr oder weniger dann schon so fertig.

Dominik

Das heißt, das Test-Driven ist quasi gar nicht erst Testschreiben bei dir, sondern doch eher so Experimente machen in so einem Notebook, die halt so lange durchgehen, bis du halt was, was gerade getogen hast.

Dominik

Also so ein bisschen Learning by Doing oder ja, man könnte jetzt auch sagen, ausprobieren und bis jetzt irgendwas funktioniert.

Dominik

Aber da sag ich mal, in Notebooks ist diese Iterationsstreife relativ kurz.

Jochen

Es ist relativ kurz.

Jochen

Das ist der große Vorteil.

Jochen

Und ich kenne es halt aus dem Data Science-Bereich so.

Jochen

Und ich weiß nicht, ob das, ich meine, diese Art, das so zu machen, gab es halt vorher auch, glaube ich, so noch gar nicht.

Dominik

Das Tile-Error wird halt einfach dann unheimlich viel schneller.

Dominik

Und wenn man irgendwann ungefähr weiß, in welche Richtung man möchte, dann ja.

Jochen

Ja, also insofern habe ich das so, das ist halt das, wie ich das momentan mache, aber wäre vielleicht auch mal ganz interessant, Test-Driven Development mal so wirklich auszuprobieren oder mal gezeigt zu bekommen von jemandem, der das so wirklich kann.

Jochen

Aber ja, daher ist das bei mir eigentlich nie.

Jochen

Ist das, was quasi dann im Applikationscode in einer Jungware App landet, eigentlich meistens schon relativ fertig und die Tests, die dazu, also meistens weiß ich dann auch schon, welche Tests ich dann schreiben muss und dann ja.

Dominik

Macht ihr Tests dürfen, die wir da machen sollen?

Ronny

Es gibt da ein paar Leute bei uns, die das machen.

Ronny

Ich persönlich mache es nicht.

Ronny

Ich bin da ähnlich wie Jochen, dass ich denke, so ich sollte es eigentlich mir nochmal im Detail angeschaut haben und nochmal vernünftig zeigen lassen.

Ronny

Mein Jupyter Notebook ist halt, dass ich halt meistens mit aktivem Debugger arbeite.

Ronny

Also sprich, ich springe mit dem Debugger in den Code, soweit ich bin.

Dominik

Also Debugger heißt also, welche Entwicklung schon geben nutzt du?

Ronny

Tycharm von IntelliJ.

Ronny

Und ich habe mir das irgendwann mal angefangen anzugewöhnen.

Ronny

Das Schöne ist halt, du kannst halt dann mit den Evaluate Expression im Debugger, kannst du halt direkt Sachen testen und ausprobieren.

Ronny

Also sprich, wenn du dir nicht ganz sicher bist, zum Beispiel, ob eine Query das zurückgibt oder wenn man jetzt irgendein komplizierteres Aggregate macht, geht das, funktioniert das wirklich.

Ronny

Und solange man nicht versehentlich auf STRG ist, also Speichern drückt und die Seite neu lädt und dann der Debugger neu startet, hat man halt den Debugger, auch wenn man da ganz viele Änderungen macht und kann sich dann natürlich irgendwelche Zwischenstate in eine neue Variable speichern, weitermachen.

Dominik

Das ist ein sehr interessant anders.

Dominik

Das würde ich gerne tatsächlich mal live sehen.

Dominik

Also weil so, ich glaube, so ein bisschen macht der Jochen das und ich mache das auch mehr abgucken mit den Notebooks, weil du da halt auch immer diese Iteration treffen hast.

Dominik

Und auch, also wir benutzen ja VS Code VS Code Jochen manchmal.

Dominik

Da kann man das ja auch machen mit dem Debugger, den ich aber selten für sowas benutze, also nur wirklich, wenn ich ein Problem habe, was ich so nicht so einfach verstehe, dann gucke ich da mal rein und Python macht das.

Ronny

Für mich persönlich, also mir geht es ein bisschen so, wie das verstanden habe euch beiden auch.

Ronny

Ich weiß halt am Anfang meistern nicht so genau, was nachher rauskommt.

Ronny

Also die meisten Sachen, die man ja so zu testen, sind ja dann bei mir jetzt in Services.

Ronny

Und ich weiß halt einfach nicht, wie der Service nachher aussieht.

Ronny

Hat der nur eine Process-Methode, hat er mehrere Methoden, wie sehen meine internen Methoden aus?

Ronny

Ich habe da noch nicht so ein Bild davor, das entsteht erst, während ich daran arbeite und ich dann merke, ah, ich habe vielleicht noch was vergessen.

Ronny

Und das wächst dann irgendwie.

Ronny

Das heißt, ich gehe dann, fange dann eher an, baue einen Service, also eine Klasse, packe da einen Process rein und überlege dann, okay, dann schreibe ich ein bisschen Code mit dem Debugger an, merke, okay, das müsste ich kapseln, das ist nicht testbar sonst, weil das sonst zu viele Sachen drin, ziehe das raus, dann baue ich da wieder Sachen dazu und so wächst das dann halt mehr oder weniger von innen nach außen.

Ronny

Und ich müsste halt sehr meine Denke umstellen, wenn ich halt erst mir überlege, was möchte ich denn eigentlich so genau alles testen, also was kommt nachher alles raus.

Ronny

Weil teilweise manchmal habe ich auch, wenn ich anfange, eine ganz andere Idee von dem, was nachher rauskommt, was ich nachher habe, weil ich nachher eine gute Idee habe und merke, ach, das könnte man ja vielleicht alles besser, schneller, effizienter, komplett anders machen.

Ronny

Und ja, also ich denke, TDD ist auf jeden Fall ein sehr hehres Ziel, das zu machen.

Ronny

Und ich glaube auch, dass Leute, die, sag ich mal, programmieren lernen, das auch bestimmt nicht verkehrt ist, wenn die so anfangen.

Nee, ich

Dominik

glaube, das ist für sich ganz anders.

Dominik

Weil die Leute wissen gar nicht, was sie bauen können.

Dominik

Und wenn die nicht lernen, dann wenn die Tests schreiben, die sind sowas von überfordert.

Ronny

Okay, ich formuliere um, für Leute, die schon programmieren können, aber jetzt, sag ich mal, so ein bisschen mehr in die, also die so, sag ich mal, so das Grundhandwerk verstehen und jetzt anfangen, dann wirklich produktiv arbeiten zu wollen.

Ronny

Weil zum Beispiel bei mir, als ich angefangen habe zu programmieren und auch Python gelernt habe, da war mein Code, den ich geschrieben habe, also ich habe damals immer noch keine Gewinn-Test geschrieben, ich bin das auch schon lange her, aber der Code, den ich produziert habe, der war nicht gut strukturiert, der war nicht gut testbar.

Ronny

Und wenn du halt TDD machst, dann wirst du halt von Anfang an gezwungen, dass dein Code die richtige Struktur hat, weil du merkst halt sofort, oh, der ist ein Code, den kann ich testen, weil du hast.

Dominik

Aber du hast jetzt gerade einen Bias drin gehabt, du hast gesagt, die richtige Struktur.

Dominik

Du hast gesagt, dass er die Struktur, die man gut testen kann, die richtige wäre.

Dominik

Ja, okay.

Ronny

Eine bessere, eine bessere.

Ronny

Aber ich glaube auf jeden Fall, dass Code, der nicht testbar ist, nicht so richtig guter Code ist.

Ronny

Das würde ich jetzt einfach mal so postieren.

Okay.

Ronny

Und das zum Beispiel hat mir, als ich dann angefangen habe, mich intensiv in Unitests zu beschäftigen, halt sehr geholfen, auch nochmal wirklich beim Code schreiben auch zu überlegen, wo soll das denn alles hin?

Ronny

Also wenn ich halt weiß, ich möchte das irgendwie isoliert und vernünftig, also ich möchte nicht nachher drei Stunden über Tests nachdenken und irgendwelche wilden Fälle zusammenbauen, sondern ich möchte es ja einfach, so eine Funktion, die macht eine oder zwei Sachen, genau das möchte ich abchecken, ob das nachher rauskommt und fertig.

Ronny

Und wenn man halt das nur baut, dass es funktioniert und gar nicht über diese Tests nachdenkt, ja, das ist halt, glaube ich, ein Unterschied.

Ronny

Von daher glaube ich, kann das für, also ich glaube, für Leute, die schon relativ gut wissen, was sie tun, kann das natürlich eine Verbesserung sein.

Ronny

Wir hatten mal vor vielen, vor zwei Jahren einen, ich sag mal, einen Pythaguru bei uns in der Firma, der mal so einen Tag lang über TDD erzählt hat und im Endeffekt querbeet alles Mögliche und war das erst auch mein erster intensiverer Kontakt mit TDD und ich habe ihn da im Nachgang auch gefragt und hab gesagt, hey, guck mal, ich arbeite so und so, was sagst du dazu?

Ronny

Ich meine, ne, du hast dir hier den.

Ronny

Und er meinte, im Endeffekt ist es halt so, es gibt halt viele Wege, die nach oben führen.

Ronny

Er selbst findet das gut, er macht das auch so, er hat auch irgendwann mal umgelernt.

Ronny

Aber für ihn zum Beispiel ist halt wichtig, dass testbarer Code rauskommt.

Ronny

Und wenn man halt selbst, durch die Art, wie auch immer man da hinkommt, wenn ein testbarer Code am Ende rauskommt, dann ist halt ein großer Vorteil von TDD, hat man halt anders erreicht.

So what?

Ronny

Eine Sache, die ich auch ganz interessant fand, ist, bei TDD fängst du dir an und schreibst einen Test, der per se fehlen muss, weil es gibt ja noch nichts, was funktionieren kann, weil du ja mit dem Test anfängst.

Ronny

Und das fand ich ganz spannend.

Ronny

Er meinte, er findet das, das ist für ihn so die Routine, er fängt irgendwas an zu programmieren und sieht erstmal, der Test schlägt fehl.

Ronny

Und wenn man andersrum arbeitet, dann baut man die Tests ja so, dass sie funktionieren.

Ronny

Also du baust ja nicht absichtlich einen Test und baust einen Fehler ein, um den Test rot zu haben.

Ronny

Und er meinte, das ist ja ganz angenehm, dass du am Anfang siehst, okay, ich habe jetzt acht Tests gebaut, die schlagen alle acht fehl und nachher mache ich, dass sie gehen.

Ronny

Weil es kann halt leicht passieren, dass wenn man halt das andersrum macht, dass man halt die Tests baut und dann hat man einen Fehler drin, der Test ist versehentlich grün.

Ronny

Also false positive.

Ronny

Und tatsächlich ist mir das auch mal passiert in einem Projekt.

Ronny

Da hatte ich ein Rechnungsmodul gebaut, also auch zahlungsrelevant und ziemlich heikel.

Ronny

Und irgendwie ist dann irgendwann mal, das sah auch alles immer super aus und grün und so weiter.

Ronny

Und dann irgendwann ist halt mal die Init-Pie weggekommen aus dem Testordner, wie auch immer.

Ronny

Und naja, dann sind die halt plötzlich mal ausgeführt.

Ronny

Das Projekt hat damals, glaube ich, 800 Tests, die 50 Tests für die Rechnungslegung, die sind dann halt nicht aufgefallen, dass die nicht mehr drin sind.

Ronny

Ja, und irgendwann waren dann da halt Fehler in der Rechnung und ich dann so, hm, irgendwie kann das nicht sein.

Ronny

Ich habe das doch getestet.

Ronny

Und dann war das so, ups.

Ronny

Ich meine, das trifft es nicht so 100% deckungsgleich mit dem, was ich jetzt gerade meinte, aber solche Sachen, es gibt halt schon echt Beispiele, wo man das haben kann.

Ronny

Ich finde diese Idee eigentlich ganz nett, dass man wirklich mal guckt, so, hey, funktioniert das denn wirklich?

Ronny

Weil es kann ja wirklich sein, dass man ein Test einfach, dass der, ja, dass der versehentlich funktioniert.

Ronny

So viel gemockt oder so, man weiß es nicht.

Ronny

Und ja.

Jochen

Ja, nee, absolut.

Dominik

Spannendes Thema.

Dominik

Ich würde dich gerne noch ein paar Getränke hier testen.

Dominik

Was haben wir denn?

Dominik

Wir haben mit der Liste.

Ronny

Ich glaube, die Liste sind wir ganz gut, oder?

Durch.

Wir sind durch?

Nein, das ist noch nicht.

Ronny

Wir sind voll vorbereitet, wir haben eine Liste.

Dominik

Du hast ja selber geschrieben, ich kann gar nichts lesen.

Jochen

Du kannst ja schon mal die Liste lesen.

Jochen

Ich kann ja vielleicht nochmal gerade, also ich bin immer noch ganz begeistert von dem Sweet Up Django-Tests Buch und genau, was man nämlich auch noch alles machen kann.

Jochen

An tollen Sachen ist, man kann halt auch noch die Datenbank auf ein In-Memory-File-System legen.

Jochen

Es gibt zum Beispiel mit Docker oder Docker Compose geht das sehr einfach.

Das ist eine gute Idee.

Jochen

Ja, und das macht die auch nochmal gleich deutlich schneller.

Jochen

Weil normalerweise kannst du das halt nur machen mit SQLite und SQLite will man vielleicht nicht verwenden, weil ist halt anders als Postgres oder was man dann.

Dominik

Ich wollte gerade sagen, kann man damit denn so PostCAD-Funktionalität testen?

Dominik

Wenn ich jetzt zum Beispiel, im Postgres habe ich jetzt so was wie Indexes bauen oder sowas und sagen wir so.

Jochen

Ja, ja, ja, das funktioniert alles.

Jochen

Es ist halt das drunterliegende Fallsystem, was dann halt nur noch im Hauptsprecher ist.

Jochen

Das ist immer schlecht.

Ronny

Ich muss ja gestehen, wir hatten ja erst geplant, das bei dir daheim zu machen und ich hatte gehofft, dass da zu viel das Buch herumliegt.

Ronny

Nicht an meinem Blick rein.

Jochen

Achso, nee, ich hab's nur elektronisch.

Jochen

Ich habe es nicht genau.

Jochen

Aber ja.

Okay.

Jochen

Lässt sich sicher sonst auch machen, irgendwie, muss man gucken.

Jochen

Ja, nee, ja, stimmt.

Jochen

Ja, ich bin inzwischen fast komplett umgestiegen auf irgendwie elektronische Bücher, weil, ja, praktisch.

Jochen

Und ich habe es nicht immer dabei.

Dominik

Der einzige Grund ist, dass du halt keinen Platz mehr im Regal.

Dominik

Alles voll, fällt schon alles raus.

Dominik

Doppeltreifach, kennt ihr kennt das auch?

Dominik

Meere Stapel an Bücherlagen irgendwie im Regal.

Jochen

Ja, ja, beim meisten Bücherregalen ist bei uns immer mindestens eine Lage noch dahinter.

Jochen

Ja, genau.

Jochen

Lass mal überlegen, was war denn da?

Jochen

Gab es sonst noch irgendwie interessante Dinge, in den Buch drin standen?

Jochen

Ja, es gibt dann noch irgendwie auch so grundsätzliche Dinge.

Jochen

Test parallelisieren bringt sehr viel.

Jochen

Migrationen bringen auch viel, wenn man die squasht.

Ronny

Oh ja.

Jochen

Das ist dann auch sowas, das sollte man vielleicht ab und zu mal machen.

Vor allem auch, wenn man so lustige Sachen hat wie RunPython, also dass man wirklich noch Code ausführt, das kann, ja, je nachdem, ich meine, man hat ja meist eine Testdatenbank, wo nicht so viele Datensätze drin sind, aber je nachdem, was man da für abgefahrene Dinge tut, kann das auch schon ein Downer sein.

Jochen

Ja.

Jochen

Ja, aber ansonsten glaube ich, ja, nee, muss man selber mal gucken.

Jochen

Ich meine, wenn man sich das Blog von Adam Johnson anguckt, da sind auch die meisten, also ich meine, das Buch ist, viele von den Sachen, die darin stehen, hat er auch schon mal irgendwie als Blogartikel irgendwie da an seinem Block gehabt.

Dominik

Der hat einfach gewagt, an seinen Blogartikel zu einem Buch zu verwurstern.

Dominik

Könnte man davon lernen.

Jochen

Ja, genau.

Jochen

Ansonsten, ich weiß nicht, gibt es noch irgendwelche Dinge, wir haben jetzt viel über Django geredet.

Jochen

Gibt es irgendwie Testgeschichten, die auch relevant wären, die jetzt nicht so sehr Django oder Webentwicklung betreffen, dass wir überlegen, ob ich irgendwas mit Data Science, also da ist es auch so, da macht man auch viel Tests, aber das ist auch alles sehr ähnlich.

Dominik

Alles Unit-Tests, die dann irgendwie die einzelnen Test Cases brauchen.

Ronny

Eine Sache, die ich noch ganz interessant finde, das geht wieder so ein bisschen Richtung 100% Test Coverage.

Ronny

Mich auch mit jemandem unterhalten und der meinte, er ist gar nicht so ein Fan von Unit-Tests.

Ronny

Natürlich braucht man die.

Ronny

Er meinte, der hat das so ein bisschen mit den drei Musketieren verglichen.

Ronny

Also Athos, der ist so ein bisschen langweilig, aber der gehört hat deshalb der Chef.

Ronny

Die brauchst du halt einfach, kannst du nicht ohne.

Ronny

Und was er halt viel cooler findet, sind halt eher Functional-Tests, also sprich Tests, die halt die Business-Logik testen.

Ronny

Also dass man halt so ein bisschen mehr High-Level-Sachen testet, um einfach sicherzustellen, dass keine Ahnung, wenn man halt irgendeine Logik hat, die irgendwas macht, also eine Rechnung erstellen oder irgendwas berechnen oder irgendeine Daten aggregieren oder sowas, dass die halt das tut, was man von ihr möchte.

Ronny

Und fand ich ganz lustig, weil meistens, wenn halt über das Testing gesprochen wird, dann werden halt Unit-Tests rauf und runter exerziert.

Ronny

Und dann wird auch immer wieder gesagt, so ja, dann gibt es natürlich die End-to-end-Tests, wo man dann das Frontend drin hat, wo man dann wieder in einer ganz Django-fernen Welt, oder was heißt Django-fern ist, es ist halt dann tangiert Django nicht direkt, sage ich mal.

Ronny

Wird natürlich dann irgendwie aufgerufen und genutzt, aber das ist dann ja auch bei Cypress dann JavaScript-Code und sowas.

Ronny

Und dass man diese Functional-Tests, die kann man halt auch problemlos im, also selbst wenn man Django Headless verwendet, also ohne das Django Forms, Views, Templates etc., kann man diese Functional-Tests halt problemlos bauen.

Ronny

Es ist natürlich meistens ein bisschen mehr Setup, weil man halt sich ein bisschen mehr Cases zusammenbauen muss, aber ich mache das eigentlich für alles, was ein bisschen aufwendiger oder größer und netter ist, mache ich das eigentlich immer, dass ich noch zwei, drei so Functional-Tests hinterher schiebe und wirklich einfach sage, ich baue mir so ein Case auf und gucke einfach so, hey, angenommen, ich habe jemanden, der, keine Ahnung, ne, ich habe eine Rechnung, enthalten die dies und jenes.

Ronny

Also dass man wirklich, klar, die Teile sind natürlich, die Unitests sind natürlich da, das braucht man natürlich, weil sonst findest du ja nie einen Fehler oder kannst nicht sicher sein, wenn du was kaputt gemacht hast.

Ronny

Aber diese High-Level-Tests oder Higher-Level-Tests, sage ich mal, die sind nicht richtig high, das finde ich schon ganz nett.

Ronny

Und das wird, finde ich, manchmal so ein bisschen übersehen, dass das halt auch geht und dass das auch einen sehr großen Mehrwert bringen kann.

Jochen

Naja, nee, durchaus.

Jochen

Ich weiß gar nicht, ob es da irgendwie so tolle Definitionen von, was ist ein Unit-Test, was ist ein Functional-Test, was ist die Demikation-Test.

Jochen

Keine Ahnung, wo weiß ich auch nicht.

Dominik

Oder das hast du gerade von den drei Musketieren gesprochen und er ist ein einziges Musketier erwähnt.

Ronny

Genau, also die Functional-Test ist Porthos, der coole, der Pirat.

Ronny

Ja.

Ronny

Und die Integration-Test ist dann Aramis, glaube ich, heißt der letzte.

Dominik

Die anderen beiden waren?

Dominik

Ja, stimmt, du hast ja schon.

Ronny

Also Artos, Porthos, Aramis und dann D'Artagnan gehört ja nicht so richtig dazu.

Ronny

Ich muss aber, nicht, der, der das Beispiel gebracht hat, mich jetzt hautweis durcheinander bringe, aber Arthus ist auf jeden Fall der langweilige Unit-Test.

Ronny

Dann Portos, glaube ich, war das coole, vielleicht waren das auch die End-to-End-Tests, das weiß ich nicht mehr genau.

Ronny

Ich glaube, also D'Artagnan oder Portos, weil die sind beide so, ne?

Ronny

Und genau, Aramis ist dann Integration-Test, sprich, wo man dann so externe APIs und sowas mit anspricht und so.

Ronny

Und das ist dann halt immer so ein bisschen, das ist zwar total cool und jeder mag den Charakter auch, aber der ist halt so ein bisschen schwierig, der ist dann irgendwie ständig verliebt und irgendwie Seelenkrise und so und das ist dann auch so mit den externen APIs.

Ronny

Das ist total cool, das zu haben, aber man hat halt auch irgendwie ziemlich viele Schare rein damit.

Ronny

Und ja.

Dominik

Der Wind kommt, der wird die Tests gerade haben.

Ronny

Ich glaube, das war Porthos, ist die End-to-End-Test, weil die halt ziemlich cool sind, weil du halt damit wirklich den kompletten Flow durchtesten kannst und diese Functional-Tests sind D'Artagnan, der gehört zum Team und der wird aber oft übersehen.

Ronny

Weil das heißt immer die drei Musketiere und nicht die vier.

Jochen

Ja, ja.

Dominik

Königin der Kunde oder sowas, ne?

Dominik

Die entscheidet dann tatsächlich, wie es mit dem weiterläuft.

Dominik

Mit den dreieinhalb, vier.

Dominik

Ja, fällt euch noch was einzutesten.

Dominik

Ich teste, glaube ich, noch gleich ein Wein.

Ja, genau.

Jochen

Ich meine, nö, ich glaube, wir sind eigentlich so halbwegs durchgekommen und so.

Dominik

Die erste Folge draußen war gar nicht so verkehrt.

Dominik

Also ich hoffe, ihr habt genervt mich jetzt im nächsten Mal.

Jochen

Was auf Phonex draus macht.

Jochen

Alles klar.

Ja, vielen

Ronny

Dank auf jeden Fall für die Einladung.

Dominik

Ja, vielen Dank, dass ihr auch schon wart.

Dominik

Sehr schön.

Ronny

Mein erster Podcast.

Ronny

Und ja, war echt cool, hat Spaß gemacht.

Dominik

Ja, schön, dass ihr alle reingeschaltet habt.

Dominik

Vielen Dank, dass ihr da wart.

Dominik

Schreibt uns auf Hallo.peisenpodcast.de und bleibt uns gewogen.

Dominik

Bis zum nächsten Mal.

Tschüss.

Tschüss.

Ciao.