webinar test-driven javascript

76
TEST-DRIVEN JAVASCRIPT Für mehr Qualität in JavaScript-Applikationen Wednesday, January 23, 13

Upload: sebastian-springer

Post on 11-Nov-2014

916 views

Category:

Technology


0 download

DESCRIPTION

Für mehr Qualität in JavaScript-Applikationen Recording verfügbar unter: http://www.mayflower.de/de/ressourcen/webinare/archiv/test-driven-javascript

TRANSCRIPT

Page 1: Webinar Test-Driven JavaScript

TEST-DRIVEN JAVASCRIPTFür mehr Qualität in JavaScript-Applikationen

Wednesday, January 23, 13

Page 2: Webinar Test-Driven JavaScript

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

WAS ERWARTET EUCH?

?Wednesday, January 23, 13

Page 4: Webinar Test-Driven JavaScript

WAS ERWARTET EUCH?

•Was ist TDD?

?Wednesday, January 23, 13

Page 5: Webinar Test-Driven JavaScript

WAS ERWARTET EUCH?

•Was ist TDD?

?•Warum TDD?

Wednesday, January 23, 13

Page 6: Webinar Test-Driven JavaScript

WAS ERWARTET EUCH?

•Was ist TDD?

?•Warum TDD?•Was benötige ich dafür?

Wednesday, January 23, 13

Page 7: Webinar Test-Driven JavaScript

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

WAS����������� ������������������  IST����������� ������������������  TDD?WARUM����������� ������������������  TDD?VORAUSSETZUNGEN?WIE����������� ������������������  FUNKTIONIERT’S?

Wednesday, January 23, 13

Page 9: Webinar Test-Driven JavaScript

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

TDD����������� ������������������  ist����������� ������������������  doof

Wednesday, January 23, 13

Page 11: Webinar Test-Driven JavaScript

DIE SCHATTENSEITEN• Verständnis

•Disziplin und Konsequenz

• Einstiegshürde

• Anfänglich langsame Geschwindigkeit

Wednesday, January 23, 13

Page 12: Webinar Test-Driven JavaScript

WAS����������� ������������������  IST����������� ������������������  TDD?WARUM����������� ������������������  TDD?VORAUSSETZUNGEN?WIE����������� ������������������  FUNKTIONIERT’S?

Wednesday, January 23, 13

Page 13: Webinar Test-Driven JavaScript

Weil’s����������� ������������������  geht!

Wednesday, January 23, 13

Page 14: Webinar Test-Driven JavaScript

Das Problem verstehen

Wednesday, January 23, 13

Page 15: Webinar Test-Driven JavaScript

Sicherheit für Refactorings

Wednesday, January 23, 13

Page 16: Webinar Test-Driven JavaScript

Schnelles Feedback

Wednesday, January 23, 13

Page 17: Webinar Test-Driven JavaScript

Software muss getestet werden

Wednesday, January 23, 13

Page 18: Webinar Test-Driven JavaScript

Software muss getestet werden

entweder manuell oder automatisch

Wednesday, January 23, 13

Page 19: Webinar Test-Driven JavaScript

Dokumentation

Wednesday, January 23, 13

Page 20: Webinar Test-Driven JavaScript

Basis für Weiterentwicklung

Wednesday, January 23, 13

Page 21: Webinar Test-Driven JavaScript

Besserer Code

Wednesday, January 23, 13

Page 22: Webinar Test-Driven JavaScript

Weniger Bugs

Wednesday, January 23, 13

Page 23: Webinar Test-Driven JavaScript

Spaß an der Arbeit

Wednesday, January 23, 13

Page 24: Webinar Test-Driven JavaScript

Qualität und Lauffähigkeit

Wednesday, January 23, 13

Page 25: Webinar Test-Driven JavaScript

WAS����������� ������������������  IST����������� ������������������  TDD?WARUM����������� ������������������  TDD?VORAUSSETZUNGEN?WIE����������� ������������������  FUNKTIONIERT’S?

✓✓

Wednesday, January 23, 13

Page 26: Webinar Test-Driven JavaScript

IDE

Wednesday, January 23, 13

Page 27: Webinar Test-Driven JavaScript

FRAMEWORK

Wednesday, January 23, 13

Page 28: Webinar Test-Driven JavaScript

BROWSER

Wednesday, January 23, 13

Page 29: Webinar Test-Driven JavaScript

Gibt’s����������� ������������������  das����������� ������������������  nicht����������� ������������������  in����������� ������������������  besser?

Wednesday, January 23, 13

Page 30: Webinar Test-Driven JavaScript

INTEGRATION

Wednesday, January 23, 13

Page 31: Webinar Test-Driven JavaScript

