SlideShare a Scribd company logo
Javascript Unittesting with js-test-driver

                     Jakob Westhoff <jakob@php.net>
                            @jakobwesthoff



                            PHPBarcamp.at
                             May 2, 2010




http://westhoffswelt.de      jakob@westhoffswelt.de    slide: 1 / 31
About Me



        Jakob Westhoff

              PHP developer for several years
              Computer science student at the TU Dortmund

              Co-Founder of the PHP Usergroup Dortmund
              Active in different Open Source projects




http://westhoffswelt.de        jakob@westhoffswelt.de         slide: 2 / 31
Who is actively using TDD/Unittesting?




         Who uses unittesting?
         Who uses TDD?
         Who unittests javascript code?




 http://westhoffswelt.de     jakob@westhoffswelt.de   slide: 3 / 31
Who is actively using TDD/Unittesting?




         Who uses unittesting?
         Who uses TDD?
         Who unittests javascript code?




 http://westhoffswelt.de     jakob@westhoffswelt.de   slide: 3 / 31
Who is actively using TDD/Unittesting?




         Who uses unittesting?
         Who uses TDD?
         Who unittests javascript code?




 http://westhoffswelt.de     jakob@westhoffswelt.de   slide: 3 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
Goals of this session


      1   Getting to know js-test-driver
      2   Unittesting javascript
               Synchronous tests
               Asynchronous tests
      3   Run these tests
               From within a terminal
               From within Eclipse
      4   Create javascript code coverage reports




 http://westhoffswelt.de       jakob@westhoffswelt.de   slide: 4 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What is js-test-driver


         Javascript testrunner and framework
         Client/Server approach
               Server: js-test-driver
               Client: Browser
               Client: Testrunner

         Assertion framework
               Mostly xUnit compatible
               assertEquals
               assertSame
               assertTrue
               ...




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 5 / 31
What comes next?




                          Architecture



 http://westhoffswelt.de     jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Architecture of js-test-driver




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 6 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
Advantages of this design


         Run from possibly any IDE
               Commandline
               Eclipse
         Parallel execution of tests in multiple browsers
         Test execution on different machines with possibly different
         operating systems
         Website DOM not used for any testrunner output
         Browser independent code coverage reports (planned for a
         future release)




 http://westhoffswelt.de      jakob@westhoffswelt.de          slide: 7 / 31
What comes next?




                          Example



 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 8 / 31
A simple example




         Javascript application/function
         Testcase
         js-test-driver configuration file




 http://westhoffswelt.de      jakob@westhoffswelt.de   slide: 8 / 31
A simple example




         Javascript application/function
         Testcase
         js-test-driver configuration file




 http://westhoffswelt.de      jakob@westhoffswelt.de   slide: 8 / 31
A simple example




         Javascript application/function
         Testcase
         js-test-driver configuration file




 http://westhoffswelt.de      jakob@westhoffswelt.de   slide: 8 / 31
A simple example - Javascript



          Really simple hello world function:

      1   myApp = { } ;
      2
      3   myApp . H e l l o W o r l d = f u n c t i o n ( ) { } ;
      4
      5   myApp . H e l l o W o r l d . p r o t o t y p e . s a y H e l l o = f u n c t i o n ( ) {
      6       r e t u r n ” H e l l o World ! ” ;
      7   }




 http://westhoffswelt.de              jakob@westhoffswelt.de                        slide: 9 / 31
A simple example - Testcase

          Our first js-test-driver testcase:

      1    HelloWorldTest = TestCase ( ’ HelloWorld ’ ) ;
      2
      3    HelloWorldTest . p r o t o t y p e . setUp = f u n c t i o n ( ) {
      4         t h i s . h e l l o F i x t u r e = new myApp . H e l l o W o r l d ( ) ;
      5    }
      6
      7    HelloWorldTest . prototype . testOutput = function () {
      8      assertEquals (
      9         ” H e l l o World ! ” ,
     10         this . helloFixture . sayHello ()
     11      );
     12    }




 http://westhoffswelt.de             jakob@westhoffswelt.de                     slide: 10 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
Digression about test lifecycle


   The js-test-driver test lifecycle follows the JUnit lifecycle


      1   Instantiate new Testcase implementation
      2   Execute the setUp() method
      3   Execute the next testWhatever() method
      4   Execute the tearDown() method
      5   While tests left in testcase jump to   Step 1




 http://westhoffswelt.de       jakob@westhoffswelt.de          slide: 11 / 31
A simple example - js-test-driver configuration


          Every project needs a js-test-driver configuration file.
               Written in YAML
               Called jsTestDriver.conf by default

          js-test-driver configuration for our example:

      1    s e r v e r : http :// l o c a l h o s t :4224
      2
      3    load :
      4      − src / hello world . js
      5      − tests / hello world . js




 http://westhoffswelt.de            jakob@westhoffswelt.de     slide: 12 / 31
A simple example - js-test-driver configuration


          Every project needs a js-test-driver configuration file.
               Written in YAML
               Called jsTestDriver.conf by default

          js-test-driver configuration for our example:

      1    s e r v e r : http :// l o c a l h o s t :4224
      2
      3    load :
      4      − src / hello world . js
      5      − tests / hello world . js




 http://westhoffswelt.de            jakob@westhoffswelt.de     slide: 12 / 31
A simple example - js-test-driver configuration


          Every project needs a js-test-driver configuration file.
               Written in YAML
               Called jsTestDriver.conf by default

          js-test-driver configuration for our example:

      1    s e r v e r : http :// l o c a l h o s t :4224
      2
      3    load :
      4      − src / hello world . js
      5      − tests / hello world . js




 http://westhoffswelt.de            jakob@westhoffswelt.de     slide: 12 / 31
A simple example - js-test-driver configuration


          Every project needs a js-test-driver configuration file.
               Written in YAML
               Called jsTestDriver.conf by default

          js-test-driver configuration for our example:

      1    s e r v e r : http :// l o c a l h o s t :4224
      2
      3    load :
      4      − src / hello world . js
      5      − tests / hello world . js




 http://westhoffswelt.de            jakob@westhoffswelt.de     slide: 12 / 31
