webinar test-driven javascript
DESCRIPTION
Für mehr Qualität in JavaScript-Applikationen Recording verfügbar unter: http://www.mayflower.de/de/ressourcen/webinare/archiv/test-driven-javascriptTRANSCRIPT
![Page 1: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/1.jpg)
TEST-DRIVEN JAVASCRIPTFür mehr Qualität in JavaScript-Applikationen
Wednesday, January 23, 13
![Page 2: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/2.jpg)
WER BIN ICH?
• Sebastian Springer
• 30
•Dipl. Inf. (FH)
• Teamleiter @ Mayflower München
•Nebenbei: JavaScript-Entwickler
•@basti_springer
Wednesday, January 23, 13
![Page 3: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/3.jpg)
WAS ERWARTET EUCH?
?Wednesday, January 23, 13
![Page 4: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/4.jpg)
WAS ERWARTET EUCH?
•Was ist TDD?
?Wednesday, January 23, 13
![Page 5: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/5.jpg)
WAS ERWARTET EUCH?
•Was ist TDD?
?•Warum TDD?
Wednesday, January 23, 13
![Page 6: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/6.jpg)
WAS ERWARTET EUCH?
•Was ist TDD?
?•Warum TDD?•Was benötige ich dafür?
Wednesday, January 23, 13
![Page 7: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/7.jpg)
WAS ERWARTET EUCH?
•Was ist TDD?
?•Wie funktioniert’s?
•Warum TDD?•Was benötige ich dafür?
Wednesday, January 23, 13
![Page 8: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/8.jpg)
WAS����������� ������������������ IST����������� ������������������ TDD?WARUM����������� ������������������ TDD?VORAUSSETZUNGEN?WIE����������� ������������������ FUNKTIONIERT’S?
Wednesday, January 23, 13
![Page 9: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/9.jpg)
WAS IST TDD?• Angewandtes Softwaredesign und -entwicklung
• Erst Tests, dann den Code
• Red, Green, Refactor
• Clean Code that works
Wednesday, January 23, 13
![Page 10: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/10.jpg)
TDD����������� ������������������ ist����������� ������������������ doof
Wednesday, January 23, 13
![Page 11: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/11.jpg)
DIE SCHATTENSEITEN• Verständnis
•Disziplin und Konsequenz
• Einstiegshürde
• Anfänglich langsame Geschwindigkeit
Wednesday, January 23, 13
![Page 12: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/12.jpg)
WAS����������� ������������������ IST����������� ������������������ TDD?WARUM����������� ������������������ TDD?VORAUSSETZUNGEN?WIE����������� ������������������ FUNKTIONIERT’S?
✓
Wednesday, January 23, 13
![Page 13: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/13.jpg)
Weil’s����������� ������������������ geht!
Wednesday, January 23, 13
![Page 14: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/14.jpg)
Das Problem verstehen
Wednesday, January 23, 13
![Page 15: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/15.jpg)
Sicherheit für Refactorings
Wednesday, January 23, 13
![Page 16: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/16.jpg)
Schnelles Feedback
Wednesday, January 23, 13
![Page 17: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/17.jpg)
Software muss getestet werden
Wednesday, January 23, 13
![Page 18: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/18.jpg)
Software muss getestet werden
entweder manuell oder automatisch
Wednesday, January 23, 13
![Page 19: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/19.jpg)
Dokumentation
Wednesday, January 23, 13
![Page 20: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/20.jpg)
Basis für Weiterentwicklung
Wednesday, January 23, 13
![Page 21: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/21.jpg)
Besserer Code
Wednesday, January 23, 13
![Page 22: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/22.jpg)
Weniger Bugs
Wednesday, January 23, 13
![Page 23: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/23.jpg)
Spaß an der Arbeit
Wednesday, January 23, 13
![Page 24: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/24.jpg)
Qualität und Lauffähigkeit
Wednesday, January 23, 13
![Page 25: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/25.jpg)
WAS����������� ������������������ IST����������� ������������������ TDD?WARUM����������� ������������������ TDD?VORAUSSETZUNGEN?WIE����������� ������������������ FUNKTIONIERT’S?
✓✓
Wednesday, January 23, 13
![Page 26: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/26.jpg)
IDE
Wednesday, January 23, 13
![Page 27: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/27.jpg)
FRAMEWORK
Wednesday, January 23, 13
![Page 28: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/28.jpg)
BROWSER
Wednesday, January 23, 13
![Page 29: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/29.jpg)
Gibt’s����������� ������������������ das����������� ������������������ nicht����������� ������������������ in����������� ������������������ besser?
Wednesday, January 23, 13
![Page 30: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/30.jpg)
INTEGRATION
Wednesday, January 23, 13
![Page 31: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/31.jpg)
INTEGRATION
JsTestDriver Plugin
Wednesday, January 23, 13
![Page 32: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/32.jpg)
JSTESTDRIVER
Wednesday, January 23, 13
![Page 33: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/33.jpg)
+ = ♥
Wednesday, January 23, 13
![Page 34: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/34.jpg)
WAS����������� ������������������ IST����������� ������������������ TDD?WARUM����������� ������������������ TDD?VORAUSSETZUNGEN?WIE����������� ������������������ FUNKTIONIERT’S?
✓✓✓
Wednesday, January 23, 13
![Page 35: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/35.jpg)
DAS BEISPIEL:FIZZ BUZZ
Wednesday, January 23, 13
![Page 36: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/36.jpg)
FIZZ BUZZ
• Es wird eine Zahl eingegeben.
• Ist die Zahl durch 3 teilbar, ist das Ergebnis “fizz”.
• Ist die Zahl durch 5 teilbar, ist das Ergebnis “buzz”.
• Ist die Zahl sowohl durch 3 als auch durch 5 teilbar, ist das Ergebnis “fizzbuzz”.
Wednesday, January 23, 13
![Page 37: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/37.jpg)
FIZZ BUZZ1 1 11 11 21 fizz2 2 12 fizz 22 223 fizz 13 13 23 234 4 14 14 24 fizz5 buzz 15 fizzbuzz 25 buzz6 fizz 16 16 26 267 7 17 17 27 fizz8 8 18 fizz 28 289 fizz 19 19 29 2910 buzz 20 buzz 30 fizzbuzz
Wednesday, January 23, 13
![Page 38: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/38.jpg)
SETUP
Wednesday, January 23, 13
![Page 39: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/39.jpg)
FIZZBUZZ.JSTD
load: - lib/jasmine.js - lib/JasmineAdapter.js - spec/FizzBuzz.spec.js - src/FizzBuzz.js
• YAML-Format
• Speicherorte der verschiedenen Dateien
Wednesday, January 23, 13
![Page 40: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/40.jpg)
Wednesday, January 23, 13
![Page 41: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/41.jpg)
Na����������� ������������������ dann����������� ������������������ mal����������� ������������������ los!
Wednesday, January 23, 13
![Page 42: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/42.jpg)
TEST FIRST
• Erst den Test, dann den Quellcode
• Anforderungen in Test übersetzen
•One problem a time
Wednesday, January 23, 13
![Page 43: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/43.jpg)
describe("FizzBuzz", function () { "use strict";
it("should return 1, if 1 is provided", function () { expect(fizzbuzz(1)).toEqual(1); });
});
Wednesday, January 23, 13
![Page 44: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/44.jpg)
red
Wednesday, January 23, 13
![Page 45: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/45.jpg)
EINFACHSTE LÖSUNG
• Ziel: Der Test muss grün werden.
• Fokus auf die aktuelle Problemstellung
Wednesday, January 23, 13
![Page 46: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/46.jpg)
FAKE IT ‘TIL YOU MAKE IT
• Umsetzung mit fixen Werten
• Tests werden sehr schnell grün
•Wenig Code
• Kein Over-Engineering
Wednesday, January 23, 13
![Page 47: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/47.jpg)
var fizzbuzz = function () { "use strict"; return 1;};
Wednesday, January 23, 13
![Page 48: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/48.jpg)
green
Wednesday, January 23, 13
![Page 49: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/49.jpg)
TRIANGULATION
•Mehrere Tests mit verschiedenen Werten
• Klare Implementierung
• Saubere Abstraktion
• Tests mit Grenzwerten
Wednesday, January 23, 13
![Page 50: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/50.jpg)
it("should return 2, if 2 is provided", function () { expect(fizzbuzz(2)).toEqual(2);});
Wednesday, January 23, 13
![Page 51: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/51.jpg)
red
Wednesday, January 23, 13
![Page 52: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/52.jpg)
var fizzbuzz = function (n) { "use strict"; return n;};
Wednesday, January 23, 13
![Page 53: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/53.jpg)
green
Wednesday, January 23, 13
![Page 54: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/54.jpg)
OBVIOUS IMPLEMENTATION
• Keine unnötigen Tests
•Wenn 1 und 2 funktionieren, sollten auch alle weiteren Zahlen funktionieren.
• Zu viel Aufwand für Tests
Wednesday, January 23, 13
![Page 55: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/55.jpg)
BABY STEPS
•Die kleinst möglichen Schritte
• Sehr kurze Feedback-Scheifen
• Schnelle, übersichtliche Tests
Wednesday, January 23, 13
![Page 56: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/56.jpg)
it("should return fizz, if 3 is provided", function () { expect(fizzbuzz(3)).toEqual('fizz');});
Wednesday, January 23, 13
![Page 57: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/57.jpg)
red
Wednesday, January 23, 13
![Page 58: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/58.jpg)
var fizzbuzz = function (n) { "use strict";
if (n === 3) { return 'fizz'; }
return n;};
Wednesday, January 23, 13
![Page 59: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/59.jpg)
green
Wednesday, January 23, 13
![Page 60: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/60.jpg)
THREE OUT OF FOUR
• Stabiler Codestand
•Maximal eine Änderung entfernt von grünen Tests
Wednesday, January 23, 13
![Page 61: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/61.jpg)
YAGNI
• You Ain’t Gonna Need It
• Kein Code für zukünftige Probleme
• Fokus auf das aktuelle Problem
Wednesday, January 23, 13
![Page 62: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/62.jpg)
it("should return fizz, if 6 is provided", function () { expect(fizzbuzz(6)).toEqual('fizz');});
Wednesday, January 23, 13
![Page 63: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/63.jpg)
red
Wednesday, January 23, 13
![Page 64: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/64.jpg)
var fizzbuzz = function (n) { "use strict";
if (n === 3 || n === 6) { return 'fizz'; }
if (n === 5) { return 'buzz'; }
return n;};
Wednesday, January 23, 13
![Page 65: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/65.jpg)
green
Wednesday, January 23, 13
![Page 66: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/66.jpg)
REFACTOR
• Stellen, die verbessert werden können, identifizieren
• Anhand der bestehenden Tests den Code umbauen
Wednesday, January 23, 13
![Page 67: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/67.jpg)
var fizzbuzz = function (n) { "use strict";
if (n % 3 === 0) { return 'fizz'; }
if (n === 5) { return 'buzz'; }
return n;};
Wednesday, January 23, 13
![Page 68: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/68.jpg)
green
Wednesday, January 23, 13
![Page 69: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/69.jpg)
REMOVE DUPLICATION
• Bessere Wartbarkeit
• Übersichtlicher Quellcode
• Teure Weiterentwicklung
Wednesday, January 23, 13
![Page 70: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/70.jpg)
GOLDEN MASTER
• kompletter Systemtest
• Generierter oder manueller Test
• bei umfangreicheren Workflows sehr aufwändig
Wednesday, January 23, 13
![Page 71: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/71.jpg)
describe("FizzBuzz", function () { "use strict";
var map = [ '', 1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz' ], i, bindFunc,
func = function (x, y) { expect(fizzbuzz(x)).toEqual(y); };
for (i = 1; i < map.length; i += 1) { bindFunc = func.bind(this, i, map[i]); it("should return " + map[i] + " if " + i + " is provided", bindFunc); }});
Wednesday, January 23, 13
![Page 72: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/72.jpg)
green
Wednesday, January 23, 13
![Page 73: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/73.jpg)
UND JETZT?
•Nimm teil an einem Coding Dojo
• Führe Coding Katas durch
• Pair Programming
• Austausch mit anderen Entwicklern
Wednesday, January 23, 13
![Page 74: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/74.jpg)
CHEAT SHEET• Write a failing Test
• Write the simplest code to test
• Refactor to remove duplication
• Write the assertion first and work backwards
• See the test fail
• Write meaningful tests
• Triangulate
• Keep your test and model code separate
• Isolate your tests
• Test should test one thing
• Don’t refactor with a failing test
• Maintain your Tests
Wednesday, January 23, 13
![Page 75: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/75.jpg)
Fragen?
Wednesday, January 23, 13
![Page 76: Webinar Test-Driven JavaScript](https://reader033.vdocuments.net/reader033/viewer/2022052820/54632a3daf79597c138b4d4c/html5/thumbnails/76.jpg)
VIELEN DANK!Sebastian Springer
Mayflower GmbHMannhardtstr. 680538 MünchenDeutschland
@basti_springer
https://github.com/sspringer82
Wednesday, January 23, 13