INTEGRATION

JsTestDriver Plugin

Wednesday, January 23, 13

Page 32: Webinar Test-Driven JavaScript

JSTESTDRIVER

Wednesday, January 23, 13

Page 33: Webinar Test-Driven JavaScript

+ = ♥

Wednesday, January 23, 13

Page 34: Webinar Test-Driven JavaScript

WAS����������� ������������������  IST����������� ������������������  TDD?WARUM����������� ������������������  TDD?VORAUSSETZUNGEN?WIE����������� ������������������  FUNKTIONIERT’S?

✓✓✓

Wednesday, January 23, 13

Page 35: Webinar Test-Driven JavaScript

DAS BEISPIEL:FIZZ BUZZ

Wednesday, January 23, 13

Page 36: Webinar Test-Driven JavaScript

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

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

SETUP

Wednesday, January 23, 13

Page 39: Webinar Test-Driven JavaScript

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

Wednesday, January 23, 13

Page 41: Webinar Test-Driven JavaScript

Na����������� ������������������  dann����������� ������������������  mal����������� ������������������  los!

Wednesday, January 23, 13

Page 42: Webinar Test-Driven JavaScript

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

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

red

Wednesday, January 23, 13

Page 45: Webinar Test-Driven JavaScript

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

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

var fizzbuzz = function () { "use strict"; return 1;};

Wednesday, January 23, 13

Page 48: Webinar Test-Driven JavaScript

green

Wednesday, January 23, 13

Page 49: Webinar Test-Driven JavaScript

TRIANGULATION

•Mehrere Tests mit verschiedenen Werten

• Klare Implementierung

• Saubere Abstraktion

• Tests mit Grenzwerten

Wednesday, January 23, 13

Page 50: Webinar Test-Driven JavaScript

it("should return 2, if 2 is provided", function () { expect(fizzbuzz(2)).toEqual(2);});

Wednesday, January 23, 13

Page 51: Webinar Test-Driven JavaScript

red

Wednesday, January 23, 13

Page 52: Webinar Test-Driven JavaScript

var fizzbuzz = function (n) { "use strict"; return n;};

Wednesday, January 23, 13

Page 53: Webinar Test-Driven JavaScript

green

Wednesday, January 23, 13

Page 54: Webinar Test-Driven JavaScript

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

BABY STEPS

•Die kleinst möglichen Schritte

• Sehr kurze Feedback-Scheifen

• Schnelle, übersichtliche Tests

Wednesday, January 23, 13

Page 56: Webinar Test-Driven JavaScript

it("should return fizz, if 3 is provided", function () { expect(fizzbuzz(3)).toEqual('fizz');});

Wednesday, January 23, 13

Page 57: Webinar Test-Driven JavaScript

red

Wednesday, January 23, 13

Page 58: Webinar Test-Driven JavaScript

var fizzbuzz = function (n) { "use strict";

if (n === 3) { return 'fizz'; }

return n;};

Wednesday, January 23, 13

Page 59: Webinar Test-Driven JavaScript

green

Wednesday, January 23, 13

Page 60: Webinar Test-Driven JavaScript

THREE OUT OF FOUR

• Stabiler Codestand

•Maximal eine Änderung entfernt von grünen Tests

Wednesday, January 23, 13

Page 61: Webinar Test-Driven JavaScript

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

it("should return fizz, if 6 is provided", function () { expect(fizzbuzz(6)).toEqual('fizz');});

Wednesday, January 23, 13

Page 63: Webinar Test-Driven JavaScript

red

Wednesday, January 23, 13

Page 64: Webinar Test-Driven JavaScript

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

green

Wednesday, January 23, 13

Page 66: Webinar Test-Driven JavaScript

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

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

green

Wednesday, January 23, 13

Page 69: Webinar Test-Driven JavaScript

REMOVE DUPLICATION

• Bessere Wartbarkeit

• Übersichtlicher Quellcode

• Teure Weiterentwicklung

Wednesday, January 23, 13

Page 70: Webinar Test-Driven JavaScript

GOLDEN MASTER

• kompletter Systemtest

• Generierter oder manueller Test

• bei umfangreicheren Workflows sehr aufwändig

Wednesday, January 23, 13

Page 71: Webinar Test-Driven JavaScript

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

green

Wednesday, January 23, 13

Page 73: Webinar Test-Driven JavaScript

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

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

Fragen?

Wednesday, January 23, 13

Page 76: Webinar Test-Driven JavaScript

VIELEN DANK!Sebastian Springer

Mayflower GmbHMannhardtstr. 680538 MünchenDeutschland

@basti_springer

https://github.com/sspringer82

Wednesday, January 23, 13