Run js-test-driver - Server


         Run the js-test-driver server

      j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224

         Capture the all browsers

      http :// l o c a l h o s t :4224/ capture

         Execute the testrunner

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s   all




 http://westhoffswelt.de               jakob@westhoffswelt.de                slide: 13 / 31
Run js-test-driver - Browser


         Run the js-test-driver server

      j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224

         Capture the all browsers

      http :// l o c a l h o s t :4224/ capture

         Execute the testrunner

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s   all




 http://westhoffswelt.de               jakob@westhoffswelt.de                slide: 13 / 31
Run js-test-driver - Testrunner


         Run the js-test-driver server

      j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224

         Capture the all browsers

      http :// l o c a l h o s t :4224/ capture

         Execute the testrunner

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s   all




 http://westhoffswelt.de               jakob@westhoffswelt.de                slide: 13 / 31
A simple example - Live Demo




   Hello World example

                          Live Demo!




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 14 / 31
Eclipse testrunner

         A testrunner plugin for Eclipse is available
         Available through eclipse plugin manager




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


 http://westhoffswelt.de      jakob@westhoffswelt.de      slide: 15 / 31
Eclipse testrunner

         A testrunner plugin for Eclipse is available
         Available through eclipse plugin manager




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


 http://westhoffswelt.de      jakob@westhoffswelt.de      slide: 15 / 31
Eclipse testrunner

         A testrunner plugin for Eclipse is available
         Available through eclipse plugin manager




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


 http://westhoffswelt.de      jakob@westhoffswelt.de      slide: 15 / 31
What comes next?




              Asynchronous tests



 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 16 / 31
Test asynchronous implementations


         Asynchronous timeouts
               setTimeout, setInterval
         Asynchronous callbacks
               XMLHttpRequest, onReady

   ”[...] JS test driver does not support asynchronous test. This was
   a conscious decision, as we want to make sure that the tests
   remain fast.”

                                      – Misko Hevery on Google groups




 http://westhoffswelt.de     jakob@westhoffswelt.de        slide: 16 / 31
Test asynchronous implementations


         Asynchronous timeouts
               setTimeout, setInterval
         Asynchronous callbacks
               XMLHttpRequest, onReady

   ”[...] JS test driver does not support asynchronous test. This was
   a conscious decision, as we want to make sure that the tests
   remain fast.”

                                      – Misko Hevery on Google groups




 http://westhoffswelt.de     jakob@westhoffswelt.de        slide: 16 / 31
Test asynchronous implementations


         Asynchronous timeouts
               setTimeout, setInterval
         Asynchronous callbacks
               XMLHttpRequest, onReady

   ”[...] JS test driver does not support asynchronous test. This was
   a conscious decision, as we want to make sure that the tests
   remain fast.”

                                      – Misko Hevery on Google groups




 http://westhoffswelt.de     jakob@westhoffswelt.de        slide: 16 / 31
Asynchronous timeouts


      window . s e t T i m e o u t (
         function () { . . . } ,
         3000
      );

         Use jsUnitMockTimeout.js
               http://jsunit.net

         Mocks setTimeout, setInterval, clearTimeout and
         clearInterval
         Timeflow can be controlled manually in tests




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 17 / 31
Asynchronous timeouts


      window . s e t T i m e o u t (
         function () { . . . } ,
         3000
      );

         Use jsUnitMockTimeout.js
               http://jsunit.net

         Mocks setTimeout, setInterval, clearTimeout and
         clearInterval
         Timeflow can be controlled manually in tests




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 17 / 31
Asynchronous timeouts


      window . s e t T i m e o u t (
         function () { . . . } ,
         3000
      );

         Use jsUnitMockTimeout.js
               http://jsunit.net

         Mocks setTimeout, setInterval, clearTimeout and
         clearInterval
         Timeflow can be controlled manually in tests




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 17 / 31
Asynchronous timeouts


      window . s e t T i m e o u t (
         function () { . . . } ,
         3000
      );

         Use jsUnitMockTimeout.js
               http://jsunit.net

         Mocks setTimeout, setInterval, clearTimeout and
         clearInterval
         Timeflow can be controlled manually in tests




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 17 / 31
Asynchronous timeouts


      window . s e t T i m e o u t (
         function () { . . . } ,
         3000
      );

         Use jsUnitMockTimeout.js
               http://jsunit.net

         Mocks setTimeout, setInterval, clearTimeout and
         clearInterval
         Timeflow can be controlled manually in tests




 http://westhoffswelt.de         jakob@westhoffswelt.de   slide: 17 / 31
jsUnitMockTimeout example - Stopwatch

          Simple stopwatch example:

      1   Stopwatch . s t a r t = f u n c t i o n ( ) {
      2     Stopwatch . c l e a r ( ) ;
      3     Stopwatch . t i m e r = s e t I n t e r v a l (
      4        S t o p w a t c h . advance ,
      5        1000
      6     );
      7   }
      8
      9   Stopwatch . advance        =   function    ()   {...}
     10   Stopwatch . s t o p        =   function    ()   {...}
     11   Stopwatch . c l e a r      =   function    ()   {...}
     12   Stopwatch . r e s u l t    =   function    ()   {...}




 http://westhoffswelt.de          jakob@westhoffswelt.de            slide: 18 / 31
jsUnitMockTimeout example - Test


          Test using jsUnitMockTimeout:

      1    StopwatchTest . pr o to t yp e . testTiming = f u n c t i o n ( ) {
      2      Clock . r e s e t () ;
      3      Stopwatch . s t a r t ( ) ;
      4      a s s e r t E q u a l s ( 0 , S to p w a t ch . r e s u l t ( ) ) ;
      5
      6       Clock . t i c k (5000) ;
      7       a s e r t E q u a l s ( 5 , S t o pw a t c h . r e s u l t ( ) ) ;
      8   }




 http://westhoffswelt.de                jakob@westhoffswelt.de                       slide: 19 / 31
