Transcript: Tests

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

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

Dominik

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

Dominik

Hi.

Dominik

Hi Ronny, hallo.

Dominik

Und der Jochen natürlich auch.

Dominik

Ja, ja, ich bin dann auch da.

Dominik

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

Dominik

Und Ronny, erzähl doch mal was von dir. Möchte ich einmal kurz vorstellen.

Ronny

Ja, ich heiße Ronny Vidrilia, ich arbeite in Köln bei Amint Innovation.

Ronny

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

Ronny

Habe jetzt meine acht Jahre, die ich da bin, auch Großteils mit Backend-Arbeiten und Django verbracht, habe in Köln Wirtschaftsinformatik studiert, also eigentlich eher so ein Beraterstudiengang, aber ich hatte immer mehr Spaß eigentlich am entwickelnden Beraten, beziehungsweise Beratung mit Entwicklung zusammen.

Ronny

Kann ich ja gar nicht verstehen.

Ronny

Und genau, wir haben uns eigentlich kennengelernt, du warst Pei Cologne oder Düsseldorfer?

Dominik

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

Dominik

Hatten wir das nicht vorher schon?

Dominik

Ja, wir haben uns auf irgendeinem der Peikolons mal gefragt.

Jochen

Peikolons bestimmt, da haben wir uns bestimmt schon mal gesehen.

Ronny

Genau, und wie Dominik gerade schon gesagt hat, seit jetzt glaube ich einem 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 uns live kennenlernen wollt.

Jochen

Bis Corona all das verunmöglicht hat, sozusagen.

Jochen

Also na gut, es gibt halt das virtuelle Meetup.

Jochen

Und ja, genau.

Jochen

Das ist nicht mehr ganz das Gleiche.

Jochen

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

Jochen

Apropos live sehen.

Dominik

Wir haben heute tatsächlich eine Testfolge, die einen Test macht.

Dominik

Und zwar sind wir zum ersten Mal nicht im Wintergarten,

Dominik

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. Und das ist jetzt quasi das erste Mal live

Dominik

vor Ort draußen. Also entschuldige mir so ein bisschen

Dominik

die Hintergrundgeräusche. Das ist ein bisschen urbanes Leben.

Dominik

Genau.

Dominik

Ja, schreibt da gerne mal Feedback zu.

Jochen

Klingt das ganz schrecklich furchtbar? Oder kann man

Jochen

damit halbwegs leben? Ich meine, das ist natürlich angenehm.

Jochen

Also gerade wenn es warm ist, irgendwie eher draußen zu sitzen

Jochen

und irgendwie ein bisschen was Kühleres

Jochen

zu trinken, ist natürlich schon sehr viel angenehmer als

Jochen

jetzt. Dankeschön.

Jochen

Prost.

Jochen

Naja, hört sich ein bisschen zu fern an. Die Werte sind zu voll.

Jochen

Ja, aber eben wenn man in so einem kleinen Raum sitzt, also das ist ja immer das Problem mit der Akustik, man braucht entweder einen kleinen Raum, in dem viel Zeug ist, damit es halt nicht so hallt, weil Hall ist immer so der Feind von guter Akustik, oder halt Weite. Hier haben wir jetzt Weite und wir haben leider sogar ein bisschen Wind, vielleicht hört man den auch.

Jochen

Ja, auf jeden Fall, genau. Also wenn 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. Aber ja, ich bin mal gespannt, wie das funktioniert und wir haben ja auch ein Realist-Equipment, das wir nehmen 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 geht.

Dominik

Ja, aber du kannst gerne noch mal ein bisschen über die Gerätschaften erzählen, du machst das schon letztes Mal irgendwie.

Jochen

Naja, das ist jetzt einfach so ein Zoom H6, das ist halt so ein Field Recorder, das wird jetzt beworben. Das hat halt auch so XLR-Eingänge für Mikrofone, macht Phantomspeisung und dann 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 dran hä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 zur Zeit, glaube ich, die die meisten Audioqualität bietet für Geld, ist halt so ein Zoom H6 plus irgendwie diese HMC 660X oder C, keine Ahnung, Headsets, weil man kann an dem Zoom H6 nämlich auch 12 Volt Phantomspeisung einstellen.

Jochen

und muss nicht

Jochen

löten und braucht keinen Adapter

Jochen

oder so und die Dinger funktionieren einfach

Jochen

an dem Ding direkt, was halt bei den meisten

Jochen

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 dieser Hintergrund-Akustik. Also man hört ja

Dominik

manchmal den Wind rauschen, das Lachen der Gäste,

Dominik

die leise Musik.

Dominik

Ronny, Tests heute?

Dominik

Ja.

Jochen

Oder wollen wir zuerst irgendwie, gibt es irgendwelche News?

Jochen

News aus der Szene.

Dominik

Ja, also Dango 3.1 kam ja raus, ich weiß nicht,

Dominik

jetzt ist es tatsächlich final. Und Wagtail

Dominik

wurde auch schon auf Dango 3.1 gearbeitet,

Jochen

das habe ich auch noch mitbekommen. Ja, es gibt eine neue

Jochen

Wagtail-Version, wobei die, glaube ich,

Jochen

war nicht so weltbewegendes dabei. Ja doch, es geht jetzt

Jochen

mit Dango 3.1. Ach so, ja.

Dominik

Okay, gut. Denn ich habe direkt tatsächlich

Dominik

umgestellt. Du hast einen tollen Artikel

Dominik

geschrieben übrigens auch.

Jochen

Ja, das war, ich meine, das ist halt irgendwie so

Jochen

mehrere

Jochen

Probleme auf mit einer Klappe

Jochen

fliegen, erledigen

Jochen

halt sozusagen. Ja, wir schreiben auch noch gerade

Jochen

schreiben wir an so einen Artikel, deswegen habe ich

Jochen

den zuerst irgendwie

Jochen

zur Release von

Jochen

Django 3.1 halt sozusagen veröffentlicht

Jochen

und davor haben wir halt diese Asung-Folge

Jochen

gemacht, die halt... Kannst du Django News, Ronny?

Jochen

Ja. Ja, weil der erste

Ronny

Artikel war von ihm. Ich habe es auch gesehen, ich war

Ronny

ja, ich hatte ja schon

Ronny

intern vorher

Ronny

mitbekommen, dass du einen Artikel geschrieben hast.

Ronny

Nicht schlecht.

Jochen

Ja, was mich, also tatsächlich hat es

Jochen

Jochen

Dominik

wird gerade von einer Wespe bearbeitet und die kriegt

Dominik

gerade über sein Brillenglas.

Dominik

Jochen mag Insekten sehr gerne,

Dominik

wie ich schon mitbekommen durfte.

Dominik

Aber er bleibt relativ entspannt.

Jochen

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

Jochen

Finde ich.

Jochen

Das ist etwas beunruhigend. Na gut.

Jochen

Gab es doch diesen Song.

Jochen

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

Jochen

Ja, genau.

Jochen

Aber genau, was ich

Jochen

daran eigentlich ganz gut fand,

Jochen

ich weiß jetzt nicht, der Artikel, naja, ich habe irgendwann auch einfach

Jochen

mir gedacht, ich habe keinen Bock mehr weiterzumachen,

Jochen

jetzt reicht es. Aber er hat relativ

Jochen

viel Aufmerksamkeit, also mehr Aufmerksamkeit gekriegt,

Jochen

als ich gedacht hätte. Und ich

Jochen

glaube, das lag halt daran, dass einfach auch viel Arbeit

Jochen

drin steckt, fürchte ich. Ja, ich wollte gerade sagen,

Dominik

also ich habe ja irgendwie mal so angefangen damit

Dominik

erstmal, ne. Jochen hat mir so um die Ohren gehauen,

Dominik

das ist unglaublich. Dann meinte er so, nee, das geht gar nicht.

Dominik

Und hat dann irgendwie 15 oder 16 Seiten

Dominik

drangehängt, wie man es richtig macht. Ja, okay, danke, Jochen.

Dominik

Ja, aber ich wollte das

Jochen

eigentlich alles gar nicht. Aber na gut, also manchmal braucht man

Jochen

halt auch jemanden, da braucht man irgendwie so einen Anstoß, um das

Jochen

dann zu machen und den Handwänden damit. Und ja,

Jochen

gut, jetzt ist es draußen und gut.

Jochen

Also insofern, ja, also

Jochen

viel Arbeit in irgendwas stecken hilft.

Jochen

Ja, wenn das irgendjemand weiterhilft, keine Ahnung.

Jochen

Ja, genau.

Jochen

Ach, es gab noch eine neue

Jochen

Release-Kandidat

Jochen

für Python 3.9.

Jochen

Den ersten gibt es jetzt.

Jochen

Also, und Leute, die das

Jochen

verwenden, haben schon gesagt,

Jochen

es funktioniert eigentlich alles ganz fluffig.

Jochen

Was sind denn die Neuerungen von 3.9?

Jochen

Wir haben das bestimmt schon mal besprochen.

Jochen

Wir haben das bestimmt schon mal besprochen.

Jochen

Wir haben jetzt ja kein Recht an den hier.

Jochen

Wir können das nicht einfach nebenbei...

Jochen

Wir können das nicht einfach, weil so

Jochen

online recherchieren geht

Jochen

halt gerade eben nicht. Aber ansonsten

Jochen

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

Jochen

Nee, ne?

Jochen

Ist dir was eingefallen? Nein, außer

Jochen

Django 3.1,

Ronny

was ich jetzt auch schon nutze, funktioniert gut.

Dominik

Jason Fields sind super. Doch, mir fällt noch was ein, und zwar

Dominik

ist von Daniel Roy Fieldroy das

Dominik

Buch Two Scopes of Django

Dominik

in der Version 3, hat der gestern Abend

Dominik

seinen Twitch-Kanal hochgefahren,

Dominik

weil es jetzt offiziell Redaktion ist.

Jochen

Ah, okay, ich hatte es schon gekauft, aber

Jochen

immer die Updates nur gesehen, nur die dann nie,

Jochen

weil ich dachte, ach, ich warte auf die fertige Release.

Jochen

Wenn ich jetzt weiß, das Release ist super, dann hole ich mir mal

Dominik

den. Ganz genau, das war gestern

Dominik

Abend. Ah, sehr schön.

Dominik

Ja, nö,

Jochen

ansonsten, genau, können wir dann

Jochen

vielleicht direkt mit dem echten Thema

Jochen

einsteigen. Ja, wollen wir vielleicht noch kurz

Dominik

einen Überblick geben? Also ich glaube, wir reden einfach los, wie immer,

Dominik

über Tests und so ein bisschen mehr Tests und Tests

Dominik

und Tests und Tests und wir testen jetzt, ob der Test funktioniert

Dominik

mit den Tests. Mögt ihr Tests?

Dominik

Jochen?

Jochen

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

Jochen

Ich finde Tests total furchtbar.

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 immer gelächelt.

Jochen

Ich so, ah ja, die mit ihrem komischen statischen Dings da, Java und so und Testschreiben, höhö, das mache ich alles einfach mal so eben aus der Hand.

Jochen

Mein Code ist so perfekt, den braucht man gar nicht.

Jochen

Einfach keine Fehler machen, so einfach ist das.

Jochen

Genau, 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. Ich schreibe gerne 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 leckere Programme schreiben. Mit Tests geht das plötzlich. Und das ist halt, man kann halt sich quasi ausruhen. 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. Das ist halt einfach so.

Ronny

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

Ronny

Okay. Magst du Tests, Johnny?

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

Ronny

Django-Projekten, die jetzt schon Jahre laufen

Ronny

und ich weiß, wie mühsam

Ronny

das früher war, als wir noch keine

Ronny

Tests da drin hatten und wie

Ronny

unmöglich es war, irgendwelche Sachen anzufassen,

Ronny

ohne

Ronny

dass man nachher Stunden

Ronny

am besten tagelang irgendwie...

Ronny

Genau, vor allem dann so

Ronny

zerbrechliche Sachen, wie man hat dann

Ronny

zum Beispiel irgendwie eine Überstundenerfassung

Ronny

oder sowas gebaut und da dann irgendwie alle

Ronny

Sonderfälle irgendwie zu bedenken und durchzutesten

Ronny

manuell zu Fuß,

Ronny

vor allem, wenn du noch so Späße hast wie mit Daten

Ronny

und da musst du immer noch quasi in,

Ronny

also ohne, dass man irgendwie jetzt in einem Testumgebung

Ronny

ist, wo man das Datum einfach mocken kann,

Ronny

so in manuellen Testen

Ronny

das Datum dann irgendwie und dann so lustige

Ronny

Sachen wie Wochenenden und Feiertage.

Ronny

Dafür bin ich schon sehr, sehr

Ronny

froh, dass es Unit-Tests gibt und dass die so gut funktionieren.

Ronny

Ja.

Ronny

Ja, ich muss sagen, also ich mag

Dominik

Tests eigentlich gar nicht, aber sind in gewisser Weise,

Dominik

fand ich ja notwendig, aber ich habe erst mitbekommen,

Dominik

ich bin jetzt noch nicht so lange dabei, dass es eine große

Dominik

philosophische Debatte gibt zwischen Menschen, die gerade

