SlideShare ist ein Scribd-Unternehmen logo
1 von 128
Downloaden Sie, um offline zu lesen
TESTDRIVEN JAVASCRIPT
                       DEVELOPMENT



Monday, October 15, 12
WER BIN ICH?


    • Sebastian          Springer

    • 29

    • Dipl. Inf. (FH)

    • Developer           @ Mayflower



Monday, October 15, 12
MARTIN RUPRECHT


    • Martin             Ruprecht

    • 34

    • Dipl. Ing. (FH)

    • Developer             @ Mayflower



Monday, October 15, 12
WER SEID IHR?




Monday, October 15, 12
AGENDA


    • Was            ist ein Unittest?

    • Welche Testframeworks               gibt es?

    • Wie            funktioniert TDD?

    • Was            sind Spies, Stubs und Mocks



Monday, October 15, 12
LET’S GO




Monday, October 15, 12
GRUNDLAGEN




Monday, October 15, 12
WAS SIND UNITTESTS?




Monday, October 15, 12
FEEDBACK


          • klar, unmittelbar     und wiederkehrend

          • je      schneller / früher, umso weniger Fehler

          • weniger       böse Überraschungen




Monday, October 15, 12
DOKUMENTATION



         • Prüfen        nicht nur Funktionalität

         • Dokumentieren          die Verwendung von Schnittstellen




Monday, October 15, 12
BASIS FÜR CONTINUOUS
                      INTEGRATION




Monday, October 15, 12
ANFORDERUNGEN
                          AN UNITTESTS



Monday, October 15, 12
ANFORDERUNGEN
    • Isoliert

    • Nur           ein Testfall

    • Automatisiert

    • Kurz           & verständlich

    • Hohe               Qualität

    • Nur           relevanter Code

    • Schnell


Monday, October 15, 12
ISOLIERT

    • Keine Abhängigkeiten             zwischen den Tests

    • Keine Abhängigkeiten             zu anderen Systemen

    • Beeinflussen            sich nicht gegenseitig (Fehlschläge)

    • Reihenfolge            ist nicht relevant

    • Müssen             ein sauberes System hinterlassen


Monday, October 15, 12
NUR EIN TESTFALL



    • Nur           eine logische Einheit

    • Ein Test           schlägt nicht aus verschiedenen Grunden fehl




Monday, October 15, 12
AUTOMATISIERT


    • Keine              Nutzerinteraktion

    • Durchläufe              werden automatisiert gestartet

    • Lokale             und globale Ausführung




Monday, October 15, 12
KURZ & VERSTÄNDLICH


    • Übersichtlich

    • Dokumentierend

    • Wartungsfreundlich

    • Nicht              unnötig komplex



Monday, October 15, 12
HOHE QUALITÄT


    • Langlebige Tests

    • Gleiche            Qualitätsmaßstäbe wie an normalen Code

    • Wartbarkeit

    • Erweiterbarkeit




Monday, October 15, 12
NUR RELEVANTER CODE


    • Ziel         ist nicht 100% Coverage

    • Keine              Getter & Setter Testen

    • Kosten-Nutzen-Relation

    • Keine              Software-Prototypen testen



Monday, October 15, 12
“Tests, die lange laufen, werden
                nicht oft ausgeführt”
                         Kent Beck




Monday, October 15, 12
SCHNELL


    • Langsame Tests             - ein Teufelskreis:

         • Tests         werden nicht ausgefüht,

         • Funktionalität         wird nicht geprüft,

         • Qualität         leidet!



Monday, October 15, 12
WIE SCHREIBE ICH EINEN
                          TEST?

    • 3A         - Vorgehen beim Schreiben von Tests:

         • Arrange: Erstelle      die Objekte

         • Act: Interagiere    mit ihnen

         • Assert: Prüfe      das Ergebnis



Monday, October 15, 12
UNITTESTS FÜR JAVASCRIPT?




Monday, October 15, 12
FRAMEWORKS




Monday, October 15, 12
Sinon.js
                         FRAMEWORKS




Monday, October 15, 12
jsunit


        Sinon.js
                           FRAMEWORKS




Monday, October 15, 12
jsunit


        Sinon.js
                           FRAMEWORKS
                                  doh




Monday, October 15, 12
jsunit


        Sinon.js
                           FRAMEWORKS
                                        JS Test Driver
                                  doh




Monday, October 15, 12
jsunit
                                        qunit
        Sinon.js
                           FRAMEWORKS
                                                JS Test Driver
                                  doh




Monday, October 15, 12
jsunit
                                              qunit
        Sinon.js
                                   FRAMEWORKS
                         Jasmine                      JS Test Driver
                                        doh




Monday, October 15, 12
jsunit
                                              qunit
                                                      Siesta
        Sinon.js
                                   FRAMEWORKS
                         Jasmine                      JS Test Driver
                                        doh




Monday, October 15, 12
QUNIT