Asynchronous callbacks


          Generalized callback mocks do not exist
          Mock the used function manually, calling the callback
          immediately

      1   xhr . send = f u n c t i o n ( data ) {
      2         // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s
                       directly
      3         t h i s . onReady ( someData ) ;
      4   }




 http://westhoffswelt.de           jakob@westhoffswelt.de                  slide: 20 / 31
Asynchronous callbacks


          Generalized callback mocks do not exist
          Mock the used function manually, calling the callback
          immediately

      1   xhr . send = f u n c t i o n ( data ) {
      2         // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s
                       directly
      3         t h i s . onReady ( someData ) ;
      4   }




 http://westhoffswelt.de           jakob@westhoffswelt.de                  slide: 20 / 31
Asynchronous callbacks


          Generalized callback mocks do not exist
          Mock the used function manually, calling the callback
          immediately

      1   xhr . send = f u n c t i o n ( data ) {
      2         // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s
                       directly
      3         t h i s . onReady ( someData ) ;
      4   }




 http://westhoffswelt.de           jakob@westhoffswelt.de                  slide: 20 / 31
What comes next?




                          Debugging



 http://westhoffswelt.de    jakob@westhoffswelt.de   slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging

          Use whatever javascript debugging technique you like!
                Firebug (Firefox)
                Visual Studio (IE)
                Web Inspector (Safari)
                ...

      1   Run the test you want to debug:

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t .
             testOutput

      2   Set breakpoints
      3   Rerun the test using the command above.



 http://westhoffswelt.de               jakob@westhoffswelt.de                         slide: 21 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Using the console

         A lot of javascript debuggers provide a console object

      c o n s o l e . l o g ( ” H e l l o World ! ” ) ;

         Redirect this output to js-test-driver

      j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s     a l l −−
             captureConsole

         Note: Does not work in Firefox

         Use jstestdriver.console directly

      j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ;




 http://westhoffswelt.de                jakob@westhoffswelt.de                        slide: 22 / 31
Debugging - Live Demo




   Debugging example

                          Live Demo!




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 23 / 31
What comes next?




              Automation and CI



 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 24 / 31
Test automation and continuous integration


         --testOutput parameter generates JUnit XML compatible
         test logs
                One XML for every used browser

      j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y
              −− t e s t s a l l

         --browser parameter runs and captures browsers
         automatically

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 24 / 31
Test automation and continuous integration


         --testOutput parameter generates JUnit XML compatible
         test logs
                One XML for every used browser

      j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y
              −− t e s t s a l l

         --browser parameter runs and captures browsers
         automatically

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 24 / 31
Test automation and continuous integration


         --testOutput parameter generates JUnit XML compatible
         test logs
                One XML for every used browser

      j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y
              −− t e s t s a l l

         --browser parameter runs and captures browsers
         automatically

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 24 / 31
Test automation and continuous integration


         --testOutput parameter generates JUnit XML compatible
         test logs
                One XML for every used browser

      j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y
              −− t e s t s a l l

         --browser parameter runs and captures browsers
         automatically

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 24 / 31
Test automation and continuous integration


         --testOutput parameter generates JUnit XML compatible
         test logs
                One XML for every used browser

      j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y
              −− t e s t s a l l

         --browser parameter runs and captures browsers
         automatically

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 24 / 31
Test automation and continuous integration




         --port and --tests can be combined to automate server
         startup and testrun

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224 −− t e s t s a l l




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 25 / 31
Test automation and continuous integration




         --port and --tests can be combined to automate server
         startup and testrun

      j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 ,
             e x e c u t a b l e 2 , . . . −−p o r t 4224 −− t e s t s a l l




 http://westhoffswelt.de               jakob@westhoffswelt.de                        slide: 25 / 31
What comes next?




                    Code Coverage



 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 26 / 31
Code coverage



         Code coverage may be an indicator for untested code paths
         js-test-driver plugin allows to create code coverage reports
         Possible output formats
               Textual output on terminal
               LCOV compatible info file




 http://westhoffswelt.de       jakob@westhoffswelt.de         slide: 26 / 31
Code coverage



         Code coverage may be an indicator for untested code paths
         js-test-driver plugin allows to create code coverage reports
         Possible output formats
               Textual output on terminal
               LCOV compatible info file




 http://westhoffswelt.de       jakob@westhoffswelt.de         slide: 26 / 31
Code coverage



         Code coverage may be an indicator for untested code paths
         js-test-driver plugin allows to create code coverage reports
         Possible output formats
               Textual output on terminal
               LCOV compatible info file




 http://westhoffswelt.de       jakob@westhoffswelt.de         slide: 26 / 31
Code coverage



         Code coverage may be an indicator for untested code paths
         js-test-driver plugin allows to create code coverage reports
         Possible output formats
               Textual output on terminal
               LCOV compatible info file




 http://westhoffswelt.de       jakob@westhoffswelt.de         slide: 26 / 31
Code coverage



         Code coverage may be an indicator for untested code paths
         js-test-driver plugin allows to create code coverage reports
         Possible output formats
               Textual output on terminal
               LCOV compatible info file




 http://westhoffswelt.de       jakob@westhoffswelt.de         slide: 26 / 31
Code coverage - Plugin


          Download jar-file from js-test-driver homepage
          Put the coverage.jar file into some folder relative to your
          js-text-driver.jar (eg. plugins/coverage.jar)

          Add plugin to jsTestDriver.conf

      1    plugin :
      2      − name : ” c o v e r a g e ”
      3        j a r : ” plugins / coverage . j a r ”
      4        module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e .
                      CoverageModule ”




 http://westhoffswelt.de              jakob@westhoffswelt.de                     slide: 27 / 31