Dominik

kronheimlich viele Testabdeckungen, also Coverage

Dominik

nennt man das ja, haben am liebsten

Dominik

150% des Codes sollen getestet

Dominik

werden und andere Leute sagen, ja, ist eigentlich

Dominik

völlig egal, einfach ein Integrationstest,

Dominik

ob überhaupt so die Permissions so sind, wie

Dominik

ich mir das vorstelle und dann, wenn halt was

Dominik

schmiedschlägt, dann schreibt man danach dafür einen Test,

Dominik

dass es nicht nochmal passiert.

Dominik

Irgendwie so dazwischen ist so

Dominik

die Wahrheit, ich weiß nicht, ob es sowas gibt,

Dominik

wie so manches Mal.

Dominik

Aber ich glaube auch,

Ronny

also ich meine, es gibt ja das

Ronny

berühmte Pareto-Prinzip, 80-20-Regel,

Ronny

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 einfach mal in die Hose gehen dürfen.

Dominik

es wird auch so starr. Also wenn du halt ganz, ganz,

Dominik

ganz viel testest, dann kannst du eigentlich

Dominik

ja nichts mehr ändern, ohne dass

Dominik

irgendein Test fehlschlägt. Ich meine, du merkst dann zwar, was dann

Dominik

fehlgeschlagen ist vielleicht, aber

Dominik

das macht einen doch sehr unbeweglich und

Dominik

du hast halt tatsächlich auch, wenn du refactoren willst,

Dominik

wie du eben sagtest, Ronny, das

Dominik

Problem, dass du ganz, ganz viele Sachen

Dominik

und die Teste anfassen musst, weil vielleicht auch die

Dominik

Tests refactored werden müssen dann.

Dominik

Ja, also ich würde auch denken, es kommt halt

Jochen

auf den Anwendungsfall an. Also wenn du halt irgendwie eine

Jochen

kleine Webseite hast, die irgendwas

Jochen

keine Ahnung, für dich und ein paar Freunde

Jochen

irgendwie macht, da braucht man vielleicht keine Tests,

Jochen

weil wenn irgendwas schief geht, dann fixt man das halt und

Jochen

es hat ja keinen gestört, dass es irgendwie schief gegangen ist.

Jochen

Steuerprogramm vom AKW

Jochen

bräuchte vielleicht ein paar mehr Tests.

Jochen

Genau, da würde man sich dann vielleicht freuen,

Jochen

wenn die bemerken, dass etwas schief läuft, bevor es

Jochen

irgendwie die ganze Region mit in den

Jochen

Abgrund reißt, aber genau.

Jochen

Und da braucht man halt vielleicht viele und gute Tests.

Jochen

Und ja, also

Jochen

ich meine, nur ein paar

Jochen

Integrationstests zu haben, ist ja auch schon mal

Jochen

auf jeden Fall besser, als keine Tests zu haben. Auch die fangen natürlich

Jochen

dann schon Sachen. Auf der anderen Seite

Jochen

ist es schwierig. Das mit den Metriken ist

Jochen

immer so eine Sache. Ich meine, es ist auf jeden Fall

Jochen

immer auch besser, irgendwas zu messen, als nichts zu messen

Jochen

und dass man irgendwas hat, worauf man optimieren kann.

Jochen

Aber gerade, wenn man jetzt so

Jochen

schlechte Tests schreibt, dann kriegt man

Jochen

mit denen oft eine gute Testabdeckung hin.

Jochen

Weil man hat dicke

Jochen

Integrationstests, die ganz viel

Jochen

Code aufrufen.

Jochen

Aber eigentlich sind die halt

Jochen

eher nicht so toll, weil die sind

Jochen

halt langsam und

Jochen

dann die

Jochen

sind auch schwer zu ändern, wenn man dann Code ändert

Jochen

und

Jochen

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

Jochen

Ich meine, die Brand-Coverage ist ja auch nochmal

Jochen

vielleicht so eine Geschichte, das geht jetzt übrigens mit der

Jochen

neuesten, mit der Version

Jochen

5 von Coverage, geht das auch, dass man halt

Jochen

dem sagen kann,

Jochen

sag mir doch mal, wie viele von den

Jochen

If-Verzweigungen, also es reicht

Jochen

nicht, dass das einmal drüber gelaufen ist, sondern

Jochen

auch, ob die tatsächlich

Jochen

beide Pfade genommen haben, ob irgendein

Jochen

Test getestet hat, ob beide Pfade genommen werden

Jochen

und dann sieht es halt

Jochen

schon anders aus. Und ich weiß, dass es Leute gibt,

Jochen

die dann sowas sagen wie, naja,

Jochen

das geht auch mit Coverage Leaders auch, dass man

Jochen

sagt, man kann auch zu jedem File

Jochen

angeben, welches andere File

Jochen

für die Abdeckung verantwortlich

Jochen

sein soll. Also wenn man jetzt zum Beispiel im Django-Projekt

Jochen

Models

Jochen

py-File hat, dann sagt man,

Jochen

okay, da

Jochen

soll die Abdeckung gewährleistet

Jochen

werden von Testmodels py

Jochen

und die Abdeckung, die

Jochen

daherkommt, dass das aus irgendwelchen anderen

Jochen

Integrationstests heraus auch

Jochen

aufgerufen wird, das zählt nicht.

Jochen

Weil ansonsten kannst du halt mit

Jochen

fetten Integrationstests deine Coverage hochbringen

Jochen

und, aber eigentlich ist das

Jochen

überhaupt nicht das, was du haben willst, sondern was du eigentlich haben willst,

Jochen

ist, dass du sicher sein kannst, wenn du jetzt was änderst,

Jochen

dass du tatsächlich

Jochen

nichts damit kaputt gemacht hast und

Jochen

das kriegst du gerade bei diesen dicken Tests

Jochen

ja gar nicht so richtig mit. Also außer

Jochen

du hast was wirklich Gravierendes kaputt gemacht.

Jochen

Ja.

Jochen

Ja, okay, wir sind durch mit Tests.

Jochen

Nee, nee. Ja, keine Ahnung, aber wie ist das denn praktisch? Wann habt ihr denn mit Testen angefangen? Ich glaube, ihr seid ja irgendwie, ihr macht ja bei euch ganz viel Django schon lange.

Jochen

Genau.

Jochen

Und habt ihr von Anfang an Tests verwendet?

Ronny

Tatsächlich nein. 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, ja, so Businesslösungen, also wie man irgendeinen speziellen Business Case halt digitalisieren kann.

Ronny

Das ist auch wegen dem Wirtschaftsinformatik-Hintergrund, weil das halt ein ganz gutes Match war. Und haben halt dann früher am Ende gesagt, okay, Tests schreiben dauert Zeit. Also das ist schon einige Jahre her, aber es war halt so. Ich meine, quasi die Idee ist genau das Gegenteil von TDD. Also sprich, du schreibst das bei deinem Code und danach schreibst du die Tests. Und das ist ja quasi ein Mehrwert für den Kunden, weil die Software dann besser funktioniert. Und haben dann halt sehr realistisch 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üsst ihr es ja trotzdem ganz machen und sparen wir Geld, weil wir die Tests nicht bezahlen. Und das war dann bei uns so ein gewisses Learning, bis wir dann einfach…

Ronny

Ich würde das ja den Kunden lernen lassen.

Ronny

Wenn der Kunde auf die Nase fällt

Ronny

und du kannst ihm das vorher erzählen

Ronny

und er bezahlt es halt nicht,

Ronny

dann fällt es halt auf die Nase.

Dominik

Also man steht halt da ein bisschen blöd da.

Dominik

Das ist schon richtig.

Dominik

Aber viele, die ich so mitbekommen habe,

Dominik

an kleineren Kunden vor allen Dingen,

Dominik

die dann sagten,

Dominik

naja, jetzt können wir es nicht leisten,

Dominik

den Test machen wir jetzt nicht.

Dominik

Die kamen dann irgendwann reumütig zurück.

Dominik

Ja, wir haben jetzt eine Software gebaut,

Dominik

es wurde kein Test geschrieben,

Dominik

es funktioniert alles nicht mehr.

Dominik

Wir haben irgendwas,

Dominik

vielleicht haben die selber irgendwas angepasst.

Dominik

Da konnte irgendjemand von den Menschen aus der Firma

Dominik

so ein bisschen Dango und hat dann irgendwas umgebaut

Dominik

und irgendwas kaputt gemacht oder irgendwas anderes,

Dominik

was ihm erst später aufgefallen ist.

Ronny

Ich muss sagen, also dafür,

Ronny

dass wir erst, also dass wir die

Ronny

ersten Jahre, als wir noch ganz klein waren,

Ronny

tatsächlich keinen Test geschrieben haben,

Ronny

haben die Sachen trotzdem überraschend gut funktioniert.

Ronny

Also es wundert mich rückblickend auch.

Ronny

Ihr seid alle so gut.

Ronny

Aber es ist echt überraschend.

Ronny

Also wenn ich heutzutage, wo ich das mit den

Ronny

Tests weiß, dann werde ich so schnell nervös,

Ronny

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. Und ja, seitdem machen wir das. Und ja, ich glaube, der…

Ronny

Habt ihr richtig so eine Struktur da drin?

Ronny

Also wir haben jetzt keinen Coding Guide in der Firma. Also ich meine, jeder kann es im Endeffekt machen, wie er möchte. Ich meine, natürlich haben wir halt diese typischen QA Schritte wie Code Review, Content Review und sowas. 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. Aber im Endeffekt gibt es da jetzt keine offizielle Guideline oder sowas, weil ich meine, wie es bei Python so schön heißt, we are all adults here.

Ronny

Ja, also jeder weiß ja, was er macht und die Akzeptanz ist auch da. Also das finde ich halt bei uns auch ganz cool, dass unsere, die Geschäftsführer sind halt auch Wirtschaftsinformatiker, also auch Techniker. Das heißt, wir hatten, wir haben bei uns nie das Problem, was man halt sonst, zum Beispiel mein Studentenjob, 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.

Ronny

weil Nicht-Techniker dann manchmal halt nicht den, ja, den Mehrwert sehen. Ja, 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 im Internen mittlerweile als Security-relevant. Also wenn es keine Tests gibt, dann ist ganz viel Sicherheitslücken da, man muss da sicherstellen, dass das nicht…

Jochen

Also, ja, ich bin mir nicht sicher, ob es da nicht inzwischen, also, ich glaube, wir hatten das Thema auch schon mal in der Projektmanagement-Episode, aber ob 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 gerne lieber mehr Geschwindigkeit.

Dominik

Die Musik hat sich übrigens gerade eben geändert, ich hoffe, ihr hört das nicht alle. Es war eben so schön entspannt und jetzt haben sie ein bisschen mehr Beats reingebracht.

Jochen

Ja, ich treffe das jetzt so ein bisschen

Jochen

durch die Nackt.

Jochen

Ja, also

Jochen

es kann ja sein, dass ich aus einer wirtschaftlichen

Jochen

Sicht sage,

Jochen

das, was die mir an Qualität liefern, das ist mir ehrlich gesagt

Jochen

zu hoch. Ich hätte gerne lieber

Jochen

weniger Qualität und dafür schneller.

Jochen

Und das hat den zusätzlichen

Jochen

Vorteil, dass wenn es dann schief geht, dann kann ich zu ihnen

Jochen

hingehen und mit ihnen schimpfen und sagen hier so

Jochen

das hat nicht richtig funktioniert,

Jochen

jetzt macht man noch schneller. Voll gut.

Jochen

Ja, ich muss ja nur ein bisschen besser sein als meine Konkurrenz

Jochen

und ein bisschen weniger zahlen für die Produktivität,

Jochen

die ich da irgendwie rausquetsche.

Jochen

Und dann schon läuft es bei mir

Jochen

besser als bei anderen. Ja, aber dann wäre das

Dominik

Problem bei der Entwicklerseite, weil dann kein

Dominik

Entwickler dürfte sich darauf einlassen, weil...

Jochen

Ja, aber ich glaube, Leute tun das dann

Jochen

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

Jochen

vielleicht auch als Agentur, die das dann

Jochen

komplett anbietet, eigentlich sagen,

Jochen

okay, nee, das ist das, was ich an Qualität...

Jochen

Also sozusagen, das ist eigentlich meine einzige Verantwortung,

Jochen

ist zu sagen, ich übe meine Profession kompetent aus.

Jochen

Und wie ich das mache, ist eigentlich meine Sache.

Jochen

Und ja, du kannst halt das nehmen oder nicht.

Jochen

Aber ich werde keine Einschnitte bei der Qualität machen,

Jochen

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 ich irgendwie damit,

Jochen

ja sozusagen auch mich selbst sabotiere.

Jochen

Ich meine, man wird dann ja auch schlechter,

Jochen

aber man lernt das dann ja.

Jochen

dass man halt rumschlampt und so.

Jochen

Und das ist eigentlich alles, das will man einfach alles gar nicht,

Jochen

sondern man möchte eigentlich mit weniger Zeit mehr hinbekommen.

Jochen

In der Umschlammschule, man lernt rumzuschlammen.

Dominik

Und Tests lösen das.

Ronny