Monday, October 15, 12
QUNIT

    • http://qunitjs.com/

    • Testframework          von jQuery

    • Standalone         Browser Testing

    • Integration        in IDE und CI




Monday, October 15, 12
QUNIT - STRUKTUR


    • qunit.js

    • qunit.css

    • index.html

    • test.js




Monday, October 15, 12
QUNIT - INDEX.HTML




Monday, October 15, 12
QUNIT - TEST.JS




Monday, October 15, 12
QUNIT - RESULTAT




Monday, October 15, 12
QUNIT - ASSERTS

    • ok()

    • equal()

    • strictEqual()

    • deepEqual()

    • not...Equal()




Monday, October 15, 12
Monday, October 15, 12
JASMINE

    • http://pivotal.github.com/jasmine/

    • Unabhängiges Testframework

    • BDD                in Javascript

    • Standalone               Browser Testing

    • Integration              in IDE und CI

    • Aktuell              der defacto Standard

Monday, October 15, 12
JASMINE - STRUKTUR
    • jasmine.js

    • jasmine.css

    • jasmine-html.js

    • spec/

    • src/

    • SpecRunner.html


Monday, October 15, 12
JASMINE - SPECRUNNER




Monday, October 15, 12
JASMINE - SPECRUNNER




Monday, October 15, 12
JASMINE - SRC




Monday, October 15, 12
JASMINE - SPEC




Monday, October 15, 12
JASMINE - RESULTAT




Monday, October 15, 12
JASMINE - ASSERTS

    • expect(a).toEqual(b);

    • expect(a).toMatch(/foo/);

    • expect(a).toBeDefined();

    • expect(a).toBeTruthy();

    • exptect(a).toThrow();

    • expect(a).not.toEqual(b);

Monday, October 15, 12
JSTESTDRIVER




Monday, October 15, 12
JS TESTDRIVER

    • http://code.google.com/p/js-test-driver/

    • Testserver            in Java

    • Remote              Browsercapturing

    • Integration           in die IDE

    • Plugins            für andere Frameworks

    • Kommunikation               über HTTP

Monday, October 15, 12
JSTESTDRIVER




Monday, October 15, 12
JSTESTDRIVER - STRUKTUR


    • src/

    • src-test/

    • jsTestDriver.conf




Monday, October 15, 12
JSTESTDRIVER - SRC




Monday, October 15, 12
JSTESTDRIVER - SRC-TEST




Monday, October 15, 12
JSTESTDRIVER - CONFIG




Monday, October 15, 12
JSTESTDRIVER -
                         INITIALISIERUNG
    • Server start:
      java -jar JsTestDriver.jar --port 9876

    • Browser öffnen (lokal):
      http://localhost:9876/capture

    • Browser öffnen (remote):
      http://172.16.0.15:9876/capture

    • Test start:
      java -jar JsTestDriver.jar --tests all

Monday, October 15, 12
JSTESTDRIVER - RESULTAT




Monday, October 15, 12
TESTDRIVEN DEVELOPMENT




Monday, October 15, 12
ONE PROBLEM A TIME




Monday, October 15, 12
WAS IST TDD?

    • Iterativer Ansatz

    • Eckpfeiler            der agilen Softwareentwicklung

    • Gegensatz              zum klassichen Vorgehen

         • kein          großes Design zu Beginn

         • Änderungen           durch Refactorings



Monday, October 15, 12
WAS IST TDD

    • Besser              als: “Debug later programming”

    • Führt              zu: “Clean code that works”

    • Sorgt              für: “high code coverage with tests”




Monday, October 15, 12
WAS IST TDD

    • Besser              als: “Debug later programming”

    • Führt              zu: “Clean code that works”

    • Sorgt              für: “high code coverage with tests”


                            ABER: muss erlernt und geübt werden


Monday, October 15, 12
VERKEHRTE WELT

    • Klassische
        Softwareentwicklung

         • Erst          der Code


         • Dann     die Tests
             (...wenn noch Zeit ist)




Monday, October 15, 12
VERKEHRTE WELT

    • Klassische                       • Testgetriebene
        Softwareentwicklung             Softwareentwicklng

         • Erst          der Code       • Zuerst  die Tests
                                          (hier haben wir noch Zeit)

         • Dann     die Tests           • Dann   der Code
             (...wenn noch Zeit ist)




Monday, October 15, 12
TDD FEELS GOOD




Monday, October 15, 12
SETUP
                         PHPStorm, JsTestDriver, Jasmine




Monday, October 15, 12
SETUP - PHPSTORM




Monday, October 15, 12
SETUP - PHPSTORM




Monday, October 15, 12
SETUP - DATEIEN


    • jasmine.js

         • https://github.com/pivotal/jasmine/downloads

    • JasmineAdapter.js

         • https://github.com/ibolmo/jasmine-jstd-adapter




Monday, October 15, 12
SETUP - KONFIGURATION




Monday, October 15, 12
TDD APPLIED