Code coverage - Plugin


          Download jar-file from js-test-driver homepage
          Put the coverage.jar file into some folder relative to your
          js-text-driver.jar (eg. plugins/coverage.jar)

          Add plugin to jsTestDriver.conf

      1    plugin :
      2      − name : ” c o v e r a g e ”
      3        j a r : ” plugins / coverage . j a r ”
      4        module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e .
                      CoverageModule ”




 http://westhoffswelt.de              jakob@westhoffswelt.de                     slide: 27 / 31
Code coverage - Plugin


          Download jar-file from js-test-driver homepage
          Put the coverage.jar file into some folder relative to your
          js-text-driver.jar (eg. plugins/coverage.jar)

          Add plugin to jsTestDriver.conf

      1    plugin :
      2      − name : ” c o v e r a g e ”
      3        j a r : ” plugins / coverage . j a r ”
      4        module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e .
                      CoverageModule ”




 http://westhoffswelt.de              jakob@westhoffswelt.de                     slide: 27 / 31
Using LCOV to generate HTML reports

         The --testOutput commandline parameter generates code
         coverage reports in LCOV compatible info file format

         Use genHtml from the LCOV package to generate nice HTML
         results:




         http://ltp.sourceforge.net


 http://westhoffswelt.de   jakob@westhoffswelt.de      slide: 28 / 31
Using LCOV to generate HTML reports

         The --testOutput commandline parameter generates code
         coverage reports in LCOV compatible info file format

         Use genHtml from the LCOV package to generate nice HTML
         results:




         http://ltp.sourceforge.net


 http://westhoffswelt.de   jakob@westhoffswelt.de      slide: 28 / 31
Code coverage - Live Demo




   Code coverage example

                          Live Demo!




 http://westhoffswelt.de   jakob@westhoffswelt.de   slide: 29 / 31
Thanks for listening


          Questions, comments or annotations?


         Slides: http://westhoffswelt.de/portfolio.htm
                Contact: Jakob Westhoff <jakob@php.net>
                          Twitter: @jakobwesthoff

      Please leave comments and vote at: http://joind.in/1626




 http://westhoffswelt.de    jakob@westhoffswelt.de    slide: 30 / 31