Ja, ich meine, die Frage ist halt auch, was man für einen Anspruch hat

Ronny

oder was der Lebenszyklus der Software ist.

Ronny

Also als wir noch ganz klein waren, da haben wir dann öfters mal so Marketing-One-Pager gemacht,

Ronny

keine Ahnung, Kaugummi-Werbung und sowas.

Ronny

Das ist so ein Ding, da ist ein Gewinnspiel drin, das läuft genau für einen Monat

Ronny

und danach wird das Ding eingestampft und es braucht kein Mensch mehr.

Ronny

Ja gut, klar.

Ronny

Das sollte natürlich trotzdem funktionieren.

Dominik

Das merkt man ja beim Angucken schon fast, wenn man einfach Localhost aufmacht.

Ronny

Aber wenn man halt sagt, hey, das ist irgendwie jetzt vielleicht was, was firmenstrategisch relevant ist,

Ronny

da committet sich die Firma auch ein bisschen drauf, dass jetzt vielleicht auch über Jahre,

Ronny

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

Ronny

und die wir damals auch ohne Tests angefangen haben,

Ronny

ziehen wir die jetzt auch einfach nach.

Ronny

Weil ich meine, das ist halt einfach sinnvoll.

Ronny

Und man kann inzwischen …

Ronny

Macht ihr das dann auf eigene Kosten

Ronny

oder sagt dann der Kunde,

Dominik

ja okay, das ist jetzt hier in unserem Supportaufwand das …

Ronny

Wir machen das eigentlich so,

Ronny

dass wir jetzt halt sagen,

Ronny

die Tests sind ein elementarer Teil der Programmierung.

Ronny

Ja.

Ronny

Also das ist halt so,

Ronny

als ob man sagt …

Dominik

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

Ronny

Ja, ich würde sagen, wie gesagt,

Ronny

also ich bin jetzt auch keiner,

Ronny

der sagt, coverage 100 Prozent,

Ronny

weil wie gesagt, ich glaube einfach 80-20-Regel,

Ronny

ich glaube in 80% der Zeit,

Ronny

also 80% des Notwendigen

Ronny

kriegt man in 20% der Zeit hin.

Ronny

Und keine Ahnung, wenn ich da irgendwelche

Ronny

Django-Views oder sowas habe, die mehr oder weniger einfach

Ronny

getestete Django-Funktionalität ausführen,

Ronny

schreibe ich keinen Test dafür.

Ronny

Wenn ich irgendwelche Permissions drin habe, an denen ich selber rumgebastelt

Ronny

habe, okay, das ist was anderes,

Ronny

weil das kann echt mal schnell in die Hose gehen.

Ronny

Aber so Standard-Funktionalität

Ronny

teste ich jetzt auch nicht unbedingt.

Ronny

Also umso mehr es Richtung Zahlen und Details

Ronny

und Services geht, also weiter weg

Ronny

von dem Django-Standard.

Dominik

Übrigens interessant, wir reden gerade

Dominik

die ganze Zeit nur von Django, also Testing kann man ja

Dominik

auch außer von Django tun. Das stimmt. Aber wir

Dominik

machen halt einfach viel Django, deswegen reden wir jetzt erstmal weiter über

Dominik

Django-Tests. Aber ich meine, die meisten

Dominik

Sachen sind ja universal.

Dominik

Also ist ja jetzt nichts

Dominik

Django-spezifisches, also selbst bei

Dominik

Flask gibt es Views.

Dominik

Ja, und eigentlich hat man

Jochen

bei jedem Projekt, also es sei denn, man macht halt

Jochen

irgendwas, was halt tatsächlich nicht so einen

Jochen

wichtigen Anwendungsfall hat, aber

Jochen

eigentlich hat man immer Tests mit dabei.

Jochen

Und auch bei Django ist genau das, was man halt sonst verwendet,

Jochen

irgendwie üblich, nämlich entweder das

Jochen

eingebaute Unit-Tests-Modul

Jochen

aus der Standardbibliothek oder halt eben

Jochen

PyTest, wobei

Jochen

ich sagen würde so,

Jochen

wenn ich mich so umgucke bei den Projekten,

Jochen

in denen ich irgendwie beteiligt bin,

Jochen

ist die Mehrheit inzwischen auf PyTest

Jochen

und Unit-Test fühlt sich so ein bisschen an,

Jochen

als das sind immer so die etwas älteren Sachen

Jochen

und die etwas nicht so ganz gut gepflegten.

Jochen

Und ich meine, natürlich hat das irgendwie

Jochen

gewissen Charme, dass das...

Dominik

Vielleicht, erklär mir doch mal kurz, was denn überhaupt der Unterschied ist

Dominik

zwischen Unit-Testers und was PyTester neu herumbringt.

Dominik

Und es gibt auch einen Nose-Tester oder sowas.

Dominik

Ja, Nose

Jochen

war früher ein Test-Runner.

Jochen

Ich glaube, das ist inzwischen gar nicht mehr wirklich

Jochen

Main-Tent.

Jochen

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

Jochen

Ernsthaft? Okay.

Jochen

Vielleicht bist du ja auch Unit-Tester, ich weiß nicht.

Dominik

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

Dominik

Ja, keine Ahnung.

Jochen

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

Jochen

Also aus meiner Perspektive

Jochen

ist es, also

Jochen

Unit-Test ist irgendwie eine Portierung von

Jochen

JUnit und hat halt

Jochen

viele der Konzepte dort mitgebracht,

Jochen

die ja auch jetzt vielleicht gar nicht so schlecht sind, aber

Jochen

das passt halt in vielen Fällen nicht so

Jochen

richtig auf das, wie man in Python normalerweise

Jochen

programmiert. Was heißt das denn?

Dominik

Also was macht JUnit und warum

Dominik

ist das so anders als das? Ja, zum Beispiel

Jochen

einfach allein, dass die Methoden am CamelCase sind.

Jochen

Ja, okay. Dann,

Jochen

dass du halt

Jochen

Assert-Methoden hast auf dem Test,

Jochen

dass jeder Test eine Klasse sein muss.

Jochen

Das ist halt, also ich meine.

Jochen

Wie testet man überhaupt?

Dominik

Also man macht eine Testklasse und da setzt man quasi die Umgebung auf

Dominik

und dann prüft man, ob bestimmte Bedingungen erfüllt sind

Dominik

und dann baut man alles wieder auseinander.

Jochen

Ja, also wenn man jetzt so, wie Schreib- und Tests kommen,

Jochen

also da ist es halt, nennt man das so AAA, wie heißt das, Range?

Jochen

Ich glaube, wo ist das Intent, wenn man es braucht?

Jochen

Oder sowas und Assert oder weiß ich nicht.

Jochen

Also man arrangiert sozusagen die Dinge, die man halt, die Welt sozusagen so hinten, dass man testen kann.

Jochen

Dann ruft man halt die Funktion, die man testet, auf oder halt was auch immer man da testen möchte.

Jochen

Und dann guckt man hinterher, ist jetzt alles in sozusagen gefälliger Weise wieder drüber zerfallen.

Jochen

Und es ist so passiert, wie es hätte, wie ist der sozusagen Schornstein in die richtige Richtung,

Jochen

der Baum in die richtige Richtung umgefallen sozusagen nach dem, ja.

Jochen

Und das macht man halt

Jochen

bei Unit-Tests in der Klasse.

Dominik

Die Tastic-Testcase, ich glaube, Django-Testcase

Dominik

erbt auch von den Unit-Testcase, oder?

Jochen

Ja. Also es gibt bei Django

Jochen

vier Testcase-Klassen,

Jochen

aber ich glaube,

Jochen

die erben alle

Jochen

von Testcase, ja.

Jochen

Genau, bei PyTest ist es so,

Jochen

da können auch Tests einfach Funktionen sein

Jochen

und das ist halt nicht Camel-Case,

Jochen

sondern Snake-Case oder keine Ahnung,

Jochen

mit Underscores halt.

Jochen

Und man verwendet halt nicht

Jochen

Methoden auf dem Test, um zu testen,

Jochen

um zu asserten, sondern

Jochen

man benutzt einfach das Assert-Statement.

Jochen

Das macht PyTest ja jetzt auch dann.

Jochen

Das macht PyTest.

Jochen

Unitest macht das nicht.

Dominik

Also bei Unitest gibt es mal diese Assert-Equals, das hat mich immer so ein bisschen gewundert.

Jochen

Ja, genau, genau. Assert-Equals,

Jochen

super, super Beispiel, genau.

Jochen

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

Jochen

oder Assert-Equal? Ich glaube ohne S, oder?

Jochen

Ja, siehste,

Jochen

weiß ich jetzt auch gar nicht.

Jochen

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

Ronny

PyCharm zeigt mir immer an, dass, glaube ich, das mit S,

Ronny

das ist immer durchgestrichen wegen Deprecation.

Ronny

Ja.

Ronny

Assert-Equal.

Ronny

Eins von beiden ist deprecated, genau.

Jochen

Aber das ist halt so, das ist halt das Problem,

Jochen

das man bekommt, wenn man halt so Spezialkram macht.

Jochen

Ja, das versteht man auch nicht.

Dominik

Warum kann man nicht einfach die Python-implementierte Funktion

Dominik

Assert nehmen und dann die zwei Dinge direkt vergleichen,

Dominik

anstatt Assert-Equal hinzuschreiben und zwei Dinge

Dominik

in diesem Funktionsaufbruch zu gehen?

Dominik

Da passieren irgendwelche magischen Dinge im Hintergrund,

Dominik

wo ich gar nicht weiß, ob das so stimmt.

Jochen

Ja gut, wenn du sozusagen bestimmte Sachen

Jochen

mit einem gefällten Test machen willst oder so,

Jochen

dann kannst du das ja quasi gar nicht

Jochen

so richtig gut anders machen, oder?

Jochen

Ich weiß es nicht, vielleicht ist es auch einfach nur Geschmacksgeschichte.

Jochen

Wie ist das denn

Ronny

mit zum Beispiel den anderen Asserts,

Ronny

zum Beispiel AssertRaises?

Ronny

Kannst du das auch über das AssertStatement

Ronny

abbilden bei PyTest?

Ronny

Ja,

Ronny

aber es kann sein, dass man...

Dominik

Also wenn man jetzt Tests zwar accept Asserts und AddRaises...

Jochen

Nein, nein, aber es kann sein,

Jochen

also es ist auch ein ContextManager,

Jochen

es ist irgendwie With irgendwas, Raises,

Jochen

Aber ich glaube, man importiert da irgendwas

Jochen

dann aus PyTest. Also der Hintergrund ist

Ronny

ja einfach nur, dass falls jemand,

Ronny

falls eine Funktion Fehler werfen soll und man

Ronny

genau diesen Case testen möchte.

Jochen

Ja, also das gibt es auf jeden Fall.

Ronny

Ich muss gestehen, ich nutze auch das, was

Ronny

Django von Haus aus mitbringt.

Ronny

Ich habe da, ich habe einen Kollegen,

Ronny

der sehr auf PyTest schwert und meint, das ist ja alles

Ronny

viel besser und schneller. Ich habe das auch

Ronny

auf meiner Liste, dass ich mir das nochmal anschaue.

Ronny

Ja, es

Ronny

ist halt sehr convenient, wenn du halt in der

Ronny

Django-eigenen Welt bleibst, dann

Ronny

muss man halt wenig

Ronny

nachdenken. Von Jochen jetzt

Dominik

PyTest irgendwie gelernt.

Dominik

Modus hast du mal vier und da gibt es halt

Dominik

diese Features. Gibt es die auch so

Dominik

bei

Dominik

Unit-Tests ohne PyTest? Also ich dachte, das wäre

Dominik

so ein PyTest-exklusives Feature. Also in Django

Ronny

kannst du es laden. Also in Django gibt es

Ronny

in dieser Django-Test-Case-Klasse kannst du

Ronny

einfach

Ronny

ein Array mit Strings

Ronny

und diese Strings sucht er dann,

Ronny

der sucht dann nach

Ronny

Fixture.json-Dateien.

Dominik

Okay, aber ich mache tatsächlich Fixture.json und ich muss

Dominik

halt dann dadurch meine Sachen... Genau, aber das ist jetzt nur

Ronny

Django, das ist nicht Unit-Test. Also ich weiß nicht, wie

Ronny

ein Test das machen würde. Also ich kenne das

Dominik

als PyTest, dass ich tatsächlich meine Fixture-Funktionen baue

Dominik

in der Comptest und dann irgendwie

Dominik

meine Objekte schon so erzeuge,

Dominik

wie sie, glaube ich, im

Dominik

echten, realen Django-Leben

Dominik

dann auch wären.

Dominik

Und das hat vielleicht auch viele Vorteile,

Dominik

weil ich halt genau auf die Attribute und so weiter alles zugreifen kann

Dominik

und ich dann halt Factories nutzen kann, um die zu erzeugen

Dominik

und halt eben nicht nur irgendwie

Jochen

Fixtures? Also das macht man im Unit-Test

Jochen

auch. Also so Factory-Boy oder

Jochen

Factories, um halt

Jochen

aber, ja, aber diese Art,

Jochen

wie man in Pytest halt, dass man das