Monday, October 15, 12
Monday, October 15, 12
RED




Monday, October 15, 12
TDD - RED




Monday, October 15, 12
TDD - RED




Monday, October 15, 12
GREEN




Monday, October 15, 12
TDD - GREEN




Monday, October 15, 12
TDD - GREEN




Monday, October 15, 12
REFACTOR




Monday, October 15, 12
TDD - REFACTOR




Monday, October 15, 12
TDD - REFACTOR




Monday, October 15, 12
FRAGEN?




Monday, October 15, 12
DEMO
                         Fizz Buzz




Monday, October 15, 12
FORTGESCHRITTENE THEMEN




Monday, October 15, 12
TEST PATTERNS
                          Strategien für das Testen




Monday, October 15, 12
WAS WIRD GETESTET?


                         “Everything that could possibly break!”
                                      Ron Jeffries




Monday, October 15, 12
BABY STEPS
    • Ziel: die           einfachste Lösung

    • Test   & Code: so kleine Schritte wie möglich
        (nichts überspringen)

    • Faustformel: ein Assert           pro Step

    • Vorteile:

         • sehr          kurze Feedback-Schleife

         • schnelle, übersichtliche Tests


Monday, October 15, 12
FAKE IT ‘TIL YOU MAKE IT
    • Ziel: effiziente          Entwicklung

    • Test          & Code: Umsetzung mit fixen Werten

    • Faustformel: Duplikate            erkennen und entfernen

    • Vorteile:

         • Tests         sehr schnell grün

         • Kein          Over-Engineering

         • Sehr          wenig Code

Monday, October 15, 12
TRIANGULATION


    • Ziel:

    • Test          & Code

    • Faustformel

    • Vorteile




Monday, October 15, 12
TRIANGULATION

    • Ziel: Operationen           abstrahieren

    • Faustformel: Mehrere Tests           mit verschiedenen Werten für eine
        Funktionalität

    • Vorteile

         • Klare         Implementierung

         • Saubere Abstraktion


Monday, October 15, 12
OBVIOUS IMPLEMENTATION


    • Ziel: Zeitersparnis, keine        unnötigen Tests

    • Test          & Code: Keine Tests für trivialen Code

    • Faustformel: Wird  man von einem roten Test überrascht: gehe
        zurück zu Los und ziehe keine 2.000 EUR.



Monday, October 15, 12
THREE OUT OF FOUR

    • Ziel: Stets         ein Stabiler Stand

    • Faustformel: Sei  nie mehr als eine Änderung von einem
        grünen Test entfernt

    • Vorteile:

         • Sicherer       und stabiler Code


Monday, October 15, 12
GOLDEN MASTER


    • Ziel: Finaler Test

    • Test  & Code: Manuell geschriebene oder generierte
        Erwartung

    • Faustformel: Man     kann nur mit einem kompletten Systemtest
        sicher sein



Monday, October 15, 12
SPIES, STUBS & MOCKS




Monday, October 15, 12
SINON.JS




Monday, October 15, 12
SINON.JS
    • http://sinonjs.org/releases/sinon-1.4.2.js

    • Testing             Framework

    • Spies, Stubs            und Mocks

    • Timers

    • Servers

    • Sandboxes

    • Kann               mit anderen Frameworks eingesetzt werden

Monday, October 15, 12
SPIES




Monday, October 15, 12
SPIES

    The Test Spy is designed to act as an observation point by
   recording the method calls made to it by the system under
                       test as it is exercised.

                         (xUnit Test Patterns)




Monday, October 15, 12
SPIES - EIGENSCHAFTEN


    • Wrapper               um eine Funktion

    • Aufrufe             werden gespeichert

    • Spy-Objekt              kann später abgefragt werden

    • Sollte             nach Verwendung wieder zurückgesetzt werden



Monday, October 15, 12
SPIES - ERSTELLUNG

    •   var spy = sinon.spy();
        Anonymer Spy - z.B. für Callbacks

    •   var spy = sinon.spy(myFunc);
        Spy um eine Funktion

    •   var spy = sinon.spy(object, “myFunc”);
        Spy um eine Methode eines Objekts


Monday, October 15, 12
SPIES - API
    • spy.called          - wurde der Spy aufgerufen

    • spy.callCount           - wie oft wurde der Spy aufgerufen

    • spy.calledWith()           - wurde der Spy mit diesen Argumenten
        aufgerufen

    • spy.withArg()           - Spy nur für bestimmte Argumente

    • spy.args           - Argumente sämtlicher Calls als Array

    • spy.threw()           - Wurde eine Exception geworfen

Monday, October 15, 12
SPIES - DEMO




Monday, October 15, 12
STUBS




Monday, October 15, 12
STUBS

The Test Stub replaces a real object with a test-specific object
 that feeds the desired indirect inputs into the system under
                              test.

                         (xUnit Test Patterns)