Sources




         Breathe Icon Set:
         https://launchpad.net/breathe-icon-set, Licensed
         under Creative Common Attribution-ShareAlike 3.0 License
         (http://creativecommons.org/licenses/by-sa/3.0)




 http://westhoffswelt.de    jakob@westhoffswelt.de        slide: 31 / 31

More Related Content

What's hot

TypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersRutenis Turcinas
 
Typescript Fundamentals
Typescript FundamentalsTypescript Fundamentals
Typescript FundamentalsSunny Sharma
 
Getting Started with TypeScript
Getting Started with TypeScriptGetting Started with TypeScript
Getting Started with TypeScriptGil Fink
 
introduction to javascript
introduction to javascriptintroduction to javascript
introduction to javascriptKumar
 
TypeScript Modules
TypeScript ModulesTypeScript Modules
TypeScript ModulesNoam Kfir
 
TypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painTypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painSander Mak (@Sander_Mak)
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practicesIwan van der Kleijn
 
Typescript: enjoying large scale browser development
Typescript: enjoying large scale browser developmentTypescript: enjoying large scale browser development
Typescript: enjoying large scale browser developmentJoost de Vries
 
Typescript in 30mins
Typescript in 30mins Typescript in 30mins
Typescript in 30mins Udaya Kumar
 
Introducing type script
Introducing type scriptIntroducing type script
Introducing type scriptRemo Jansen
 
Power Leveling your TypeScript
Power Leveling your TypeScriptPower Leveling your TypeScript
Power Leveling your TypeScriptOffirmo
 
Introduction to TypeScript by Winston Levi
Introduction to TypeScript by Winston LeviIntroduction to TypeScript by Winston Levi
Introduction to TypeScript by Winston LeviWinston Levi
 
Typescript for the programmers who like javascript
Typescript for the programmers who like javascriptTypescript for the programmers who like javascript
Typescript for the programmers who like javascriptAndrei Sebastian Cîmpean
 

What's hot (20)

TypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack Developers
 
Typescript Fundamentals
Typescript FundamentalsTypescript Fundamentals
Typescript Fundamentals
 
Getting Started with TypeScript
Getting Started with TypeScriptGetting Started with TypeScript
Getting Started with TypeScript
 
introduction to javascript
introduction to javascriptintroduction to javascript
introduction to javascript
 
TypeScript Modules
TypeScript ModulesTypeScript Modules
TypeScript Modules
 
TypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painTypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the pain
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practices
 
Introducing TypeScript
Introducing TypeScriptIntroducing TypeScript
Introducing TypeScript
 
Typescript: enjoying large scale browser development
Typescript: enjoying large scale browser developmentTypescript: enjoying large scale browser development
Typescript: enjoying large scale browser development
 
Typescript
TypescriptTypescript
Typescript
 
Typescript in 30mins
Typescript in 30mins Typescript in 30mins
Typescript in 30mins
 
Introducing type script
Introducing type scriptIntroducing type script
Introducing type script
 
TypeScript intro
TypeScript introTypeScript intro
TypeScript intro
 
Power Leveling your TypeScript
Power Leveling your TypeScriptPower Leveling your TypeScript
Power Leveling your TypeScript
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
TypeScript - An Introduction
TypeScript - An IntroductionTypeScript - An Introduction
TypeScript - An Introduction
 
Introduction to TypeScript by Winston Levi
Introduction to TypeScript by Winston LeviIntroduction to TypeScript by Winston Levi
Introduction to TypeScript by Winston Levi
 
TypeScript Overview
TypeScript OverviewTypeScript Overview
TypeScript Overview
 
Typescript for the programmers who like javascript
Typescript for the programmers who like javascriptTypescript for the programmers who like javascript
Typescript for the programmers who like javascript
 
TypeScript
TypeScriptTypeScript
TypeScript
 

Similar to Javascript Unittesting with js-test-driver

Isomorphic JavaScript with Nashorn
Isomorphic JavaScript with NashornIsomorphic JavaScript with Nashorn
Isomorphic JavaScript with NashornMaxime Najim
 
Crossant Run Modes
Crossant Run ModesCrossant Run Modes
Crossant Run ModesAjay Singh
 
[FullStack NYC 2019] Effective Unit Tests for JavaScript
[FullStack NYC 2019] Effective Unit Tests for JavaScript[FullStack NYC 2019] Effective Unit Tests for JavaScript
[FullStack NYC 2019] Effective Unit Tests for JavaScriptHazem Saleh
 
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31Masayuki Igawa
 
Profiling your Java Application
Profiling your Java ApplicationProfiling your Java Application
Profiling your Java ApplicationVictor Rentea
 
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Christian Catalan
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller ColumnsJonathan Fine
 
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-AppsSelenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-Appschrisb206 chrisb206
 
Level Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With TestcontainersLevel Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With TestcontainersVMware Tanzu
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceOleksii Prohonnyi
 
Mike Taulty Beyond Silverlight With W P F
Mike Taulty  Beyond  Silverlight  With  W P FMike Taulty  Beyond  Silverlight  With  W P F
Mike Taulty Beyond Silverlight With W P Fukdpe
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsSpike Brehm
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
 
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...Amazon Web Services
 
HKG15-411: Browser Testing Framework for LHG
HKG15-411: Browser Testing Framework for LHGHKG15-411: Browser Testing Framework for LHG
HKG15-411: Browser Testing Framework for LHGLinaro
 
MvvmCross Introduction
MvvmCross IntroductionMvvmCross Introduction
MvvmCross IntroductionStuart Lodge
 

Similar to Javascript Unittesting with js-test-driver (20)

Isomorphic JavaScript with Nashorn
Isomorphic JavaScript with NashornIsomorphic JavaScript with Nashorn
Isomorphic JavaScript with Nashorn
 
Crossant Run Modes
Crossant Run ModesCrossant Run Modes
Crossant Run Modes
 
[FullStack NYC 2019] Effective Unit Tests for JavaScript
[FullStack NYC 2019] Effective Unit Tests for JavaScript[FullStack NYC 2019] Effective Unit Tests for JavaScript
[FullStack NYC 2019] Effective Unit Tests for JavaScript
 
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31
Ensuring OpenStack Version up Compatibility for CloudOpen Japan 2013-05-31
 
Profiling your Java Application
Profiling your Java ApplicationProfiling your Java Application
Profiling your Java Application
 
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
 
Concurrency patterns
Concurrency patternsConcurrency patterns
Concurrency patterns
 
groovy & grails - lecture 10
groovy & grails - lecture 10groovy & grails - lecture 10
groovy & grails - lecture 10
 
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-AppsSelenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
 
Level Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With TestcontainersLevel Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With Testcontainers
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: Experience
 
Mike Taulty Beyond Silverlight With W P F
Mike Taulty  Beyond  Silverlight  With  W P FMike Taulty  Beyond  Silverlight  With  W P F
Mike Taulty Beyond Silverlight With W P F
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
 
Why meteor
Why meteorWhy meteor
Why meteor
 
JavaScript Unit Testing
JavaScript Unit TestingJavaScript Unit Testing
JavaScript Unit Testing
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...
AWS re:Invent 2016: DevOps on AWS: Advanced Continuous Delivery Techniques (D...
 
HKG15-411: Browser Testing Framework for LHG
HKG15-411: Browser Testing Framework for LHGHKG15-411: Browser Testing Framework for LHG
HKG15-411: Browser Testing Framework for LHG
 
MvvmCross Introduction
MvvmCross IntroductionMvvmCross Introduction
MvvmCross Introduction
 

Recently uploaded

Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Product School
 
Powerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaPowerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaCzechDreamin
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...Product School
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Thierry Lestable
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1DianaGray10
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...Product School
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...CzechDreamin
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀DianaGray10
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupCatarinaPereira64715
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoTAnalytics
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlPeter Udo Diehl
 
Demystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyDemystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyJohn Staveley
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...CzechDreamin
 
In-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsIn-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsExpeed Software
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...Elena Simperl
 
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya HalderCustom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya HalderCzechDreamin
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomCzechDreamin
 

Recently uploaded (20)

Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Powerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaPowerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara Laskowska
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Demystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyDemystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John Staveley
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 
In-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsIn-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT Professionals
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya HalderCustom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
 

Javascript Unittesting with js-test-driver

  • 1. Javascript Unittesting with js-test-driver Jakob Westhoff <jakob@php.net> @jakobwesthoff PHPBarcamp.at May 2, 2010 http://westhoffswelt.de jakob@westhoffswelt.de slide: 1 / 31
  • 2. About Me Jakob Westhoff PHP developer for several years Computer science student at the TU Dortmund Co-Founder of the PHP Usergroup Dortmund Active in different Open Source projects http://westhoffswelt.de jakob@westhoffswelt.de slide: 2 / 31
  • 3. Who is actively using TDD/Unittesting? Who uses unittesting? Who uses TDD? Who unittests javascript code? http://westhoffswelt.de jakob@westhoffswelt.de slide: 3 / 31
  • 4. Who is actively using TDD/Unittesting? Who uses unittesting? Who uses TDD? Who unittests javascript code? http://westhoffswelt.de jakob@westhoffswelt.de slide: 3 / 31
  • 5. Who is actively using TDD/Unittesting? Who uses unittesting? Who uses TDD? Who unittests javascript code? http://westhoffswelt.de jakob@westhoffswelt.de slide: 3 / 31
  • 6. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 7. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 8. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 9. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 10. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 11. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 12. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 13. Goals of this session 1 Getting to know js-test-driver 2 Unittesting javascript Synchronous tests Asynchronous tests 3 Run these tests From within a terminal From within Eclipse 4 Create javascript code coverage reports http://westhoffswelt.de jakob@westhoffswelt.de slide: 4 / 31
  • 14. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 15. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 16. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 17. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 18. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 19. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 20. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 21. What is js-test-driver Javascript testrunner and framework Client/Server approach Server: js-test-driver Client: Browser Client: Testrunner Assertion framework Mostly xUnit compatible assertEquals assertSame assertTrue ... http://westhoffswelt.de jakob@westhoffswelt.de slide: 5 / 31
  • 22. What comes next? Architecture http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 23. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 24. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 25. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 26. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 27. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 28. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 29. Architecture of js-test-driver http://westhoffswelt.de jakob@westhoffswelt.de slide: 6 / 31
  • 30. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 31. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 32. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 33. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 34. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 35. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 36. Advantages of this design Run from possibly any IDE Commandline Eclipse Parallel execution of tests in multiple browsers Test execution on different machines with possibly different operating systems Website DOM not used for any testrunner output Browser independent code coverage reports (planned for a future release) http://westhoffswelt.de jakob@westhoffswelt.de slide: 7 / 31
  • 37. What comes next? Example http://westhoffswelt.de jakob@westhoffswelt.de slide: 8 / 31
  • 38. A simple example Javascript application/function Testcase js-test-driver configuration file http://westhoffswelt.de jakob@westhoffswelt.de slide: 8 / 31
  • 39. A simple example Javascript application/function Testcase js-test-driver configuration file http://westhoffswelt.de jakob@westhoffswelt.de slide: 8 / 31
  • 40. A simple example Javascript application/function Testcase js-test-driver configuration file http://westhoffswelt.de jakob@westhoffswelt.de slide: 8 / 31
  • 41. A simple example - Javascript Really simple hello world function: 1 myApp = { } ; 2 3 myApp . H e l l o W o r l d = f u n c t i o n ( ) { } ; 4 5 myApp . H e l l o W o r l d . p r o t o t y p e . s a y H e l l o = f u n c t i o n ( ) { 6 r e t u r n ” H e l l o World ! ” ; 7 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 9 / 31
  • 42. A simple example - Testcase Our first js-test-driver testcase: 1 HelloWorldTest = TestCase ( ’ HelloWorld ’ ) ; 2 3 HelloWorldTest . p r o t o t y p e . setUp = f u n c t i o n ( ) { 4 t h i s . h e l l o F i x t u r e = new myApp . H e l l o W o r l d ( ) ; 5 } 6 7 HelloWorldTest . prototype . testOutput = function () { 8 assertEquals ( 9 ” H e l l o World ! ” , 10 this . helloFixture . sayHello () 11 ); 12 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 10 / 31
  • 43. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 44. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 45. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 46. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 47. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 48. Digression about test lifecycle The js-test-driver test lifecycle follows the JUnit lifecycle 1 Instantiate new Testcase implementation 2 Execute the setUp() method 3 Execute the next testWhatever() method 4 Execute the tearDown() method 5 While tests left in testcase jump to Step 1 http://westhoffswelt.de jakob@westhoffswelt.de slide: 11 / 31
  • 49. A simple example - js-test-driver configuration Every project needs a js-test-driver configuration file. Written in YAML Called jsTestDriver.conf by default js-test-driver configuration for our example: 1 s e r v e r : http :// l o c a l h o s t :4224 2 3 load : 4 − src / hello world . js 5 − tests / hello world . js http://westhoffswelt.de jakob@westhoffswelt.de slide: 12 / 31
  • 50. A simple example - js-test-driver configuration Every project needs a js-test-driver configuration file. Written in YAML Called jsTestDriver.conf by default js-test-driver configuration for our example: 1 s e r v e r : http :// l o c a l h o s t :4224 2 3 load : 4 − src / hello world . js 5 − tests / hello world . js http://westhoffswelt.de jakob@westhoffswelt.de slide: 12 / 31
  • 51. A simple example - js-test-driver configuration Every project needs a js-test-driver configuration file. Written in YAML Called jsTestDriver.conf by default js-test-driver configuration for our example: 1 s e r v e r : http :// l o c a l h o s t :4224 2 3 load : 4 − src / hello world . js 5 − tests / hello world . js http://westhoffswelt.de jakob@westhoffswelt.de slide: 12 / 31
  • 52. A simple example - js-test-driver configuration Every project needs a js-test-driver configuration file. Written in YAML Called jsTestDriver.conf by default js-test-driver configuration for our example: 1 s e r v e r : http :// l o c a l h o s t :4224 2 3 load : 4 − src / hello world . js 5 − tests / hello world . js http://westhoffswelt.de jakob@westhoffswelt.de slide: 12 / 31
  • 53. Run js-test-driver - Server Run the js-test-driver server j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224 Capture the all browsers http :// l o c a l h o s t :4224/ capture Execute the testrunner j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s all http://westhoffswelt.de jakob@westhoffswelt.de slide: 13 / 31
  • 54. Run js-test-driver - Browser Run the js-test-driver server j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224 Capture the all browsers http :// l o c a l h o s t :4224/ capture Execute the testrunner j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s all http://westhoffswelt.de jakob@westhoffswelt.de slide: 13 / 31
  • 55. Run js-test-driver - Testrunner Run the js-test-driver server j a v a − j a r j s T e s t D r i v e r . j a r −−p o r t 4224 Capture the all browsers http :// l o c a l h o s t :4224/ capture Execute the testrunner j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s all http://westhoffswelt.de jakob@westhoffswelt.de slide: 13 / 31
  • 56. A simple example - Live Demo Hello World example Live Demo! http://westhoffswelt.de jakob@westhoffswelt.de slide: 14 / 31
  • 57. Eclipse testrunner A testrunner plugin for Eclipse is available Available through eclipse plugin manager http://code.google.com/p/js-test-driver/wiki/UsingTheEclipsePlugin http://westhoffswelt.de jakob@westhoffswelt.de slide: 15 / 31
  • 58. Eclipse testrunner A testrunner plugin for Eclipse is available Available through eclipse plugin manager http://code.google.com/p/js-test-driver/wiki/UsingTheEclipsePlugin http://westhoffswelt.de jakob@westhoffswelt.de slide: 15 / 31
  • 59. Eclipse testrunner A testrunner plugin for Eclipse is available Available through eclipse plugin manager http://code.google.com/p/js-test-driver/wiki/UsingTheEclipsePlugin http://westhoffswelt.de jakob@westhoffswelt.de slide: 15 / 31
  • 60. What comes next? Asynchronous tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 16 / 31
  • 61. Test asynchronous implementations Asynchronous timeouts setTimeout, setInterval Asynchronous callbacks XMLHttpRequest, onReady ”[...] JS test driver does not support asynchronous test. This was a conscious decision, as we want to make sure that the tests remain fast.” – Misko Hevery on Google groups http://westhoffswelt.de jakob@westhoffswelt.de slide: 16 / 31
  • 62. Test asynchronous implementations Asynchronous timeouts setTimeout, setInterval Asynchronous callbacks XMLHttpRequest, onReady ”[...] JS test driver does not support asynchronous test. This was a conscious decision, as we want to make sure that the tests remain fast.” – Misko Hevery on Google groups http://westhoffswelt.de jakob@westhoffswelt.de slide: 16 / 31
  • 63. Test asynchronous implementations Asynchronous timeouts setTimeout, setInterval Asynchronous callbacks XMLHttpRequest, onReady ”[...] JS test driver does not support asynchronous test. This was a conscious decision, as we want to make sure that the tests remain fast.” – Misko Hevery on Google groups http://westhoffswelt.de jakob@westhoffswelt.de slide: 16 / 31
  • 64. Asynchronous timeouts window . s e t T i m e o u t ( function () { . . . } , 3000 ); Use jsUnitMockTimeout.js http://jsunit.net Mocks setTimeout, setInterval, clearTimeout and clearInterval Timeflow can be controlled manually in tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 17 / 31
  • 65. Asynchronous timeouts window . s e t T i m e o u t ( function () { . . . } , 3000 ); Use jsUnitMockTimeout.js http://jsunit.net Mocks setTimeout, setInterval, clearTimeout and clearInterval Timeflow can be controlled manually in tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 17 / 31
  • 66. Asynchronous timeouts window . s e t T i m e o u t ( function () { . . . } , 3000 ); Use jsUnitMockTimeout.js http://jsunit.net Mocks setTimeout, setInterval, clearTimeout and clearInterval Timeflow can be controlled manually in tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 17 / 31
  • 67. Asynchronous timeouts window . s e t T i m e o u t ( function () { . . . } , 3000 ); Use jsUnitMockTimeout.js http://jsunit.net Mocks setTimeout, setInterval, clearTimeout and clearInterval Timeflow can be controlled manually in tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 17 / 31
  • 68. Asynchronous timeouts window . s e t T i m e o u t ( function () { . . . } , 3000 ); Use jsUnitMockTimeout.js http://jsunit.net Mocks setTimeout, setInterval, clearTimeout and clearInterval Timeflow can be controlled manually in tests http://westhoffswelt.de jakob@westhoffswelt.de slide: 17 / 31
  • 69. jsUnitMockTimeout example - Stopwatch Simple stopwatch example: 1 Stopwatch . s t a r t = f u n c t i o n ( ) { 2 Stopwatch . c l e a r ( ) ; 3 Stopwatch . t i m e r = s e t I n t e r v a l ( 4 S t o p w a t c h . advance , 5 1000 6 ); 7 } 8 9 Stopwatch . advance = function () {...} 10 Stopwatch . s t o p = function () {...} 11 Stopwatch . c l e a r = function () {...} 12 Stopwatch . r e s u l t = function () {...} http://westhoffswelt.de jakob@westhoffswelt.de slide: 18 / 31
  • 70. jsUnitMockTimeout example - Test Test using jsUnitMockTimeout: 1 StopwatchTest . pr o to t yp e . testTiming = f u n c t i o n ( ) { 2 Clock . r e s e t () ; 3 Stopwatch . s t a r t ( ) ; 4 a s s e r t E q u a l s ( 0 , S to p w a t ch . r e s u l t ( ) ) ; 5 6 Clock . t i c k (5000) ; 7 a s e r t E q u a l s ( 5 , S t o pw a t c h . r e s u l t ( ) ) ; 8 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 19 / 31
  • 71. Asynchronous callbacks Generalized callback mocks do not exist Mock the used function manually, calling the callback immediately 1 xhr . send = f u n c t i o n ( data ) { 2 // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s directly 3 t h i s . onReady ( someData ) ; 4 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 20 / 31
  • 72. Asynchronous callbacks Generalized callback mocks do not exist Mock the used function manually, calling the callback immediately 1 xhr . send = f u n c t i o n ( data ) { 2 // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s directly 3 t h i s . onReady ( someData ) ; 4 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 20 / 31
  • 73. Asynchronous callbacks Generalized callback mocks do not exist Mock the used function manually, calling the callback immediately 1 xhr . send = f u n c t i o n ( data ) { 2 // C a l l onReady w i t h a p p r o p r i a t e r e s u l t s directly 3 t h i s . onReady ( someData ) ; 4 } http://westhoffswelt.de jakob@westhoffswelt.de slide: 20 / 31
  • 74. What comes next? Debugging http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 75. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 76. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 77. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 78. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 79. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 80. Debugging Use whatever javascript debugging technique you like! Firebug (Firefox) Visual Studio (IE) Web Inspector (Safari) ... 1 Run the test you want to debug: j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s H e l l o W o r l d T e s t . testOutput 2 Set breakpoints 3 Rerun the test using the command above. http://westhoffswelt.de jakob@westhoffswelt.de slide: 21 / 31
  • 81. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 82. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 83. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 84. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 85. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 86. Debugging - Using the console A lot of javascript debuggers provide a console object c o n s o l e . l o g ( ” H e l l o World ! ” ) ; Redirect this output to js-test-driver j a v a − j a r j s T e s t D r i v e r . j a r −− t e s t s a l l −− captureConsole Note: Does not work in Firefox Use jstestdriver.console directly j s t e s t d r i v e r . c o n s o l e . l o g ( ” H e l l o World ! ” ) ; http://westhoffswelt.de jakob@westhoffswelt.de slide: 22 / 31
  • 87. Debugging - Live Demo Debugging example Live Demo! http://westhoffswelt.de jakob@westhoffswelt.de slide: 23 / 31
  • 88. What comes next? Automation and CI http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 89. Test automation and continuous integration --testOutput parameter generates JUnit XML compatible test logs One XML for every used browser j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y −− t e s t s a l l --browser parameter runs and captures browsers automatically j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 90. Test automation and continuous integration --testOutput parameter generates JUnit XML compatible test logs One XML for every used browser j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y −− t e s t s a l l --browser parameter runs and captures browsers automatically j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 91. Test automation and continuous integration --testOutput parameter generates JUnit XML compatible test logs One XML for every used browser j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y −− t e s t s a l l --browser parameter runs and captures browsers automatically j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 92. Test automation and continuous integration --testOutput parameter generates JUnit XML compatible test logs One XML for every used browser j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y −− t e s t s a l l --browser parameter runs and captures browsers automatically j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 93. Test automation and continuous integration --testOutput parameter generates JUnit XML compatible test logs One XML for every used browser j a v a − j a r j s T e s t D r i v e r . j a r −−t e s t O u t p u t s o m e D i r e c t o r y −− t e s t s a l l --browser parameter runs and captures browsers automatically j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 http://westhoffswelt.de jakob@westhoffswelt.de slide: 24 / 31
  • 94. Test automation and continuous integration --port and --tests can be combined to automate server startup and testrun j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 −− t e s t s a l l http://westhoffswelt.de jakob@westhoffswelt.de slide: 25 / 31
  • 95. Test automation and continuous integration --port and --tests can be combined to automate server startup and testrun j a v a − j a r j s T e s t D r i v e r . j a r −−b r o w s e r e x e c u t a b l e 1 , e x e c u t a b l e 2 , . . . −−p o r t 4224 −− t e s t s a l l http://westhoffswelt.de jakob@westhoffswelt.de slide: 25 / 31
  • 96. What comes next? Code Coverage http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 97. Code coverage Code coverage may be an indicator for untested code paths js-test-driver plugin allows to create code coverage reports Possible output formats Textual output on terminal LCOV compatible info file http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 98. Code coverage Code coverage may be an indicator for untested code paths js-test-driver plugin allows to create code coverage reports Possible output formats Textual output on terminal LCOV compatible info file http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 99. Code coverage Code coverage may be an indicator for untested code paths js-test-driver plugin allows to create code coverage reports Possible output formats Textual output on terminal LCOV compatible info file http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 100. Code coverage Code coverage may be an indicator for untested code paths js-test-driver plugin allows to create code coverage reports Possible output formats Textual output on terminal LCOV compatible info file http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 101. Code coverage Code coverage may be an indicator for untested code paths js-test-driver plugin allows to create code coverage reports Possible output formats Textual output on terminal LCOV compatible info file http://westhoffswelt.de jakob@westhoffswelt.de slide: 26 / 31
  • 102. Code coverage - Plugin Download jar-file from js-test-driver homepage Put the coverage.jar file into some folder relative to your js-text-driver.jar (eg. plugins/coverage.jar) Add plugin to jsTestDriver.conf 1 plugin : 2 − name : ” c o v e r a g e ” 3 j a r : ” plugins / coverage . j a r ” 4 module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e . CoverageModule ” http://westhoffswelt.de jakob@westhoffswelt.de slide: 27 / 31
  • 103. Code coverage - Plugin Download jar-file from js-test-driver homepage Put the coverage.jar file into some folder relative to your js-text-driver.jar (eg. plugins/coverage.jar) Add plugin to jsTestDriver.conf 1 plugin : 2 − name : ” c o v e r a g e ” 3 j a r : ” plugins / coverage . j a r ” 4 module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e . CoverageModule ” http://westhoffswelt.de jakob@westhoffswelt.de slide: 27 / 31
  • 104. Code coverage - Plugin Download jar-file from js-test-driver homepage Put the coverage.jar file into some folder relative to your js-text-driver.jar (eg. plugins/coverage.jar) Add plugin to jsTestDriver.conf 1 plugin : 2 − name : ” c o v e r a g e ” 3 j a r : ” plugins / coverage . j a r ” 4 module : ”com . g o o g l e . j s t e s t d r i v e r . c o v e r a g e . CoverageModule ” http://westhoffswelt.de jakob@westhoffswelt.de slide: 27 / 31
  • 105. Using LCOV to generate HTML reports The --testOutput commandline parameter generates code coverage reports in LCOV compatible info file format Use genHtml from the LCOV package to generate nice HTML results: http://ltp.sourceforge.net http://westhoffswelt.de jakob@westhoffswelt.de slide: 28 / 31
  • 106. Using LCOV to generate HTML reports The --testOutput commandline parameter generates code coverage reports in LCOV compatible info file format Use genHtml from the LCOV package to generate nice HTML results: http://ltp.sourceforge.net http://westhoffswelt.de jakob@westhoffswelt.de slide: 28 / 31
  • 107. Code coverage - Live Demo Code coverage example Live Demo! http://westhoffswelt.de jakob@westhoffswelt.de slide: 29 / 31
  • 108. Thanks for listening Questions, comments or annotations? Slides: http://westhoffswelt.de/portfolio.htm Contact: Jakob Westhoff <jakob@php.net> Twitter: @jakobwesthoff Please leave comments and vote at: http://joind.in/1626 http://westhoffswelt.de jakob@westhoffswelt.de slide: 30 / 31
  • 109. Sources Breathe Icon Set: https://launchpad.net/breathe-icon-set, Licensed under Creative Common Attribution-ShareAlike 3.0 License (http://creativecommons.org/licenses/by-sa/3.0) http://westhoffswelt.de jakob@westhoffswelt.de slide: 31 / 31