Jochen

quasi einfach magisch, dass man das halt

Jochen

in den Testaufruf

Jochen

mit reinschreibt halt, das man haben möchte und es ist

Jochen

dann halt einfach da. Das ist auch so natürlich

Jochen

ein bisschen magisch. Das gibt es im Unit-Test nicht.

Jochen

Da muss man es explizit machen.

Dominik

Okay, ja, aber das finde ich eigentlich relativ smart, weil das

Dominik

gefällt mir. Ich kann einfach meine Fixtures definieren pro

Dominik

App, die ich dann irgendwie entwickelt habe und

Dominik

dann kann ich die importieren in anderen Apps als

Dominik

Confest und habe dann alle Funktionalitäten

Dominik

nicht, da brauche ich irgendwie... Ich löse das halt über

Ronny

Vererbung, also ich habe halt dann einen Basetest, der

Ronny

dann halt für mein Projekt halt irgendwie die Rollen,

Ronny

die User, vielleicht

Ronny

irgendwie ein wichtiges Projekt oder irgendwas

Ronny

erstellt und dann halt

Ronny

pro App, dass ich dann halt,

Ronny

wenn ich das brauche, dann nochmal

Ronny

eine Ebene dazwischen ziehe und dass dann jeder

Ronny

von den richtigen Tests, also

Ronny

die Endtests,

Ronny

dass die halt dann von dieser Klasse erben

Ronny

und da ist dann das dementsprechende Setup

Ronny

im Setup drin.

Ronny

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

Jochen

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

Jochen

Und was ich jetzt aber inzwischen so mache, ist, ich erbe von Testcase oder halt Transaction Testcase 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 Testcases.

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. 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 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 das funktioniert bisher.

Dominik

dynamische Importe klingen zu müssen.

Dominik

Ja, naja.

Jochen

Ich meine, manchmal muss man auch Sachen ausprobieren und manchmal sind sie

Jochen

super. Wenn man stellt irgendwann fest,

Jochen

war nicht so gut, muss man es wieder ändern.

Jochen

Aber es ist halt, ja.

Jochen

Ja.

Jochen

Was ja fast

Jochen

schon ein Stichwort wäre zum... Ja, dynamische,

Ronny

genau. Zum Sachen ausprobieren.

Ronny

Ich hatte

Ronny

vor einiger Zeit

Ronny

habe ich eine Django-Software

Ronny

gebaut. Da ging es um

Ronny

Projektstundenerfassung und Zeiterfassung.

Ronny

Und alles, was irgendwie mit Daten, also Datums, also mit Zeit zu tun hat, ist ja schon relativ kompliziert. Und da ging es dann darum, dass halt eine Zeiterfassung abgebildet werden soll.

Ronny

Also Mitarbeiter können sich an und aus checken 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, zum Beispiel Weihnachten und Silvester, also Heiligabend und Silvester sind halbe Feiertage, das heißt man hat, also wird je nach Firma anders ausgelegt, aber in dem Fall war das dann vier Stunden das normale Arbeitszeit wäre.

Ronny

Und die ganze Logik lief und hat auch gut funktioniert. Da habe ich immer gemerkt, wenn ich irgendwas refactoren möchte, ich hatte jedes Mal die Hosen voll und habe mich halt wirklich nicht daran getraut, weil das halt einfach so unmöglich zu testen ist. Und habe dann erst mal angefangen, ganz normal zu Fuß Tests zu schreiben, also einfach zu schauen.

Ronny

Und ich habe, ich setze den und den Case auf, also keine Ahnung, Mitarbeiter arbeitet normal fünf Tage die Woche, also diese ganzen Datenbankobjekte erstellt und habe gemerkt, da komme ich echt irgendwie nicht weit. Das sind so viele Fälle und auch immer diese ganzen Variationen. Was ist denn, wenn jemand zum Beispiel Teilzeit arbeitet und dann kommt ein Feiertag und dann vielleicht noch ein halber Feiertag und ja.

Dominik

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

Ronny

Genau. 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. Und diese Objekte, die sind zum Beispiel, der eine Mitarbeiter arbeitet ganz normal acht Stunden und macht so lange Pause. So, das ist ein Objekt, das da reingehen kann. Der andere ist zum Beispiel ein anderer Mitarbeiter, der ist nur halbtags da und der arbeitet diese, seine halbtags, also 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 Kindklasse 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.1.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. 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. Und das heißt, für jeden Testfall, den es gibt, also alle komischen Kombinationen, kann ich einfach diese Objekte befüllen. 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 auch ziemlich lange dafür gebraucht. 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? Weil ich habe ja den Code nochmal teilweise nachgebaut. 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 Testcase hat?

Ronny

Und tatsächlich, glaube ich, 80 Prozent der fehlgeschlagenen Tests

Ronny

lagen daran, dass ich in der Nachimplementierung einen Bug hatte.

Ronny

Ich glaube, ich hatte eine richtige Implementierung,

Ronny

die ich damals noch vor vielen, vielen Jahren ohne Tests geschrieben habe.

Ronny

Da war tatsächlich auch kein Fehler mehr drin,

Ronny

weil es halt schon so lange lief und die alle ausgemerzt waren.

Ronny

Ich war mir sehr unsicher,

Ronny

ob das überhaupt eine gute Idee ist, das so zu machen,

Ronny

wegen der offensichtlichen Nachteile, die es halt gibt.

Ronny

Also dauert lang und wer kontrolliert das nachher?

Ronny

Oder wie kontrolliert man das?

Ronny

Und habe 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 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.

Ronny

Lass uns beide programmieren und das eine ist halt das Testsystem vom anderen.

Ronny

Ja, 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,

Jochen

dass sie halt irgendwie wahnsinnig viele Tests machen, dann Stresstests irgendwie für neue Designs von ihren Chips und so

Jochen

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,

Jochen

dann ist halt schlecht, wenn das irgendwie schiefgegangen

Jochen

ist, weil man kann man auch nicht

Jochen

mehr ändern, kann man halt hinterher nicht mehr fixen

Jochen

während, naja, Code kann man halt noch

Jochen

ändern, das heißt so

Jochen

furchtbar intensiv muss man es vielleicht auch nicht testen

Jochen

aber natürlich

Jochen

ist es halt immer noch blöd, wenn Sachen schief gehen

Jochen

daher, ja, irgendwo ist da ein Sweet Spot

Jochen

aber ist halt nicht so ganz klar, wo

Dominik

testen ist ja schon ein bisschen

Dominik

dunkle Magie auch, also ich hatte

Dominik

das Problem, ich habe einen Test geschrieben

Dominik

dann habe ich die Tests

Dominik

ausgeführt, dann

Dominik

war kein Problem mehr, alles richtig, dann habe ich es nochmal

Dominik

ausgeführt, einfach ohne irgendwas zu ändern und dann

Dominik

schlug der Test fehl.

Dominik

Was ist denn das jetzt?

Dominik

Habe ich nochmal ausgeführt, dann ging es wieder,

Dominik

dann habe ich nochmal ausgeführt, dann ging es wieder, dann habe ich nochmal ausgeführt,

Dominik

dann schlug es wieder fehl. Dann hat mir jemand erklärt,

Dominik

ich habe einen non-deterministischen Test geschrieben,

Dominik

also einen Test, der in Ausgang ungewiss ist.

Dominik

Und ich habe überhaupt nicht verstanden, von welchen

Dominik

Zeiteffekten, von welchen

Dominik

Gegebenheiten das hätte kommen können.

Dominik

Das fand ich total schwierig zu begreifen,

Dominik

warum der gleiche Test in

Dominik

mehrfacher Ausführung mal B-Check, mal nicht.

Jochen

Ja, das Ganze gibt es dann natürlich auch irgendwie in sozusagen Reihenfolgenabhängigkeiten, das ist wahrscheinlich somit das Häufigste, dass man quasi zwei Tests hatte und da, ohne dass man das jetzt beim Schreiben vielleicht so gedacht hätte, man macht es halt einfach so, weil das dann halt logisch hinterher passiert oder so, man macht zuerst das, dann testet man das nächste und verändert aber den State jetzt bei einem Django-Modell irgendwie so, dass der zweite Test halt funktioniert 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. Man muss halt eigentlich sicherstellen, dass die ganzen Tests isoliert funktionieren, weil ansonsten kann man nämlich...

Ronny

Da gibt es ein sehr schönes Beispiel, das ist auch ganz brandaktuell zu Django 3.1. Die haben da jetzt nämlich einen Bug gefixt, der schon, glaube ich, seit 2012 drin war, mit dem Order-By beim Aggregate. Ich weiß nicht, ob euch das mal über den Weg gelaufen ist.

Ronny

Ist mir am Anfang, als ich neu mit Junko war, immer wieder mal passiert, dass, ich bin mir nicht mehr so 100% sicher, ich habe es länger nicht mehr selber erlebt, aber wenn man eine Aggregierung oder ein Annotate macht und dann Order Buy, beziehungsweise nein, wenn das Model selbst in der Meta-Option, in Order Buy, der so eine standardmäßige Notierung aktiv hat, dann gab es Bugs.

Ronny

dann hat das ORM teilweise komische oder falsche Sachen zurückgegeben.

Ronny

Das ist wie der Bug, das Ticket ist 3000 Jahre alt

Ronny

und die haben das jetzt tatsächlich repariert

Ronny

und das führt dazu, dass die Lösung war einfach,

Ronny

das ist halt aus Gründen, funktioniert es nicht

Ronny

und das heißt, wenn du aggregierst oder annotierst,

Ronny

dann wird dieses Order By im Model Meter ignoriert.

Ronny

Das heißt, bei meinen Cases, wo ich das gemacht hatte,

Ronny

habe ich in meinen Test Cases natürlich erwartet,

Ronny

dass die Sachen sortiert kommen, weil ich ja wusste,

Ronny

meine Projektliste oder meine Mitarbeiterliste,

Ronny

die wird ja

Ronny

übers Model sortiert. Hatte ich natürlich

Ronny

kein explizites Order bei gemacht.

Ronny

Plötzlich schlagen irgendwelche Tests fehl, nachdem ich auf

Ronny

Django 3.1 hochgegangen bin, weil die Reihenfolge anders ist.

Ronny

Weil es gibt jetzt kein Order bei mir. Es gibt halt irgendeine

Ronny

Reihenfolge, die die Datenbank zurückgibt.

Ronny

Okay, ja, das ist

Dominik

aufgefallen, ja. Ziemlich abgefallen.

Dominik

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

Ronny

Ich habe Django hochgezogen, was ist denn da los?

Ronny

Bis mir dann ein

Ronny

lieber Kollege sagte, schau mal,

Ronny

Such mal nach Order-By in den...

Ronny

Also Order-By ist echt rausgeflogen?

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,

Ronny

dass es halt nicht mehr genommen wird.

Ronny

Du kannst es manuell dahinter schreiben, dann funktioniert es.

Ronny

Aber du musst es halt manuell machen.

Ronny

Aber in der Meta-Klasse geht es nicht mehr?

Ronny

Immer, außer du machst Annotated Aggregate.

Ronny

Ah, okay.

Ronny

Da gibt es auch einen eigenen Eintrag dazu.

Ronny

Das ist auch irgendwo im Ticket nochmal festgehalten und verlinkt etc.

Ronny

Ich bin da jetzt auch nicht 100% in Details drin.

Ronny

Ich bin halt nur drüber gestolpert.

Ronny

Weil das war auch genau das mit der Reihenfolge. Plötzlich war mein Element, dass ich an Stelle 1 erwarte, an Stelle 2 und umgekehrt. Und wenn man halt die Tests so gebaut hat, dass der halt die Reihenfolge explizit erwartet, weil ich ja wusste, dass er damals noch sortiert war, dann steht man da plötzlich.

Jochen

Ja, und das mit der Reihenfolge von Tests ist halt…

Jochen

Und das 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. 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. Also man kann auf jeden Fall, und ich weiß auch nicht, das ist bei PyTest und bei Unitest anders, aber man kann halt mit einer bestimmten Option sagen, so für die Tests mal eine umgekehrte Reihenfolge aus. Wenn das schief geht, dann weiß man schon, dass man ein Problem hat. Oder für die mal eine zufällige Reihenfolge aus, dann muss man es halt wahrscheinlich ein paar Mal ausführen und wenn es dann funktioniert hat, hat man vielleicht Glück 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. Und das ist natürlich auch sehr nett, weil ich meine, ja.

Dominik

Und wir haben heute nicht schon ganz, ganz viele CPUs zur Verfügung.

Dominik

Genau, ja.

Jochen

Ja, es gibt sogar noch ein Ding, Xist oder so,

Jochen

mit dem kann man dann halt Sachen noch auf mehrere Rechner verteilen.

Jochen

Aber ein Rechner ist ja schon mal nicht so schlecht.

Jochen

Wenn man da so acht Cores hat,

Jochen

dann geht das schon mal deutlich schneller,

Jochen

wenn man die alle verwenden kann.

Jochen

Aber wenn man eine große Basis,

Jochen

ein Projekt hat mit vielen Tests, Testbasis,

Jochen

und die sind nicht unabhängig voneinander,

Jochen