Monday, October 15, 12
STUBS - EIGENSCHAFTEN


    • Wrapper               um eine Funktion (Erweitern die Spy-API)

    • Vordefiniertes Verhalten

    • Wird               verwendet um ein bestimmtes Verhalten zu erzwingen

    • Vermeiden, dass             eine Methode aufgerufen wird (z.B. xhr)



Monday, October 15, 12
STUBS - ERSTELLUNG


    • var        stub = sinon.stub();

    • var        stub = sinon.stub(object, “method”);

    • var        stub = sinon.stub(object, “method”, func);

    • var        stub = sinon.stub(object);



Monday, October 15, 12
STUBS - API


    • stub.returns(obj);

         • stub.withArgs(“hello   world”).returns(42);

    • stub.throws(obj);

    • stub.yields();




Monday, October 15, 12
STUBS - YIELDS
       Ruft einen Callback mit den angegeben Argumenten auf
 var todoList = {
     getItem: function (id, callback) {
         // ...
     }
 };

 var values = { id: 1, text: "foo", isDone: false };
 sinon.stub(todoList, "getItem").yields(values);

 todoList.getItem(1, function (item) {
     assertEquals(item, { id: 1, text: "foo",
 isDone: false });
 });
Monday, October 15, 12
STUBS - DEMO




Monday, October 15, 12
MOCKS




Monday, October 15, 12
MOCKS

   The mock replaces an object the system under test depends on
  with a test-specific object that verifies it is being used correctly by
                        the system under test.

                         (xUnit Test Patterns)




Monday, October 15, 12
MOCKS - EIGENSCHAFTEN


    • Wrapper            um eine Funktion (wie ein Spy)

    • Wird   verwendet, um zu prüfen, ob eine Funktion korrekt
        benutzt wird

    • Generell           maximal ein Mock pro Unittest



Monday, October 15, 12
MOCKS - ERSTELLUNG



    • var        mock = sinon.mock(obj)




Monday, October 15, 12
MOCKS - API

    • var        expectation = expects(‘method’);

    • expectation.once

    • expectation.atLeast(n)

    • expectation.atMost(m)

    • expectation.withArgs(arg, arg,...)



Monday, October 15, 12
TIMERS & FAKE SERVERS




Monday, October 15, 12
TIMERS


    • Für         zeitkritische Tests

    • Browserzeit          ist nicht Zuverlässig

    • Für         solide Tests braucht man seine eigene Uhr




Monday, October 15, 12
TIMERS




Monday, October 15, 12
SINON HÄLT DIE ZEIT AN




Monday, October 15, 12
TIMERS IN SINON


    • var        clock = sinon.useFakeTimers();

    • var        clock = sinon.useFakeTimers(now);

    • clock.tick(ms);

    • clock.restore();




Monday, October 15, 12
TIMER




Monday, October 15, 12
FAKE SERVER




Monday, October 15, 12
FAKE SERVER


    • Tests              unabhängig vom Server

    • Rückmeldung               vom Server festlegen

    • Überschreibt              das native XMLHttpReqest und ActiveXObject




Monday, October 15, 12
FAKE SERVER - API


    • var        server = sinon.fakeServer.create();

    • server.respondWith(meth, url, response);

    • server.respond();

    • server.restore();




Monday, October 15, 12
FAKE SERVER




Monday, October 15, 12
FRAGEN?




Monday, October 15, 12
WIE GEHT ES JETZT WEITER?


    • Nimm               teil an einem Coding Dojo

    • Führe              Coding Katas durch

    • Pair         Programming

    • Austausch              mit anderen Entwicklern



Monday, October 15, 12
TIPPS & TRICKS




Monday, October 15, 12
CHEAT SHEET
    •   Write a failing Test             •   Triangulate

    •   Write the simplest code to       •   Keep your test and model
        test                                 code separate

    •   Refactor to remove duplication   •   Isolate your tests

    •   Write the assertion first and     •   Test should test one thing
        work backwards
                                         •   Don’t refactor with a failing
    •   See the test fail                    test

    •   Write meaningful tests           •   Maintain your Tests

Monday, October 15, 12
KONTAKT
  Sebastian Springer                Martin Ruprecht
  sebastian.springer@mayflower.de   martin.ruprecht@mayflower.de

  Mayflower GmbH                    Mayflower GmbH
  Mannhardtstr. 6                   Mannhardtstr. 6
  80538 München                     80538 München
  Deutschland                       Deutschland

  @basti_springer                   @mrupilo

  https://github.com/sspringer82    https://github.com/mruprecht




Monday, October 15, 12

Weitere ähnliche Inhalte

Andere mochten auch

ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebSebastian Springer
 
Actividad 2 unidad 4
Actividad 2 unidad 4Actividad 2 unidad 4
Actividad 2 unidad 4Diana Vera
 
Professional Learning Communities and Student Achievement
Professional Learning Communities and Student Achievement Professional Learning Communities and Student Achievement
Professional Learning Communities and Student Achievement amooool2000
 