dann kann man das mit dem Parallelisieren eigentlich fast vergessen,

Jochen

weil das kriegst du halt nicht so einfach umgestellt.

Jochen

Ja.

Jochen

Ja, genau. Wie ist das? Habt ihr da häufig Probleme mit langlaufenden Tests?

Dominik

Wie viele Tests habt ihr denn überhaupt? Bei großen Projekten muss das ja in die Zehntausende gehen.

Ronny

Ja, tatsächlich. Also bei unseren langlaufendsten Projekten bin ich nicht mehr aktiv dabei.

Ronny

Also bin ich nicht im Dev-Team, das heißt, ich habe da jetzt keine Zahlen, aber ich weiß, dass die Pipelines da teilweise auch Stunden brauchen. Also einfach, weil, also die haben da inzwischen noch Optimierung gemacht.

Dominik

Das kommt ja gar nicht nach jedem Feature Release, wenn man da irgendwie Agile irgendwie dran sitzt.

Ronny

Natürlich haben wir da jetzt auch Lösungen irgendwie gebaut, dass halt manche Tests laufen dann irgendwie nicht mehr pro Commit oder irgendwie Sachen werden lokal getestet, weil es lokal doch manchmal ein bisschen schneller geht oder es ist eine Parallelisierung.

Ronny

Bei dem längsten Projekt, das ich betreue, das ist eine Internet-Software, da habe ich jetzt die 1200, glaube ich, geknackt. Ja, und das ist ganz lustig. Ich hatte da, ja, das waren ungefähr, ja, also in der Pipeline lief das immer so 25 Minuten, die Tests.

Ronny

vertretbar ist, aber es hat mich trotzdem immer ein bisschen geärgert

Ronny

und

Ronny

habe ich irgendwann mal einen Artikel

Ronny

auf Medium gefunden, wo jemand meinte,

Ronny

ja, wenn man die Tests ganz

Ronny

klassisch mit Setup geschrieben hat, dann

Ronny

das geht besser,

Ronny

weil bei dem Setup, also wir reden jetzt wieder vom

Ronny

Django-Unit-Test-Welt und ich glaube, das ist insgesamt

Ronny

Unit-Test-Welt, beim Setup ist es halt so,

Ronny

dass halt vor jeder Testmethode alles, was im Setup

Ronny

steht, ausgeführt wird und es gibt

Ronny

eine Klassenmethode,

Ronny

die halt quasi nur einmal pro

Ronny

Testklasse ausgeführt ist, also hat eine Testklasse

Ronny

jetzt hier einen Test, dann wird es halt nur einmal ausgeführt, bei Setup

Ronny

wird es jedes Mal ausgeführt und Django hat halt

Ronny

so eine magische Funktion, das nennt sich

Ronny

SetupTestData und

Ronny

da wird es

Ronny

in eine Transaction

Ronny

gerappt, das heißt

Ronny

die Daten werden nur einmal ausgeführt,

Ronny

also es ist auch eine ClassMethod, also es ist nur einmal pro Klasse,

Ronny

aber die kann man quasi recyceln,

Ronny

also bei jedem

Ronny

Testaufbau, das heißt man hat so ein bisschen das Beste von beiden

Ronny

Welten. Ich habe das dann gelesen, fand das cool

Ronny

und dachte, ach mal gucken, was das bringt, habe gedacht,

Ronny

1000 Tests, das dauert bestimmt ewig,

Ronny

Aber tatsächlich ging es relativ fix. Nach zwei, drei Stunden war ich fertig. Und ja, habe die Pipeline von 25 Minuten auf fünf Minuten gedrückt für die Tests. Und das hat mich halt echt richtig, richtig, richtig überrascht, dass das so viel bringt tatsächlich. Ich meine, klar, wenn man überlegt, dass jede Testklasse vielleicht 20 Tests hat, dann, ja, fünf Tage schneller.

Dominik

Da gab es doch jetzt auch genau dieses Buch dazu,

Dominik

wie man Django-Tests...

Jochen

Ja, von Adam Johnson, jetzt irgendwann im Mai rausgekommen.

Jochen

Speed Up Your Django-Tests

Jochen

heißt das irgendwie.

Jochen

Genau, und

Jochen

da, ich habe es nicht ganz

Jochen

komplett gelesen, ich habe so ein bisschen, also ich habe es

Jochen

auch so ein bisschen quer gelesen schon, aber noch nicht so.

Jochen

Ja, da stehen viele, viele

Jochen

coole Sachen drin, also auch ganz...

Dominik

Das sagt der Jochen erst wieder, weil der ist Glossar noch nicht bis zum letzten Mal.

Dominik

Nein, ich habe es wirklich, ich habe

Jochen

ein ganzes Kapitel noch gar nicht gelesen.

Jochen

Aber da stehen auch viele interessante Dinge drin.

Jochen

Also zum Beispiel, dass man halt, ja, also auch im Vergleich Unitest, PyTest zum Beispiel,

Jochen

der sagt da halt auch, ja, PyTest ist eigentlich schon cooler.

Jochen

Bei vielen Kapiteln steht dran, so, das ist jetzt nur für Unitest 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 PyTest wie Unitest geben ja aus, wie lang sie laufen.

Jochen

Aber Unitest ist so ein bisschen gemogelt.

Jochen

Also viele Sachen kommen da nicht mit rein, da muss man halt, also auf dem Unix schreibt man halt Time davor, um halt zu sehen, wie lange hat es denn wirklich gedauert und tatsächlich die Real Time, wie lange hat das gedauert, ist halt das, was einen eigentlich interessiert und da ist PyTest schon normalerweise ein Stück schneller und bei der reporteten Zeit ist es relativ ähnlich, aber das liegt halt daran, dass PyTest einfach mehr Sachen dazu zählt, zudem, dass halt jetzt so lange hat der Test gedauert.

Jochen

Ja, also was er empfiehlt, was man halt am Anfang machen kann, ist, also man sollte 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 Pytest geht das einfach so mit Minus-Minus-Durations und dann eine Zahl und dann kriegt man halt die Zahl langsamsten Tests einfach am Schluss ausgegeben und bei Unit-Tests muss man halt irgendwie Django-Slow-Tests installieren oder so.

Jochen

Aber damit geht das dann auch und dann den Test-Runner ersetzen und dann kriegt man die halt auch ausgegeben und dann kann man halt bei den Tests halt mit einem Profiler nachgucken, was macht die eigentlich so langsam 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 diverse Tools, mit denen man sich dann, man kann ein C-Profile, kann man Ausgaben an Zeugen, wie man sich dann gucken kann, mit K-Cache-Grind oder, naja gut, muss man sich, da 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 mal so ein Standard, weil man erzeugt halt viele User und so.

Jochen

Und die echten Passwort-Hash-Algorithmen sind natürlich extra so designt, dass sie möglichst langsam sind,

Jochen

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

Jochen

möchte, möchte man nicht. Man möchte es halt aber eher

Jochen

schnell haben. Und dann, wenn man dann den MD5

Jochen

Hasher nimmt oder so, der ist halt nicht sicher, aber

Jochen

der ist halt egal.

Jochen

Bei der Test ist es halt egal, weil da kennt man die Passwörter

Jochen

ja eh, die man da hasht. Das würde man dann

Ronny

über eine Mock-Funktion wahrscheinlich machen, oder?

Jochen

Nee, das kann man einstellen. Das ist ein Setting.

Dominik

Du kannst die Middleware einfach in den Settings testen.

Dominik

Kannst du die Middleware dann einfach...

Jochen

Nee, das ist keine Middleware. Du kannst den Passwort

Jochen

Hasher setzen. Ja, okay.

Jochen

In den Settings. Du sagst dann halt nicht

Jochen

Passwort Hasher

Jochen

irgendwas von den, importierst halt

Jochen

deinen MD5-Password-Hasher oder schreibst halt

Jochen

den String zu dem

Jochen

Hasher einfach in die Config rein.

Ronny

Fertig. Ich meine, rein theoretisch braucht man auch gar keinen

Ronny

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

Ronny

Ja. Ja.

Jochen

Ja, keine Ahnung. Ich weiß nicht, es wird halt empfohlen,

Jochen

den MD5-Dings zu nehmen. Keine Ahnung, warum.

Jochen

Vielleicht hat das auch noch irgendwelche Seiteneffekte. Ich weiß es nicht genau.

Jochen

Wenn man jetzt da sagt, gar nichts, ob das irgendwas

Jochen

ändert. Ich weiß es nicht.

Jochen

Auch noch nicht gemacht. Keine Ahnung.

Jochen

Genau, das war so

Jochen

das ist so das Erste, was er empfiehlt.

Jochen

Dann sagt er sowas wie

Jochen

ja, irgendwie

Jochen

die, vor allen Tests wird irgendwie

Jochen

die Datenbank serialisiert.

Jochen

Man kann jetzt an den Datenbank-String ranschreiben,

Jochen

also für die Test-Datenbank

Jochen

serializable

Jochen

Doppelpunkt false oder so, auch eine Config-Option

Jochen

und dann wird das halt nicht gemacht.

Jochen

Man braucht das eigentlich fast nie. Es gibt ganz selten

Jochen

Testfälle, die sowas benötigen, aber

Jochen

eigentlich braucht man das nicht und

Jochen

macht auch Sachen schneller.

Jochen

Und dann, was war da noch drin? Also solche Dinge, wie man kann, das kannte ich gar nicht. Also das war mir neu. Ich habe tatsächlich, oder ich weiß nicht, wie du das machst mit Files, wenn du halt irgendwelche Bilddaten oder so testest oder so, da 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 Dinger geschrieben, nicht Clean-up-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-Root wieder aufgeräumt oder so.

Jochen

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

Jochen

Aber auf jeden Fall habe ich da halt irgendwie

Jochen

Aufwand reingesteckt und dachte so, das war ätzend.

Jochen

Und es gibt

Jochen

DJ-In-Memory-Storage, heißt das Paket,

Jochen

glaube ich. Und da kann man

Jochen

das Default-Storage

Jochen

ersetzen durch halt In-Memory-Storage.

Jochen

Und dann wird überhaupt nichts gespeichert.

Jochen

Und das ist halt viel schneller, weil es ist halt In-Memory.

Jochen

Es funktioniert halt genauso, aber

Jochen

es landet hinterher gar nichts auf der Platte.

Jochen

Und wenn man viel mit Files macht,

Jochen

dann ist es halt sofort deutlich schneller.

Jochen

Ja,

Jochen

Das fand ich echt gut.

Jochen

Das ist sehr praktisch.

Jochen

Dann gab es noch so

Jochen

Celery-Optimierungen. Da kann man auch

Jochen

ein Memory-Backend verwenden.

Jochen

Und naja, man muss halt

Jochen

gucken, dass man halt

Jochen

Always-Eager auf True setzt und

Jochen

auch noch irgendwas anderes, weiß ich nicht mehr genau.

Jochen

Ja, sowieso

Jochen

diese ganzen Async-Task-Dinger.

Jochen

Da gibt es dann halt Jungle-Queue.

Jochen

Das will ich mir mal angucken. Celery habe ich

Jochen

letztens wieder. Ah, Celery!

Jochen

Ja, genau.

Jochen

euch vielleicht auch, mich hat es auf jeden Fall

Jochen

vor ein paar Tagen ein bisschen mal wieder

Jochen

als ich irgendwie

Jochen

dachte so, irgendwie

Jochen

seltsam ruhig hier so alles

Jochen

irgendwie, passiert da zu wenig

Jochen

auf dem Produktionssystem, wie kommt denn das

Jochen

und ich hatte gerade irgendwie released

Jochen

und guckte dann halt so in die Logfile und denke so

Jochen

was ist mit den ganzen Sanitars

Jochen

warum, wie, wo sind die

Jochen

wieso, was

Jochen

warum werden da keine Sanitars mehr ausgeführt

Jochen

und dann habt ihr so ein bisschen gegoogelt

Jochen

und dann ja, ich glaube 4.4.7 war das

Jochen

oder so, hat irgendeine Regression,

Jochen

böse Regression drin gehabt, dass halt die

Jochen

Celery Broker URL

Jochen

oder so aus den Settings nicht mehr benutzt wird.

Jochen

Und ja,

Jochen

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

Jochen

Es dürften viele gewesen sein.

Jochen

Ja, ein netter Change, ja.

Jochen

Ja, und dann habe ich wieder

Jochen

Downgraded auf 4.4.6 oder sowas und dann war es wieder okay.

Jochen

Aber so, wow, okay.

Jochen

Das war schon, hm, naja.

Jochen

Ich muss mir mal Jungle Q angucken.

Jochen

Eine Sache,

Jochen

die eigentlich

Ronny

total selbstverständlich ist,

Ronny

die ich aber für mich persönlich erst relativ spät

Ronny

erkannt habe, ist,

Ronny

wenn man, also man hat

Ronny

eine Funktion, also man hat einen Service, man hat

Ronny

eine höherlevelige Funktion,

Ronny

die man testen möchte. Und darunter laufen

Ronny

auch andere Sachen, zum Beispiel, es können jetzt API-Calls

Ronny

sein, da kam ich jetzt gerade drauf, wegen diesen externen

Ronny

Sachen mit den Files, aber auch andere Sachen,

Ronny

die tendenziell auch länger laufen.

Ronny

Und wenn man den Aufruf der unterliegenden Funktion einfach mockt, dann spart man natürlich einen ganzen Laufen Zeit, weil der halt dann nicht versucht, eine API anzusprechen, weil man irgendwie die API mocken muss oder keine Ahnung was, sondern man 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, einmal musst du ganz kurz erklären, was überhaupt Services sind, vielleicht für alle Menschen, die das noch nicht so benutzt haben.

Ronny

Okay. Also Django hat von sich aus ja keinen, bringt da keinen Pattern mit, wo man Logik hinpackt. Ja, es gibt Manager für Datenbank-Querys, 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.

Ronny

U-Tilt, Helpers.

Jochen

Nee, U-Tilt, immer wenn du

Jochen

ein Modul hast, das U-Tilt heißt.

Jochen

Das ist schon so ein...

Jochen

Tatsächlich auf der

Ronny

Kopenhagener DjangoCon letztes Jahr.

Dominik

Jetzt muss ich meine ganze Applikation

Dominik

refactoren, das weißt du.

Jochen

Ich weiß, ich habe selber solche,

Jochen

aber eigentlich ist das keine gute Idee.

Jochen

Weil das Problem ist halt,

Jochen

naja, was sagt dir das, wenn du

Jochen

bei irgendjemandem siehst, da liegt halt ein U-Tilt-Modul

Jochen

rum, was ist da drin?

Jochen

Ja, das ist wirklich Unsinn.

Jochen

Ja, weißt du halt nicht.

Jochen

Aber das ist eigentlich gar nicht so gut, wenn du da zack rumliegst und weißt nicht, was das ist.

Ronny

Tatsächlich gab es da auch einen Vortrag auf der letzten JungleCon in Kopenhagen,

Ronny

wo dann auch ein paar Franzosen, glaube ich, drüber geredet haben,

Ronny

dass sie halt das Konzept vermissen, dass das nicht offiziell in der Doku drinsteht.

Ronny

Macht das so.

Ronny

Weil es halt sehr viele Leute so machen, dass man einfach eine Klasse anlegt,

Ronny

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

dann auch, ich meine, das ist halt so eine Art

Ronny

Best Practice, das ist halt kein offizielles Django-Pattern, aber

Ronny

ich glaube, das gilt inzwischen als Best Practice.

Ronny

Korrigiere mich, wenn du es anders siehst,

Ronny

aber... Nee, ich

Jochen

weiß, hörst du es nicht, ich weiß

Jochen

jetzt, das ist aber nicht diese Geschichte, wo

Jochen

irgendwelche Leute versucht haben, den ORM so

Jochen

ein bisschen wegzuabstrahieren.

Jochen

Ich glaube nicht. Genau, auch auf Django News,

Jochen

die haben auch da Werbung gemacht,

Jochen

die haben das auch irgendwie Services genannt,

Jochen

aber ich glaube, das war was anderes. Es ging, das war

Ronny

dieses Projekt, irgendwie Maintaining a Django Project

Ronny

over 10.000 Commits oder sowas hieß das.

Ronny

die hatten so ein paar ketzerische Ideen, die wollten absichtlich

Ronny

ein bisschen Unruhe stiften, glaube ich, im positiven

Ronny

Sinne. Ja, ist ja gut.

Ronny

Muss ich mir, glaube ich, mal angucken.

Ronny

Kenn ich gar nicht. Ja, also wie gesagt, waren halt

Ronny

so ein paar ketzerische Ideen, die waren dann auch

Ronny

und meinten dann so, sie nutzen eigentlich gar keine Packages

Ronny

mehr, weil wenn das Projekt so lange läuft, hast du

Ronny

früher oder später immer Scherereien und sowas. Wie gesagt,

Ronny

die waren da gebrannte

Ronny

Kinder auf jeden Fall, das hat man gemerkt.

Ronny

Aber wie gesagt, die haben halt dann

Ronny

auch, ich habe nachher im Nachgang auch mit denen

Ronny

gesprochen und die meinten halt auch, dass

Ronny

die das halt sehr cool fänden, wenn dieses Django-Dinge

Ronny

in die Django-Doku reinkommen würde, das mit den Services.

Ronny

Einfach, dass dann halt auch

Ronny

Newbies, die halt vielleicht nicht so genau wissen, wie es mir

Ronny

damals auch ging, ich wusste auch nicht, wie ich das mache. Ich habe auch mit

Ronny

Utils angefangen und hatte dann immer ein ziemliches Chaos

Ronny

überall rum. Core-App und

Ronny

Utils. Ja, Core-App ist auch, ja.

Ronny

Genau.

Ronny

Ja, das

Dominik

zu Services. Ja, und du hast gesagt, die kann man

Dominik

mocken oder die will man mocken oder wann möchte man

Ronny

das? Genau, also es gibt ja beim

Ronny

Testing kann man ja alles mögliche

Ronny

Also man kann die aktuelle Zeit mocken, was ja praktisch ist. Also einfach sagen, heute ist nicht heute, sondern irgendwann anders.

Ronny

Montag.

Ronny

Genau. Und man kann aber auch ein Mockblock verwenden. Das heißt, man kann einfach dann sagen, alles, was in diesem Mockblock passiert, wenn da eine bestimmte Funktion aufgerufen wird, füllt ihr die nicht aus, sondern gibt einen festen Wert zurück.

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.

Ronny

Ein Mock-Block. Schön.

Ronny

Ja, sagt man, oder?

Ronny

Und wie gesagt, 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 Test-Code verbessert.

Ronny

Weil dadurch, dass halt die unterliegenden Funktionen einen festen Rückgabewert haben, wenn da jetzt ein Fehler drin ist, dann tangiert das halt nicht die anderen Sachen, sondern die Umwandlungsfunktionen, die ja hoffentlich auch getestet sind, fehlen dann isoliert und man hat dann nachher nicht irgendwie 50 gefehlte Tests.

Ronny

Man muss erstmal anfangen zu suchen, sondern im Optimalfall, wenn alles isoliert genug ist, fällt genau der Test ja nicht mehr, das bringt, was er möchte. Und diesen Doppel-Win, das fand ich echt ziemlich neat, das nochmal so zu realisieren.

Jochen

Ja, klingt gut. Also ich packe meistens

Jochen

meine Logik irgendwie so in

Jochen

den Model-Layer, mehr oder weniger.

Jochen

Erdmodels, nennt man das.

Jochen

Genau, oder beziehungsweise dann halt in Mixins,

Jochen

die dann halt

Jochen

irgendwie... Die Models aufblähen.

Jochen

Ja, die ich dann auch oft, wenn es dann zu lang

Jochen

wird, stecke ich halt in andere Files und importiere die

Jochen

dann aus Models.py, dann halt da rein und

Jochen

genau, aber ja,

Jochen

ja, ich weiß auch noch nicht so genau. Ich muss mir

Jochen

den Vortrag angucken.

Jochen

Genau.

Jochen

Es gibt verschiedene Meinungen dazu, glaube ich, ja.

Jochen

Ja, definitiv.

Jochen

Das ist wahrscheinlich auch der Grund,

Jochen

warum das noch nicht in der Dango-Doku gelandet ist.

Jochen

Ja, bei TwoScoops sagt er auch,

Jochen

das ist total katastrophal für Fat Models,

Jochen

aber ich finde das eigentlich auch gar nicht so schlecht,

Jochen

weil ich es bei Jochen gesehen habe natürlich,

Dominik

dass man da viele gute Dinge reinpackt,

Dominik

die halt da hingehören irgendwie.

Dominik

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

Dominik

Ja.

Dominik

Vielleicht sind sie dann am Modeln.

Dominik

Ich mag das auch.

Dominik

Also ich würde es nicht sagen,

Dominik

ich mache jetzt, da ist alles dran,

Ronny

weil wie gesagt, ich finde das Service-Prinzip ganz nett

Ronny

und mag das auch ganz gern,

Ronny

aber die sind auf jeden Fall nicht dünn, die Models, die ich baue.

Ronny

Ja.

Dominik

Ja, aber wir hatten noch mal ganz kurz über das Mocken geredet.

Dominik

Und ich glaube, Mocken ist auch etwas, was noch sehr interessant ist.

Dominik

Weil man kann natürlich alles mocken und so tun,

Dominik

als gäbe es irgendeine Umgebung.

Dominik

Und dann da testen, ob dann das, was man so geschrieben hat,

Dominik

für diese isolierte Umgebung dann funktioniert.

Jochen

Ja, und dann funktioniert es in der Realität nicht mehr,

Jochen

weil der Mock halt anders aussieht als die Realität.

Jochen

Das ist halt, ja.

Jochen

Ja, genau. Und vielleicht ist das eines der Probleme.

Jochen

Also ich habe das schon öfter mal mitbekommen,

Dominik

dass gerade Menschen, die irgendwie viel Coverage erreichen wollen,

Dominik

irgendwie sich dann mit vielen moxt und

Dominik

also es gab sogar Menschen, die haben sich dann Screenshots

Dominik

von den Webseiten irgendwie

Dominik

besorgt und dann geguckt, ob die

Dominik

dann am Ende genauso aussieht, weil sie dann irgendwie Templates

Dominik

noch versucht haben zu generieren und

Dominik

dann die Bilder miteinander verglichen

Dominik

und solche Sachen, also wirklich

Dominik

abgefahrener Quatsch.

Dominik

Ja, mockt ihr überhaupt irgendwas

Dominik

oder findest du anstrengend oder

Dominik

wann macht man das?

Jochen

Ich benutze das

Jochen

sehr häufig und

Jochen

muss man auch, denke ich, also gerade wenn man

Jochen

irgendwie APIs fragt oder so, mit externen

Jochen

sonstigen Systemen redet, dann geht das ja quasi

Jochen

gar nicht anders. Das heißt, du hast externen Antworten

Dominik

von Dingen, die du nicht im Test eigentlich abbilden

Dominik

kannst, die musst du dann tatsächlich emulieren.

Jochen

Die muss man nicht immer bocken, denke ich, das geht gar nicht anders.

Dominik

Ja gut, das sind Abfragen von externen APIs,

Dominik

kann man sich tatsächlich vorstellen, dass das sinnhaft ist.

Ronny

Ich mache es tatsächlich bei Daten

Ronny

enorm viel, weil das halt einfach,

Ronny

also das ist nicht schlimmer, als wenn du irgendwie

Ronny

am Freitag einen Test ausführst und plötzlich geht er nicht mehr.

Ronny

Was sind Daten? Also Datums.

Ronny

Ja, ja, okay, das ist ein bisschen

Ronny

schwierig im Deutschen.

Ronny

Aber also wirklich irgendwelche Zeiten, das ist total super. Man kann auch mit diesem, also das heißt Freescan, das Tool, mit dem man das machen kann 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.

Ronny

man kann das als Decorator verwenden, zum Beispiel sagen,

Ronny

heute ist der 26.06.

Ronny

Obwohl das, also egal,

Ronny

wann der Test läuft. Und wenn man jetzt aber zum Beispiel

Ronny

sagt, ich möchte jetzt aber Objekte erstellen mit

Ronny

einem bestimmten Timestamp,

Ronny

dann

Ronny

kann ich halt das

Ronny

in diesem Whiz-Tag machen, obwohl der ganze Test

Ronny

sagt, ich bin am 26.06.,

Ronny

kann ich dann trotzdem sagen, dieses Objekt

Ronny

ist aber schon zwei Jahre alt. Das ist halt ziemlich praktisch.

Ronny

Wenn man da so zwei, drei Dinge verstanden hat,

Ronny

dann kann man sich das Leben sehr leicht machen.

Ronny

Ansonsten das Mocken nutze ich viel weniger, als man es wahrscheinlich sollte. Ich nutze es halt für APIs, also für externe Sachen, die ich halt mocken muss auf Unit- oder Functional-Test-Ebenen.

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 das einfach zu lange dauert. Aber wahrscheinlich wäre es sinnvoll, das mehr zu machen. Obwohl natürlich du auch vollkommen recht hast, umso mehr man sich irgendwie da seine Fantasiewelt aufbaut, umso weiter weg bist du doch irgendwann natürlich von der Realität.

Ronny

Ja, also User-Input oder sowas,

Dominik

das kann man ja auch ins Frontend weiterdenken, was man

Dominik

irgendwie alles dann mocken kann. Habt ihr viel Frontend

Dominik

schon getestet? Was gibt's da alles? Beispielsweise Mocha

Dominik

und... Nee, nicht wirklich

Dominik

viel, ja.

Jochen

So Unit-Tests im Frontend, das ist ja

Jochen

glaube ich, hat sich inzwischen so Jest als der

Jochen

Standard etabliert, so ein bisschen.

Ronny

Reden wir jetzt von JavaScript oder reden wir von

Ronny

normalen Django-Templaten?

Ronny

Zum Beispiel JavaScript.

Jochen

Ich bin bei Frontend da direkt immer schon bei JavaScript.

Jochen

Ja, ja, eh, aber... Ja, leider, leider.

Dominik