Ethernet Dedicated Internet Service
Ethernet Dedicated Internet ServiceEthernet Dedicated Internet Service
Ethernet Dedicated Internet ServiceMallory Zemelis
 
Herculano pires curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-
Herculano pires   curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-Herculano pires   curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-
Herculano pires curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-Helio Cruz
 
Deber de ruido cristina mogro
Deber de ruido cristina mogroDeber de ruido cristina mogro
Deber de ruido cristina mogrocrisymauro
 
Sabedoria do evangelho 5
Sabedoria do evangelho 5Sabedoria do evangelho 5
Sabedoria do evangelho 5Helio Cruz
 

Andere mochten auch (14)

JavaScript QA Tools
JavaScript QA ToolsJavaScript QA Tools
JavaScript QA Tools
 
Error handling in JavaScript
Error handling in JavaScriptError handling in JavaScript
Error handling in JavaScript
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im Produktivbetrieb
 
Angular translate
Angular translateAngular translate
Angular translate
 
Testing tools
Testing toolsTesting tools
Testing tools
 
Node.js
Node.jsNode.js
Node.js
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
 
Actividad 2 unidad 4
Actividad 2 unidad 4Actividad 2 unidad 4
Actividad 2 unidad 4
 
Professional Learning Communities and Student Achievement
Professional Learning Communities and Student Achievement Professional Learning Communities and Student Achievement
Professional Learning Communities and Student Achievement
 
Ethernet Dedicated Internet Service
Ethernet Dedicated Internet ServiceEthernet Dedicated Internet Service
Ethernet Dedicated Internet Service
 
Herculano pires curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-
Herculano pires   curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-Herculano pires   curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-
Herculano pires curso dinamico de espiritismo-.-ww w.livrosgratis.net-.-
 
Deber de ruido cristina mogro
Deber de ruido cristina mogroDeber de ruido cristina mogro
Deber de ruido cristina mogro
 
Sabedoria do evangelho 5
Sabedoria do evangelho 5Sabedoria do evangelho 5
Sabedoria do evangelho 5
 
Actividad 2 unidad 4
Actividad 2 unidad 4Actividad 2 unidad 4
Actividad 2 unidad 4
 

Mehr von Sebastian Springer

Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsSebastian Springer
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsSebastian Springer
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceSebastian Springer
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebSebastian Springer
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
 
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der WebentwicklungSebastian Springer
 

Mehr von Sebastian Springer (20)

Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
 
Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.js
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
A/B Testing mit Node.js
A/B Testing mit Node.jsA/B Testing mit Node.js
A/B Testing mit Node.js
 
Angular2
Angular2Angular2
Angular2
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Lean Startup mit JavaScript
Lean Startup mit JavaScriptLean Startup mit JavaScript
Lean Startup mit JavaScript
 
Node.js für Webapplikationen
Node.js für WebapplikationenNode.js für Webapplikationen
Node.js für Webapplikationen
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
JavaScript Architektur
JavaScript ArchitekturJavaScript Architektur
JavaScript Architektur
 
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
 
JavaScript Architektur
JavaScript ArchitekturJavaScript Architektur
JavaScript Architektur
 
Java scriptarchitektur
Java scriptarchitekturJava scriptarchitektur
Java scriptarchitektur
 