Ja, das ist ja kurz von der Python-Welt aus,

Dominik

aber vielleicht ist ein Tester das selbe Thema.

Dominik

Ja, meintest du denn

Dominik

Django-Templates-Tests?

Dominik

Nein, ich meine tatsächlich die JavaScript-Mutter

Dominik

und was man da alles so bauen kann.

Dominik

Ja, also ich würde sagen,

Dominik

da gibt es halt eben den Unterschied zwischen

Jochen

End-to-End-Tests, also Cypress oder weiß ich nicht,

Jochen

was Leute da noch verwenden, Selenium.

Jochen

Da ist wohl die neue Version heute rausgekommen, habe ich gelesen.

Jochen

Ah ja, habe ich gar nicht mitbekommen, ja.

Jochen

Cool.

Jochen

Ja, und ich habe so ein bisschen

Jochen

was damit gemacht, aber noch nicht so wahnsinnig viel.

Jochen

Muss man da mehr mocken?

Jochen

Nö, eigentlich nicht.

Jochen

Ja gut, ich meine, ja.

Jochen

Aber ich habe da auch nicht so wahnsinnig viel Erfahrung.

Jochen

Meistens auf der Django-Seite.

Jochen

Ja, also entweder braucht man halt gute,

Dominik

richtig gut funktionierende Apps schon von sich aus,

Dominik

oder man braucht halt Tests.

Dominik

Ja, man kann halt auch tatsächlich andersrum anfangen

Dominik

und kann sagen, man baut zuerst seine

Dominik

Tests. Das nennt man dann Test-Driven

Dominik

Development. Und wenn man erst die Tests hat,

Dominik

die alle verschiebt gehen, dann den Code baut,

Dominik

was haltet ihr denn davon? Also vielleicht

Dominik

für mich, ich finde das immer sehr verwirrend,

Dominik

sowas zu tun, weil

Dominik

um das zu tun, also erst Tests zu bauen, dann müsste ich

Dominik

erstmal wissen, was meine Anwendung überhaupt machen soll

Dominik

oder macht, um dann Tests bauen zu können,

Dominik

wo die dann diese hypothetische Anwendung irgendwie

Dominik

stimmen können. Und das alleine ist schon ziemlich

Dominik

herausfordernd, finde ich.

Dominik

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, testdriven zu entwickeln. Aber ja, da ist die Idee ja im Grunde, dass du genau erst immer den Test schreibst und dann erst den Code.

Jochen

man hört dann halt auf, wenn der Test

Jochen

funktioniert, aber

Jochen

also gerade auch bei Django

Jochen

ich fange meistens, wenn ich

Jochen

anfange irgendwas zu schreiben

Jochen

schreibe ich erstmal das in einem Jupyter Notebook

Jochen

weil

Jochen

genau, also da gibt es halt

Jochen

die Django Shell Plus

Jochen

zum Beispiel, den Django Extensions

Jochen

wo man halt die ganzen Modelle schon drin hat

Jochen

sozusagen, das gibt es halt auch

Jochen

in der Jupyter Frontend

Jochen

und man hat dann

Jochen

quasi so eine Umgebung wie in der Shell Plus,

Jochen

bloß halt mit dem ganzen anderen Jupyter-Kram

Dominik

drumherum. Genau, man kann halt die ganzen Zellen immer wieder ausführen.

Jochen

Genau, dann probiere ich halt so lange rum,

Jochen

bis ich weiß, dass es ungefähr das tut, was ich

Jochen

gerne hätte.

Dominik

Das ist super, gerade wenn man so Funktionen machen möchte,

Dominik

die Modellsachen machen.

Jochen

Ja, weil oft Sachen muss man halt irgendwie ausprobieren.

Jochen

Das geht nicht, dann muss man es irgendwie anders machen

Jochen

und dann, und damit

Jochen

geht das eigentlich tatsächlich sehr, sehr

Jochen

schön, während man halt,

Jochen

wenn man jetzt das tatsächlich direkt in Code schreiben würde,

Jochen

müsste man das immer irgendwie ausführen.

Jochen

Man müsste jetzt erstmal an die Stelle kommen, wo das dann ausgeführt wird.

Jochen

Und das ist halt immer ein bisschen

Jochen

schwieriger. Und

Jochen

im Notebook hast du das halt, da änderst du

Jochen

dann deinen Code, führst nochmal die Zelle aus und weißt dann,

Jochen

okay, ah, jetzt passt's. Und dann, also

Jochen

meistens, also da fange ich an,

Jochen

Sachen zu basteln. Und wenn das dann halt so halbwegs

Jochen

passt, dann überführe ich

Jochen

es halt in

Jochen

tatsächlich Django-App-Code

Jochen

irgendwo. Und dann fange ich meistens dann auch

Jochen

Tests zu schreiben. Manchmal

Jochen

stelle ich dann noch was um, weil es

Jochen

einfacher ist zu testen oder so, aber

Jochen

oft ist es dann auch mehr oder weniger schon so fertig.

Dominik

Das heißt, das Test-Driven ist quasi

Dominik

gar nicht erst Testschreiben

Dominik

bei dir, sondern eher so Experimente

Dominik

machen in so einem Notebook,

Dominik

die halt so lange durchgehen, bis du halt was

Dominik

gerade getrunken hast. Also das ist so ein bisschen

Dominik

Learning by Doing oder man könnte es auch sagen,

Dominik

ausprobieren

Dominik

und bis jetzt irgendwas

Dominik

funktioniert, aber ich sage mal, in Notebooks ist

Dominik

diese Iterationsschleife relativ kurz.

Jochen

Relativ kurz, das ist der große Vorteil

Jochen

Ich kenne es halt aus dem Data-Science-Bereich so.

Jochen

Und ich weiß nicht, ob das,

Jochen

ich meine, diese Art, das so zu machen,

Jochen

gab es halt vorher auch, glaube ich, so noch gar nicht.

Jochen

Ja, das Pile-and-Error

Dominik

wird halt einfach dann unheimlich viel schneller.

Dominik

Und wenn man irgendwann

Dominik

ungefähr weiß, in welche Richtung man möchte, dann

Jochen

ja. Ja, also

Jochen

insofern habe ich das so,

Jochen

das ist halt das, wie ich das momentan mache, aber

Jochen

wäre vielleicht auch mal ganz interessant,

Jochen

Test-Driven-Development mal so wirklich auszuprobieren

Jochen

oder mal gezeigt zu bekommen von jemandem, der das so wirklich kann.

Jochen

Aber ja, daher

Jochen

ist das bei mir eigentlich nie. Das ist das, was

Jochen

quasi dann im Applikationscode

Jochen

in der General App landet, eigentlich meistens

Jochen

schon relativ fertig und die

Jochen

Tests, die dazu, also meistens weiß ich

Jochen

dann auch schon, welche Tests ich dann schreiben muss und

Jochen

dann, ja.

Jochen

Macht ihr Tests?

Ronny

Es gibt ein paar Leute bei uns,

Ronny

die das machen. Ich persönlich

Ronny

mache es nicht.

Ronny

Ich bin da ähnlich wie Jochen,

Ronny

dass ich denke, ich sollte es eigentlich

Ronny

mir nochmal im Detail angeschaut haben und nochmal vernünftig

Ronny

zeigen lassen.

Ronny

Mein Jupyter Notebook ist halt,

Ronny

dass ich halt meistens mit aktivem Debugger arbeite.

Ronny

Also sprich, ich springe mit dem

Ronny

Debugger in den Code, soweit ich bin.

Dominik

Debugger heißt also, welche Entwicklungs-MG benutzt du?

Dominik

PyCharm von IntelliJ.

Dominik

Und ich habe

Dominik

mir das irgendwann mal

Ronny

angefangen anzugewöhnen, weil das Schöne ist halt,

Ronny

du kannst halt dann mit diesem Evaluate Expression

Ronny

im Debugger, kannst du halt direkt Sachen

Ronny

testen und ausprobieren. Also sprich, wenn du dir nicht

Ronny

ganz sicher bist, zum Beispiel, ob eine Query das zurückgibt

Ronny

oder wenn man jetzt irgendein komplizierteres

Ronny

Aggregate macht, geht das, funktioniert das wirklich

Ronny

und solange man nicht versehentlich auf

Ronny

Steuerung S, also Speichern drückt und der die Seite

Ronny

neu lädt und dann der Debugger neu startet,

Ronny

hat man halt

Ronny

den Debugger, auch wenn man da ganz viele Änderungen macht

Ronny

und kann sich dann natürlich irgendwelche Zwischen-State

Ronny

in eine neue Variable speichern und weitermachen

Ronny

und...

Dominik

Das ist ein sehr interessanter Ansatz, würde ich gerne tatsächlich mal live sehen,

Dominik

also weil so, ich glaube so ein bisschen

Dominik

macht der Jochen das und ich mache das auch,

Dominik

ein bisschen abgucken mit den Notebooks, weil du da halt auch immer diese

Dominik

Iterationen dabei hast und auch, also

Dominik

ich benutze VS Code manchmal,

Dominik

da kann man das ja auch machen

Dominik

mit dem Debugger, den ich aber selten für sowas benutze,

Dominik

also nur wirklich, wenn ich ein Problem habe, was ich so nicht so einfach

Dominik

verstehe, dann gucke ich da mal rein

Dominik

und Python macht das. Also für mich

Ronny

persönlich, also mir geht es ein bisschen so,

Ronny

wie das verstand ab euch beiden auch,

Ronny

ich weiß halt am Anfang meistens

Ronny

nicht so genau, was nachher rauskommt, also

Ronny

wenn die meisten Sachen, die man

Ronny

ja so zu testen hat, sind ja dann bei mir jetzt in Services

Ronny

und ich weiß halt einfach

Ronny

nicht, wie der Service nachher aussieht.

Ronny

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

Ronny

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

Ronny

Das heißt, ich 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 da sind 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, 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, das könnte man vielleicht alles besser, schneller, effizienter, komplett anders machen und ja.

Ronny

Also ich denke, TDD ist auf jeden Fall ein sehr hehres Ziel, das zu machen und ich glaube auch, dass Leute, die, sag ich mal, programmieren lernen, das auch bestimmt nicht verkehrt ist, wenn die so anfangen.

Dominik

Nee, ich glaube, das ist für sich ganz anders, 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

Ronny

und auch Python gelernt habe,

Ronny

da war mein Code, den ich geschrieben habe,

Ronny

also ich habe damals eh noch keine Unit-Tests geschrieben,

Ronny

ich meine, das ist auch schon lange her,

Ronny

aber der Code, den ich produziert habe,

Ronny

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,

Ronny

dass dein Code die richtige Struktur hat,

Ronny

weil du merkst halt sofort, oh, der ist ein Code, den kann ich nicht testen.

Dominik

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

Dominik

Du hast gesagt, dass die Struktur, die man gut testen kann,

Dominik

die richtige wäre.

Dominik

Eine bessere.

Ronny

Aber ich glaube auf jeden Fall, dass Code, der nicht testbar ist,

Ronny

nicht so richtig guter Code ist.

Ronny

Das würde ich jetzt einfach mal so posten.

Ronny

Und das zum Beispiel hat mir,

Ronny

als ich dann angefangen habe, mich intensiv mit Unit-Tests zu beschäftigen,

Ronny

halt sehr geholfen, auch nochmal

Ronny

wirklich beim Codeschreiben auch zu überlegen,

Ronny

wo soll das denn alles hin?

Ronny

Wenn ich halt weiß, ich möchte das irgendwie isoliert

Ronny

und vernünftig, also ich möchte nicht irgendwie nachher drei Stunden

Ronny

über Tests nachdenken und irgendwelche wilden Fälle zusammenbauen,

Ronny

sondern ich möchte es ja einfach, es funktioniert, ich mache ein oder

Ronny

zwei Sachen, genau das möchte ich abchecken, ob das nachher rauskommt

Ronny

und fertig. Und wenn man halt

Ronny

das nur baut, dass es funktioniert und

Ronny

gar nicht über diese Tests nachdenkt,

Ronny

ja,

Ronny

das ist halt, glaube ich, ein Unterschied. Von daher glaube ich,

Ronny

kann das, also ich glaube, für Leute, die schon

Ronny

relativ gut wissen, was sie tun, kann das

Ronny

natürlich eine Verbesserung sein.

Ronny

Wir hatten mal vor vielen,

Ronny

vor zwei Jahren einen,

Ronny

ich sag mal einen Python-Guru bei uns in der Firma, der mal

Ronny

so einen Tag lang über TDD

Ronny

erzählt hat und im Endeffekt querbeet alles

Ronny

Mögliche und

Ronny

war das auch mein erster

Ronny

intensiverer Kontakt mit TDD

Ronny

und ich habe ihn im Nachgang auch gefragt,

Ronny

hey, guck mal, ich arbeite so und so, was sagst du dazu?

Ronny

Ich meine, du hast die hier.

Ronny

Und er meinte dann, er meinte im Endeffekt

Ronny

ist es halt so, es gibt halt

Ronny

viele Wege, die nach oben führen. Er selbst findet das gut,

Ronny

er macht das auch so, er hat auch irgendwann mal umgelernt,

Ronny

aber für ihn zum Beispiel

Ronny

ist halt wichtig, dass testbarer Code rauskommt.

Ronny

Und wenn man halt selbst durch die Art,

Ronny

wie auch immer man da hinkommt,

Ronny

wenn ein Testparachoder am Ende rauskommt,

Ronny

dann ist halt ein großer Vorteil von TDD,

Ronny

hat man halt anders erreicht.

Ronny

So what?

Ronny

Eine Sache, die ich auch ganz interessant fand,

Ronny

ist, bei TDD fängst du an und schreibst einen Test,

Ronny

der per se failen muss,

Ronny

weil es gibt ja noch nichts, was funktionieren kann,

Ronny

weil du ja mit dem Test anfängst.

Ronny

Und das fand ich ganz spannend.

Ronny

Er meinte, er findet das,

Ronny

das ist für ihn so die Routine,

Ronny

er fängt irgendwas an zu programmieren

Ronny

und sieht erst mal, der Test schlägt fehl.

Ronny

Und wenn man andersrum arbeitet,

Ronny

dann baut man die Tests ja so, dass sie funktionieren.

Ronny

Also du baust ja nicht absichtlich einen Test und baust einen Fehler ein,

Ronny

um den Test rot zu haben.

Ronny

Und er meinte, das ist halt ganz angenehm, dass du am Anfang siehst,

Ronny

okay, ich habe jetzt acht Tests gebaut, die schlagen alle acht fehl

Ronny

und nachher mache ich, dass sie gehen.

Ronny

Weil es kann halt leicht passieren, dass wenn man halt das andersrum macht,

Ronny

dass man halt die Tests baut und dann hat man einen Fehler drin,

Ronny

und der Test ist versehentlich grün, also voll positiv.

Ronny

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

Ronny

da hatte ich ein Rechnungsmodul gebaut,

Ronny

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 InitPy weggekommen aus dem Testordner, wie auch immer.

Ronny

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

Ronny

Der Projektor der damals, glaube ich, 800 Tests, die 50 Tests für die Rechnungslegung,

Ronny

ist 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,

Ronny

hm, irgendwie kann das nicht sein, ich habe das doch getestet.

Ronny

Und dann war das so, ups.

Ronny

Ich meine, das trifft jetzt nicht so 100% deckungsgleich mit dem, was ich jetzt gerade meinte.

Ronny

Aber solche Sachen, es gibt halt schon echt Beispiele, wo man das haben kann. Ich finde diese Idee echt ganz nett, dass man wirklich mal guckt, so hey, funktioniert das denn wirklich? Weil es kann ja wirklich sein, dass man testet einfach, dass der versehentlich funktioniert. Zu viel gemockt oder so, man weiß es nicht und ja.

Ronny

Ja, nee, absolut.

Dominik

Spannendes Thema. Ich würde jetzt gerne noch ein paar Getränke hier testen. Was haben wir denn noch auf unserer Liste? Ich glaube, die Liste sind wir ganz gut, oder?

Dominik

durch? Wir sind durch?

Ronny

Nein. Wir sind voll vorbereitet, wir haben eine Liste.

Dominik

Die hast du selber geschrieben, ich kann gar nichts lesen.

Jochen

Du kannst ja schon mal die Liste lesen. Ich kann ja vielleicht noch mal

Jochen

gerade, also ich bin immer noch ganz begeistert

Jochen

von dem Sweet Up Your Django Tests

Jochen

Buch und

Jochen

genau, was man nämlich auch noch alles machen kann,

Jochen

an tollen Sachen ist, man kann halt auch noch die Datenbank

Jochen

auf ein

Jochen

In-Memory-Filesystem legen. Es gibt

Jochen

zum Beispiel mit Docker, Docker Compose geht das sehr einfach.

Jochen

Das ist eine gute Idee. Ja, und das macht

Jochen

die auch nochmal gleich deutlich schneller, weil

Jochen

normalerweise kannst du das halt nur machen mit SQLite

Jochen

und SQLite will man vielleicht nicht verwenden, weil

Jochen

es ist halt anders als Postgres oder was auch immer.

Dominik

Ich wollte gerade sagen, kann man damit denn so Postgres

Dominik

Testen, wenn ich jetzt zum Beispiel

Dominik

in Postgres habe ich jetzt sowas wie Indexes bauen

Jochen

oder sowas? Ja, ja, ja, das funktioniert alles.

Jochen

Das ist halt das drunterliegende Fallsystem,

Jochen

was dann halt nur noch im Hauptspeicher ist.

Jochen

Ich muss ja

Ronny

gestehen, ich hatte ja, wir hatten ja

Ronny

erst geplant, das bei dir daheim zu machen und ich hatte

Ronny

gehofft, dass da zu viel das Buch herumliegt, nicht

Ronny

in meinen Blick reinwerfen kann. Achso, nee, ich hab's nur elektronisch,

Jochen

ich hab's nicht, genau, aber

Jochen

Aber ja, lässt sich sicher sonst auch machen.

Jochen

Irgendwie muss man gucken.

Jochen

Ja, nee, stimmt.

Jochen

Ja, ich bin inzwischen fast komplett umgestiegen

Jochen

auf elektronische Bücher, weil ja, praktischer Platz.

Jochen

Und ich habe sie immer dabei.

Dominik

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

Dominik

Ja.

Dominik

Alles voll, fällt schon alles raus.

Dominik

Doppelt, dreifach, kennst du das auch?

Dominik

Mehrere Stapel an Bücherlagen im Regal.

Jochen

Ja, ja, bei den meisten Bücherregalen

Jochen

ist bei uns mindestens eine Lage noch dahinter.

Jochen

Ja, genau. Lass mal überlegen, was war denn da? Gab es sonst noch irgendwie interessante Dinge, die im Buch drin standen? Ja, es gibt dann auch irgendwie auch so grundsätzliche Dinge. Genau, Tests parallelisieren bringt sehr viel. Migrationen bringen auch viel, wenn man die squasht.

Jochen

Oh ja.

Jochen

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

Ronny

Vor allem auch, wenn man so lustige

Ronny

Sachen hat wie RunPython, also dass man wirklich

Ronny

noch Code ausführt, das kann

Ronny

ja, je nachdem,

Ronny

ich meine, man hat ja meist eine Testdatenbank, wo nicht so

Ronny

viele Datensätze drin sind, aber das je nachdem,

Ronny

was man da für abgefahrene Dinge tut, kann das auch schon

Ronny

ein Downer sein.

Ronny

Ja.

Ronny

Ja, aber ansonsten glaube ich,

Ronny

ja, nee, muss man selber mal

Jochen

gucken. Ich meine, wenn man sich das Blog

Jochen

von Adam Johnson anguckt, da sind auch die meisten,

Jochen

also ich meine, das Buch ist, viele von den

Jochen

Sachen, die darin stehen, hat er auch schon mal irgendwie als

Jochen

Blogartikel irgendwie da an seinem Blog gehabt.

Jochen

Der hat einfach gewagt, an seinem Blogartikel schon ein Buch

Jochen

zu verwurzeln. Wahnsinn.

Jochen

Könnte man von lernen.

Jochen

Ja, genau.

Jochen

Ansonsten,

Jochen

ich weiß es nicht, gibt es noch irgendwelche Dinge,

Jochen

wir haben jetzt viel über Django geredet, gibt es irgendwie

Jochen

Testgeschichten, die auch

Jochen

relevant wären, die jetzt nicht so sehr

Jochen

Django oder Webentwicklung betreffen?

Jochen

Lass mal überlegen, habe ich irgendwas mit

Jochen

Data Science? Also da

Jochen

ist es auch so, da macht man auch viel Tests.

Jochen

Aber das ist auch alles sehr ähnlich.

Jochen

Fast alles Unit-Tests,

Jochen

die einzelnen Test-Cases.

Ronny

Eine Sache, die ich noch ganz interessant

Ronny

finde,

Ronny

das geht wieder so ein bisschen Richtung

Ronny

100% Test-Coverage.

Ronny

Ich habe mich auch mal mit jemandem unterhalten und

Ronny

da meinte er, er ist gar nicht so ein Fan

Ronny

von Unit-Tests. Ich finde, natürlich braucht man die.

Ronny

Die gehören einfach zum Team.

Ronny

Er meinte, da hat er es so ein bisschen mit den drei Musketieren verglichen.

Ronny

Also Arthos, der ist so ein bisschen langweilig, aber der ist halt der Chef.

Ronny

Die brauchst du halt einfach, kannst nicht ohne.

Ronny

Und was er halt viel cooler findet, sind halt eher Functional Tests.

Ronny

Also sprich Tests, die halt die Business-Logik testen.

Ronny

Also dass man halt so ein bisschen mehr High-Level-Sachen testet,

Ronny

um einfach sicherzustellen, dass, keine Ahnung, wenn man halt irgendeine Logik hat,

Ronny

die irgendwas macht, also eine Rechnung erstellen oder irgendwas berechnen

Ronny

oder irgendeine Daten aggregieren oder sowas,

Ronny

dass die halt das tut, was man von ihr möchte.

Ronny

Und das fand ich ganz lustig, weil meistens, wenn halt über das Testing gesprochen wird, dann werden halt Unit-Tests rauf und runter exerziert. Und dann wird auch immer wieder gesagt, so ja, dann gibt es natürlich die End-to-End-Tests, wo man natürlich das Frontend drin hat, wo man dann wieder in einer ganz Django-fernen Welt, oder was heißt Django-fern, das ist halt dann, tangiert Django nicht direkt, sage ich mal.

Ronny

Das wird natürlich dann irgendwie aufgerufen und genutzt, aber das ist dann ja auch bei Cypress dann JavaScript-Code und sowas. 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

Das ist natürlich meistens ein bisschen mehr Setup, weil man halt nicht 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 jemand, der, keine Ahnung, ich habe eine Rechnung, enthält die dies und jenes, 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 ja 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, durchaus. Ich weiß gar nicht, ob es da irgendwie so tolle Definitionen von was ist ein Unit-Test, was ist ein Functional-Test, was ist ein Integration-Test, keine Ahnung, aber weiß ich auch nicht.

Dominik

Du hast gerade von den drei Musketieren gesprochen und erst ein einziges Musketier erwähnt.

Ronny

Genau, also die Functional Test ist Porthos, der Coole, der Pirat und die Integration Test ist dann Aramis, glaube ich, heißt der letzte.

Dominik

Die anderen beiden waren? Ja, stimmt, du hast es ja schon.

Ronny

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

Ronny

Nicht, dass der, der das Beispiel gebracht hat, mich jetzt hautweiß durcheinander bringe, aber Arthos ist auf jeden Fall der langweilige Unit Test.

Ronny

dann Porthos, glaube ich, war

Ronny

das coole. Vielleicht waren das auch

Ronny

die End-to-End-Tests, das weiß ich nicht mehr genau.

Ronny

Also da sind ja auch noch Porthos, weil die sind beide so

Ronny

und genau

Ronny

Aramis ist dann Integration-Test, wo man

Ronny

so externe APIs und sowas mit anspricht und so

Ronny

und das ist dann halt immer so ein bisschen

Ronny

das ist zwar total cool

Ronny

und jeder mag den Charakter auch, aber der ist halt so ein bisschen

Ronny

schwierig. Der ist dann irgendwie ständig verliebt und irgendwie

Ronny

Seelenkrise und so und das ist dann auch so mit den externen APIs.

Ronny

Es ist total cool, das zu haben, aber man hat halt auch

Ronny

irgendwie ziemlich viel Scherrein damit

Ronny

und ja.

Ronny

Der Wind kommt, der wird die Tests gerade machen.

Ronny

Ich glaube, das war

Ronny

Porthos,

Ronny

ist die End-to-End-Test, weil die halt

Ronny

ziemlich cool sind, weil du halt damit wirklich den kompletten Flow

Ronny

durchtesten kannst. Und diese Functional-Tests sind

Ronny

d'Artagnan, der gehört zum Team

Ronny

und der wird aber oft übersehen.

Ronny

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

Ronny

Ja.

Ronny

Ja, ja.

Ronny

Königin der Kunde oder sowas.

Ronny

Die entscheidet dann tatsächlich, wie es mit dem

Dominik

weiterläuft. Mit den dreieinhalb,

Dominik

vier.

Dominik

Ja, fällt euch noch was

Dominik

ein zu testen?

Dominik

Ich teste glaube ich

Dominik

noch Weltenwein. Ja, genau.

Dominik

Ich meine, ich glaube, wir sind eigentlich

Jochen

so halbwegs durchgekommen und so.

Dominik

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

Dominik

Also ich hoffe, es ist nicht

Dominik

zu schrecklich. Ich bin mal gespannt, was

Dominik

auch Vanek draus macht.

Dominik

Ja, genau. Ja, alles klar.

Dominik

Ja, vielen Dank auf jeden Fall für die Einladung.

Dominik

Also fand ich cool. Ja, schön, dass du da warst.

Ronny

Mein erster Podcast

Ronny

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

Ronny

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

Ronny

Vielen Dank, dass ihr da wart.

Dominik

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

Dominik

Bis zum nächsten Mal.

Dominik

Tschüss.

Dominik

Tschüss, ciao.