Testdriven javascript

  • 1. TESTDRIVEN JAVASCRIPT DEVELOPMENT Monday, October 15, 12
  • 2. WER BIN ICH? • Sebastian Springer • 29 • Dipl. Inf. (FH) • Developer @ Mayflower Monday, October 15, 12
  • 3. MARTIN RUPRECHT • Martin Ruprecht • 34 • Dipl. Ing. (FH) • Developer @ Mayflower Monday, October 15, 12
  • 4. WER SEID IHR? Monday, October 15, 12
  • 5. AGENDA • Was ist ein Unittest? • Welche Testframeworks gibt es? • Wie funktioniert TDD? • Was sind Spies, Stubs und Mocks Monday, October 15, 12
  • 9. FEEDBACK • klar, unmittelbar und wiederkehrend • je schneller / früher, umso weniger Fehler • weniger böse Überraschungen Monday, October 15, 12
  • 10. DOKUMENTATION • Prüfen nicht nur Funktionalität • Dokumentieren die Verwendung von Schnittstellen Monday, October 15, 12
  • 11. BASIS FÜR CONTINUOUS INTEGRATION Monday, October 15, 12
  • 12. ANFORDERUNGEN AN UNITTESTS Monday, October 15, 12
  • 13. ANFORDERUNGEN • Isoliert • Nur ein Testfall • Automatisiert • Kurz & verständlich • Hohe Qualität • Nur relevanter Code • Schnell Monday, October 15, 12
  • 14. ISOLIERT • Keine Abhängigkeiten zwischen den Tests • Keine Abhängigkeiten zu anderen Systemen • Beeinflussen sich nicht gegenseitig (Fehlschläge) • Reihenfolge ist nicht relevant • Müssen ein sauberes System hinterlassen Monday, October 15, 12
  • 15. NUR EIN TESTFALL • Nur eine logische Einheit • Ein Test schlägt nicht aus verschiedenen Grunden fehl Monday, October 15, 12
  • 16. AUTOMATISIERT • Keine Nutzerinteraktion • Durchläufe werden automatisiert gestartet • Lokale und globale Ausführung Monday, October 15, 12
  • 17. KURZ & VERSTÄNDLICH • Übersichtlich • Dokumentierend • Wartungsfreundlich • Nicht unnötig komplex Monday, October 15, 12
  • 18. HOHE QUALITÄT • Langlebige Tests • Gleiche Qualitätsmaßstäbe wie an normalen Code • Wartbarkeit • Erweiterbarkeit Monday, October 15, 12
  • 19. NUR RELEVANTER CODE • Ziel ist nicht 100% Coverage • Keine Getter & Setter Testen • Kosten-Nutzen-Relation • Keine Software-Prototypen testen Monday, October 15, 12
  • 20. “Tests, die lange laufen, werden nicht oft ausgeführt” Kent Beck Monday, October 15, 12
  • 21. SCHNELL • Langsame Tests - ein Teufelskreis: • Tests werden nicht ausgefüht, • Funktionalität wird nicht geprüft, • Qualität leidet! Monday, October 15, 12
  • 22. WIE SCHREIBE ICH EINEN TEST? • 3A - Vorgehen beim Schreiben von Tests: • Arrange: Erstelle die Objekte • Act: Interagiere mit ihnen • Assert: Prüfe das Ergebnis Monday, October 15, 12
  • 25. Sinon.js FRAMEWORKS Monday, October 15, 12
  • 26. jsunit Sinon.js FRAMEWORKS Monday, October 15, 12
  • 27. jsunit Sinon.js FRAMEWORKS doh Monday, October 15, 12
  • 28. jsunit Sinon.js FRAMEWORKS JS Test Driver doh Monday, October 15, 12
  • 29. jsunit qunit Sinon.js FRAMEWORKS JS Test Driver doh Monday, October 15, 12
  • 30. jsunit qunit Sinon.js FRAMEWORKS Jasmine JS Test Driver doh Monday, October 15, 12
  • 31. jsunit qunit Siesta Sinon.js FRAMEWORKS Jasmine JS Test Driver doh Monday, October 15, 12
  • 33. QUNIT • http://qunitjs.com/ • Testframework von jQuery • Standalone Browser Testing • Integration in IDE und CI Monday, October 15, 12
  • 34. QUNIT - STRUKTUR • qunit.js • qunit.css • index.html • test.js Monday, October 15, 12
  • 35. QUNIT - INDEX.HTML Monday, October 15, 12
  • 36. QUNIT - TEST.JS Monday, October 15, 12
  • 37. QUNIT - RESULTAT Monday, October 15, 12
  • 38. QUNIT - ASSERTS • ok() • equal() • strictEqual() • deepEqual() • not...Equal() Monday, October 15, 12
  • 40. JASMINE • http://pivotal.github.com/jasmine/ • Unabhängiges Testframework • BDD in Javascript • Standalone Browser Testing • Integration in IDE und CI • Aktuell der defacto Standard Monday, October 15, 12
  • 41. JASMINE - STRUKTUR • jasmine.js • jasmine.css • jasmine-html.js • spec/ • src/ • SpecRunner.html Monday, October 15, 12
  • 44. JASMINE - SRC Monday, October 15, 12
  • 45. JASMINE - SPEC Monday, October 15, 12
  • 46. JASMINE - RESULTAT Monday, October 15, 12
  • 47. JASMINE - ASSERTS • expect(a).toEqual(b); • expect(a).toMatch(/foo/); • expect(a).toBeDefined(); • expect(a).toBeTruthy(); • exptect(a).toThrow(); • expect(a).not.toEqual(b); Monday, October 15, 12
  • 49. JS TESTDRIVER • http://code.google.com/p/js-test-driver/ • Testserver in Java • Remote Browsercapturing • Integration in die IDE • Plugins für andere Frameworks • Kommunikation über HTTP Monday, October 15, 12
  • 51. JSTESTDRIVER - STRUKTUR • src/ • src-test/ • jsTestDriver.conf Monday, October 15, 12
  • 52. JSTESTDRIVER - SRC Monday, October 15, 12
  • 55. JSTESTDRIVER - INITIALISIERUNG • Server start: java -jar JsTestDriver.jar --port 9876 • Browser öffnen (lokal): http://localhost:9876/capture • Browser öffnen (remote): http://172.16.0.15:9876/capture • Test start: java -jar JsTestDriver.jar --tests all Monday, October 15, 12
  • 58. ONE PROBLEM A TIME Monday, October 15, 12
  • 59. WAS IST TDD? • Iterativer Ansatz • Eckpfeiler der agilen Softwareentwicklung • Gegensatz zum klassichen Vorgehen • kein großes Design zu Beginn • Änderungen durch Refactorings Monday, October 15, 12
  • 60. WAS IST TDD • Besser als: “Debug later programming” • Führt zu: “Clean code that works” • Sorgt für: “high code coverage with tests” Monday, October 15, 12
  • 61. WAS IST TDD • Besser als: “Debug later programming” • Führt zu: “Clean code that works” • Sorgt für: “high code coverage with tests” ABER: muss erlernt und geübt werden Monday, October 15, 12
  • 62. VERKEHRTE WELT • Klassische Softwareentwicklung • Erst der Code • Dann die Tests (...wenn noch Zeit ist) Monday, October 15, 12
  • 63. VERKEHRTE WELT • Klassische • Testgetriebene Softwareentwicklung Softwareentwicklng • Erst der Code • Zuerst die Tests (hier haben wir noch Zeit) • Dann die Tests • Dann der Code (...wenn noch Zeit ist) Monday, October 15, 12
  • 64. TDD FEELS GOOD Monday, October 15, 12
  • 65. SETUP PHPStorm, JsTestDriver, Jasmine Monday, October 15, 12
  • 66. SETUP - PHPSTORM Monday, October 15, 12
  • 67. SETUP - PHPSTORM Monday, October 15, 12
  • 68. SETUP - DATEIEN • jasmine.js • https://github.com/pivotal/jasmine/downloads • JasmineAdapter.js • https://github.com/ibolmo/jasmine-jstd-adapter Monday, October 15, 12
  • 73. TDD - RED Monday, October 15, 12
  • 74. TDD - RED Monday, October 15, 12
  • 76. TDD - GREEN Monday, October 15, 12
  • 77. TDD - GREEN Monday, October 15, 12
  • 79. TDD - REFACTOR Monday, October 15, 12
  • 80. TDD - REFACTOR Monday, October 15, 12
  • 82. DEMO Fizz Buzz Monday, October 15, 12
  • 84. TEST PATTERNS Strategien für das Testen Monday, October 15, 12
  • 85. WAS WIRD GETESTET? “Everything that could possibly break!” Ron Jeffries Monday, October 15, 12
  • 86. BABY STEPS • Ziel: die einfachste Lösung • Test & Code: so kleine Schritte wie möglich (nichts überspringen) • Faustformel: ein Assert pro Step • Vorteile: • sehr kurze Feedback-Schleife • schnelle, übersichtliche Tests Monday, October 15, 12
  • 87. FAKE IT ‘TIL YOU MAKE IT • Ziel: effiziente Entwicklung • Test & Code: Umsetzung mit fixen Werten • Faustformel: Duplikate erkennen und entfernen • Vorteile: • Tests sehr schnell grün • Kein Over-Engineering • Sehr wenig Code Monday, October 15, 12
  • 88. TRIANGULATION • Ziel: • Test & Code • Faustformel • Vorteile Monday, October 15, 12
  • 89. TRIANGULATION • Ziel: Operationen abstrahieren • Faustformel: Mehrere Tests mit verschiedenen Werten für eine Funktionalität • Vorteile • Klare Implementierung • Saubere Abstraktion Monday, October 15, 12
  • 90. OBVIOUS IMPLEMENTATION • Ziel: Zeitersparnis, keine unnötigen Tests • Test & Code: Keine Tests für trivialen Code • Faustformel: Wird man von einem roten Test überrascht: gehe zurück zu Los und ziehe keine 2.000 EUR. Monday, October 15, 12
  • 91. THREE OUT OF FOUR • Ziel: Stets ein Stabiler Stand • Faustformel: Sei nie mehr als eine Änderung von einem grünen Test entfernt • Vorteile: • Sicherer und stabiler Code Monday, October 15, 12
  • 92. GOLDEN MASTER • Ziel: Finaler Test • Test & Code: Manuell geschriebene oder generierte Erwartung • Faustformel: Man kann nur mit einem kompletten Systemtest sicher sein Monday, October 15, 12
  • 93. SPIES, STUBS & MOCKS Monday, October 15, 12
  • 95. SINON.JS • http://sinonjs.org/releases/sinon-1.4.2.js • Testing Framework • Spies, Stubs und Mocks • Timers • Servers • Sandboxes • Kann mit anderen Frameworks eingesetzt werden Monday, October 15, 12
  • 97. SPIES The Test Spy is designed to act as an observation point by recording the method calls made to it by the system under test as it is exercised. (xUnit Test Patterns) Monday, October 15, 12
  • 98. SPIES - EIGENSCHAFTEN • Wrapper um eine Funktion • Aufrufe werden gespeichert • Spy-Objekt kann später abgefragt werden • Sollte nach Verwendung wieder zurückgesetzt werden Monday, October 15, 12
  • 99. SPIES - ERSTELLUNG • var spy = sinon.spy(); Anonymer Spy - z.B. für Callbacks • var spy = sinon.spy(myFunc); Spy um eine Funktion • var spy = sinon.spy(object, “myFunc”); Spy um eine Methode eines Objekts Monday, October 15, 12
  • 100. SPIES - API • spy.called - wurde der Spy aufgerufen • spy.callCount - wie oft wurde der Spy aufgerufen • spy.calledWith() - wurde der Spy mit diesen Argumenten aufgerufen • spy.withArg() - Spy nur für bestimmte Argumente • spy.args - Argumente sämtlicher Calls als Array • spy.threw() - Wurde eine Exception geworfen Monday, October 15, 12
  • 101. SPIES - DEMO Monday, October 15, 12
  • 103. STUBS The Test Stub replaces a real object with a test-specific object that feeds the desired indirect inputs into the system under test. (xUnit Test Patterns) Monday, October 15, 12
  • 104. STUBS - EIGENSCHAFTEN • Wrapper um eine Funktion (Erweitern die Spy-API) • Vordefiniertes Verhalten • Wird verwendet um ein bestimmtes Verhalten zu erzwingen • Vermeiden, dass eine Methode aufgerufen wird (z.B. xhr) Monday, October 15, 12
  • 105. STUBS - ERSTELLUNG • var stub = sinon.stub(); • var stub = sinon.stub(object, “method”); • var stub = sinon.stub(object, “method”, func); • var stub = sinon.stub(object); Monday, October 15, 12
  • 106. STUBS - API • stub.returns(obj); • stub.withArgs(“hello world”).returns(42); • stub.throws(obj); • stub.yields(); Monday, October 15, 12
  • 107. STUBS - YIELDS Ruft einen Callback mit den angegeben Argumenten auf var todoList = { getItem: function (id, callback) { // ... } }; var values = { id: 1, text: "foo", isDone: false }; sinon.stub(todoList, "getItem").yields(values); todoList.getItem(1, function (item) { assertEquals(item, { id: 1, text: "foo", isDone: false }); }); Monday, October 15, 12
  • 108. STUBS - DEMO Monday, October 15, 12
  • 110. MOCKS The mock replaces an object the system under test depends on with a test-specific object that verifies it is being used correctly by the system under test. (xUnit Test Patterns) Monday, October 15, 12
  • 111. MOCKS - EIGENSCHAFTEN • Wrapper um eine Funktion (wie ein Spy) • Wird verwendet, um zu prüfen, ob eine Funktion korrekt benutzt wird • Generell maximal ein Mock pro Unittest Monday, October 15, 12
  • 112. MOCKS - ERSTELLUNG • var mock = sinon.mock(obj) Monday, October 15, 12
  • 113. MOCKS - API • var expectation = expects(‘method’); • expectation.once • expectation.atLeast(n) • expectation.atMost(m) • expectation.withArgs(arg, arg,...) Monday, October 15, 12
  • 114. TIMERS & FAKE SERVERS Monday, October 15, 12
  • 115. TIMERS • Für zeitkritische Tests • Browserzeit ist nicht Zuverlässig • Für solide Tests braucht man seine eigene Uhr Monday, October 15, 12
  • 117. SINON HÄLT DIE ZEIT AN Monday, October 15, 12
  • 118. TIMERS IN SINON • var clock = sinon.useFakeTimers(); • var clock = sinon.useFakeTimers(now); • clock.tick(ms); • clock.restore(); Monday, October 15, 12
  • 121. FAKE SERVER • Tests unabhängig vom Server • Rückmeldung vom Server festlegen • Überschreibt das native XMLHttpReqest und ActiveXObject Monday, October 15, 12
  • 122. FAKE SERVER - API • var server = sinon.fakeServer.create(); • server.respondWith(meth, url, response); • server.respond(); • server.restore(); Monday, October 15, 12
  • 125. WIE GEHT ES JETZT WEITER? • Nimm teil an einem Coding Dojo • Führe Coding Katas durch • Pair Programming • Austausch mit anderen Entwicklern Monday, October 15, 12
  • 126. TIPPS & TRICKS Monday, October 15, 12
  • 127. CHEAT SHEET • Write a failing Test • Triangulate • Write the simplest code to • Keep your test and model test code separate • Refactor to remove duplication • Isolate your tests • Write the assertion first and • Test should test one thing work backwards • Don’t refactor with a failing • See the test fail test • Write meaningful tests • Maintain your Tests Monday, October 15, 12
  • 128. KONTAKT Sebastian Springer Martin Ruprecht sebastian.springer@mayflower.de martin.ruprecht@mayflower.de Mayflower GmbH Mayflower GmbH Mannhardtstr. 6 Mannhardtstr. 6 80538 München 80538 München Deutschland Deutschland @basti_springer @mrupilo https://github.com/sspringer82 https://github.com/mruprecht Monday, October 15, 12