SlideShare a Scribd company logo
Testing Ext JS &
 Sencha Touch


              2012 Mats Bryntse
              @bryntum
Contents

• Why test your JavaScript?

• Testing Methodologies

• Introducing Siesta

• Writing testable JS

• Automating tests
About me
var me = {
   name        : ”Mats Bryntse”,
   age         : 35+,
   lives       : ”Helsingborg, Sweden”,
   does        : ”Runs Bryntum”,
   site        : ”www.bryntum.com”,
   twitter     : ”@bryntum”
};
What we do

Ext JS/ST Components


                       Siesta (JS Test Tool)
First, a quick raise of
        hands:

  How many of you...
How many of you...


• have a frontend test suite?

• have frontend test suite as part of your CI?

• run your test suite in all major browsers?

• have zero or fewer frontend tests for your app?
Why test your
JavaScript?
A typical web app...



                     Interwebs



http://www.app.com
The backend


         • Single controlled platform

         • Simple to test and refactor

         • Good IDEs and tools
PHP
    C#
 Java
The frontend
• Multiple platforms & versions
  (Mac, Windows XP/Vista/7/8, Linux...)


• Multiple browser versions

• Hard to refactor

• JavaScript support in IDEs is
  still !== awesome
Conclusion


Too easy to #FAIL as a frontend developer

Testing helps you keep fails to a minimum.
But...

”... my code is bug free”

”...testing takes time away from adding new
features (+ new bugs)”

”...it’s QA’s job to test”

”... it’s boring and I’ll quit my job”
A good investment

• Writing tests === investment in your code

• Takes time

• Will pay you back, though not instantly
Scenario:
A nasty bug was found

      3 options
[panic]
[patch it]
[proper fix]
A test suite...
=> confidence in your code

=> serves as extra documentation

=> easier refactoring

=> bugs happen once, easier to find

=======> quality of sleep
Code handover

• Test cases are really useful when handing over
  responsibility for a JS module

• Developer Bob quits his job. New guy gets
  responsibility of his JS code.

• How will new guy know what parts of the
  codebase is safe to change & refactor?
New guy studies codebase
 application.js

 /**
  * When I wrote this, only God and I understood what I was doing
  * Now, God only knows
  **/

 /* I am not sure if we need this, but too scared to delete. */

 // drunk, fix later

 // This is my last day...
Code handover

New guy, scared
Code handover

• Without test suite, will new guy feel good
  about making major changes?

• Only minor cosmetic changes on the surface.

• System accumulates cruft over time.

• Sounds familiar?
JS Testing
Methodologies
Unit testing

Integration testing

Functional testing
Unit testing


• Testing the API of a single isolated ’unit’

• Typically pure JS, non UI / DOM
    •   verify set/get method of a Model
    •   verify date manipulation logic


• Many tools available
Unit testing


• Siesta

• Jasmine

• QUnit (jQuery)

• Google js-test (V8)
Integration testing


• Testing integration between units.

• E.g. verify cell editing plugin works in
  GridPanel
Functional Web testing


• UI testing of a component or an application
  as a whole.

• Send commands to the web page and
  evaluate result.

• ’click button’, ’type into login field’, ...
Functional Web testing


• Siesta

• Selenium

• JsTestDriver
Interacting with the DOM

 Approaches to faking user input

  • Synthetic events (JavaScript)

  • Native events (via Java Applet)
Synthetic events
+ Supported in all major browsers
+ Compatible with mobile
+ Don’t rely on native event queue
     Tests can be run in parallell.




- Browsers don’t ”trust” synthetic events
 -   Enter key on a focused link
 -   Tab between input fields, etc...
- X-browser differences
 DOM Events, Key events, key codes (http://unixpapa.com)
Native events

+ Java applets are supported in desktop
browsers
+ As close to a ’real’ user as possible


- Won’t work on iOS, Android.
- No parallell tests since native event queue
is used.
Testing Ext JS and Sencha Touch
What is Siesta?

• Unit testing and DOM testing tool

• Optimized for Ext JS & Sencha Touch
   - also supports jQuery, NodeJS, or any JS


• Simple syntax, Extensible

• Automate using PhantomJS & Selenium.
Siesta Browser Harness
Siesta Browser Harness

• A UI for Siesta, view DOM, inspect assertions

• Define a tree of tests, in logical groups

• Global settings for the test suite
        autoCheckGlobals, preload, testClass
A Siesta Test

• is pure JavaScript, no magic.

StartTest(function(t) {

      $('body').html('JQuery was here');

      t.contentLike(document.body,
                   'JQuery was here',
                   'Found correct text in DOM');
});
A Siesta Test

• is completely isolated in its own iframe
   (no teardown, cleanup required)
A Siesta Test

• can be extended with your own custom
  assertions and helper methods

StartTest(function(myTest) {
    var app = myTest.startApplication();

      myTest.performLogin(app);
      myTest.isLoggedIn(app, ’Logged in ok’);
      myTest.is(app.nbrUsers, 1, ’Found 1 user’);
});
Lifecycle of a UI test

Setup      create grid, load stores

Wait       for store to load, grid rows to render

Simulate   click button, type into textbox

Verify     isEqual(a, b)
Setup



var userGrid = new My.UserGrid({ … });

userGrid.render(Ext.getBody());
Wait

t.waitForRowsVisible(userGrid, function(){
    // Do something
});


t.waitForComponentQuery(“formpanel > textfield”);


t.waitForCompositeQuery(“grid => .x-grid-row”);
Simulate

// A list of actions to simulate
t.chain(
     {
           desc            : 'Should click trigger field',
           action          : 'click',
           target          : 'testgrid triggerfield'
     },
     {
           desc            : 'Should type into filter field',
           action          : 'type',
           target          : 'testgrid triggerfield',
           text            : 'FOO'
     }, ...
);
Verify

t.is(userStore.getCount(), 5, ”5 users found”);


t.willFireNTimes(store, 2, ”write”);


t.hasCls(grid.getEl(), ”myClass”, ”Found CSS”);


t.hasSize(myWindow, 300, 300,   ”Window size ok”);
DEMO
Sencha Touch support




Simulate tap, doubleTap, swipe, longPress, etc...
Siesta.next

• Benchmarking

• Code coverage

• Multi-browser, multi-device testing
• Crowd sourced test case tool “Code Cowboy”

• Your suggestion?
Headless testing


• Headless browsers are great, fast

• Command line, easy to integrate with IDEs

• PhantomJS, GUI-less WebKit browser
Phantom JS
Created by Ariya Hidayat (Sencha Inc.)

Fast headless testing

Site scraping

SVG rendering, PDF/PNG output

Supports CoffeeScript
Headless browsers

+ Run tests on command line
+ Faster
+ Automation
+ Doesn’t require an actual browser


- Not 100% accurate, but close.
Writing testable JS
Some ground rules

• Keep your JavaScript in JS files

• Never put JavaScript in your HTML
  page/tags

• Keep code organized in logical manageable
  files. Decide on some max nbr of lines/file.
No no no
Testable MVC code

• Fat model, skinny view

• Don’t pollute your views with business logic

• Testing pure JS is a lot easier than testing
  DOM-dependent JS

• Promotes reuse of your code
Mixing view and logic

Ext.define('UserForm', {
    extend: 'Ext.FormPanel',
    width: 400,
    height: 400,

      // Returns true if User is valid
      isValid: function (userModel) {
          return userModel.name.length > 4 &&
                 userModel.password.length > 8;
      }
});
Better

Ext.define('UserModel', {
    extend: 'Ext.data.Model ',
    name : '',
    password : '',

      isValid : function () {
             return this.name.length > 4 &&
                    this.password.length > 8;
      }
});
Refactored view

Ext.define('UserForm', {
    extend: 'Ext.FormPanel',
    width: 400,
    height: 400,

      // Returns true if User is valid
      isValid: function () {
          return this.model.isValid();
      }
});
Avoid private code


• Avoid overuse of private functions in
  closures

• If your code cannot be accessed it cannot
  be tested
Testing Ajax

• Try to avoid involving your database.

• Use either static JS files with mock data
  (async, slower)

• Or Mock the entire Ajax call (sync, faster)
   Sinon.js, Jasmine-ajax etc.
Automation &
Continuous Integration
Continuous Integration

• Once you have decided on your testing
  toolset, integrate it with your CI.

• Automatically run test suite on pre-commit
  or post-commit

• Nightly builds, full test suite execution,
  reporting via email etc.
CI Tools

• Jenkins

• TeamCity

• Cruise Control

• Test Swarm
JS Code Coverage

• JsCoverage
   Seems abandoned



• ScriptCover
   Google Chrome Plugin



• JsTestDriver
   Add-in module for coverage



• JesCov
   Rhino, Jasmine
Resources - Yahoo
http://screen.yahoo.com/
Resources - GTAC
”Without unit tests, you’re
         not refactoring. You’re just
         changing shit.”



Hamlet D’Arcy
Thanks for listening!


     Questions?



                  2012 Mats Bryntse
                  @bryntum

More Related Content

What's hot (20)

PDF
Introduction to Protractor
Jie-Wei Wu
 
PDF
jQuery Proven Performance Tips & Tricks
Addy Osmani
 
PDF
Javascript Test Automation Workshop (21.08.2014)
Deutsche Post
 
PDF
UI Testing Best Practices - An Expected Journey
Oren Farhi
 
PDF
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
Matt Raible
 
PDF
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
PPTX
An Introduction to AngularJS End to End Testing using Protractor
Cubet Techno Labs
 
PDF
Test your Javascript! v1.1
Eric Wendelin
 
PPTX
Marcin Wasilczyk - Page objects with selenium
Trójmiejska Grupa Testerska
 
PPTX
Protractor Tutorial Quality in Agile 2015
Andrew Eisenberg
 
PDF
Introduction to Selenium and Ruby
Ynon Perek
 
PDF
Automation Abstraction Layers: Page Objects and Beyond
Alan Richardson
 
PDF
Intro to node.js - Ran Mizrahi (28/8/14)
Ran Mizrahi
 
PPT
Automated Testing With Watir
Timothy Fisher
 
PPTX
Sencha / ExtJS : Object Oriented JavaScript
Rohan Chandane
 
DOC
Selenium Automation Using Ruby
Kumari Warsha Goel
 
PPTX
Automated php unit testing in drupal 8
Jay Friendly
 
PPTX
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
PDF
Intro to JavaScript Testing
Ran Mizrahi
 
PPT
Testing in AngularJS
Peter Drinnan
 
Introduction to Protractor
Jie-Wei Wu
 
jQuery Proven Performance Tips & Tricks
Addy Osmani
 
Javascript Test Automation Workshop (21.08.2014)
Deutsche Post
 
UI Testing Best Practices - An Expected Journey
Oren Farhi
 
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
Matt Raible
 
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
An Introduction to AngularJS End to End Testing using Protractor
Cubet Techno Labs
 
Test your Javascript! v1.1
Eric Wendelin
 
Marcin Wasilczyk - Page objects with selenium
Trójmiejska Grupa Testerska
 
Protractor Tutorial Quality in Agile 2015
Andrew Eisenberg
 
Introduction to Selenium and Ruby
Ynon Perek
 
Automation Abstraction Layers: Page Objects and Beyond
Alan Richardson
 
Intro to node.js - Ran Mizrahi (28/8/14)
Ran Mizrahi
 
Automated Testing With Watir
Timothy Fisher
 
Sencha / ExtJS : Object Oriented JavaScript
Rohan Chandane
 
Selenium Automation Using Ruby
Kumari Warsha Goel
 
Automated php unit testing in drupal 8
Jay Friendly
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
Intro to JavaScript Testing
Ran Mizrahi
 
Testing in AngularJS
Peter Drinnan
 

Viewers also liked (9)

PDF
ExtJS WebDriver
Andrii Dzynia
 
PDF
Selenium. Stas Kuzminov
ADCI Solutions
 
PPTX
White-box Unit Test Generation with Microsoft IntelliTest
Dávid Honfi
 
PPTX
Selenide –  лаконичные тесты на Selenium 2 WebDriver + Java bindings
COMAQA.BY
 
PPTX
test generation
dennis gookyi
 
PPTX
SenchaCon 2016: How Sencha Test Helps Automate Functional Testing of Ext JS M...
Sencha
 
PPTX
SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...
Sencha
 
PPTX
Basic Selenium Training
Dipesh Bhatewara
 
PDF
Brazil Startup Report
World Startup Report
 
ExtJS WebDriver
Andrii Dzynia
 
Selenium. Stas Kuzminov
ADCI Solutions
 
White-box Unit Test Generation with Microsoft IntelliTest
Dávid Honfi
 
Selenide –  лаконичные тесты на Selenium 2 WebDriver + Java bindings
COMAQA.BY
 
test generation
dennis gookyi
 
SenchaCon 2016: How Sencha Test Helps Automate Functional Testing of Ext JS M...
Sencha
 
SenchaCon 2016: The Changing Landscape of JavaScript Testing - Joel Watson an...
Sencha
 
Basic Selenium Training
Dipesh Bhatewara
 
Brazil Startup Report
World Startup Report
 
Ad

Similar to Testing Ext JS and Sencha Touch (20)

PPTX
Java script unit testing
Mats Bryntse
 
PPT
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Alex Chaffee
 
PDF
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Anup Singh
 
PPTX
UI Tests Are Fun To Write (If You Write Them Right)
Seth Petry-Johnson
 
PPTX
Security testing of YUI powered applications
dimisec
 
PDF
Testing, Performance Analysis, and jQuery 1.4
jeresig
 
PDF
3 WAYS TO TEST YOUR COLDFUSION API
Gavin Pickin
 
PDF
3 WAYS TO TEST YOUR COLDFUSION API -
Ortus Solutions, Corp
 
PDF
Understanding JavaScript Testing
jeresig
 
PDF
How to write Testable Javascript
ColdFusionConference
 
PDF
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
Gavin Pickin
 
KEY
Rapid Testing, Rapid Development
mennovanslooten
 
PPT
Test Automation Framework Designs
Test Automaton
 
PDF
Reliable Javascript
Glenn Stovall
 
PDF
Arquillian: Effective tests from the client to the server
Lukáš Fryč
 
PDF
Front-End Testing: Demystified
Seth McLaughlin
 
PPT
Test Automation Framework Designs
Sauce Labs
 
PDF
Unit Testing JavaScript Applications
Ynon Perek
 
PPTX
Automated integration tests for ajax applications (с. карпушин, auriga)
Mobile Developer Day
 
PDF
Productive JavaScript Workflow
Krzysztof Szafranek
 
Java script unit testing
Mats Bryntse
 
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Alex Chaffee
 
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Anup Singh
 
UI Tests Are Fun To Write (If You Write Them Right)
Seth Petry-Johnson
 
Security testing of YUI powered applications
dimisec
 
Testing, Performance Analysis, and jQuery 1.4
jeresig
 
3 WAYS TO TEST YOUR COLDFUSION API
Gavin Pickin
 
3 WAYS TO TEST YOUR COLDFUSION API -
Ortus Solutions, Corp
 
Understanding JavaScript Testing
jeresig
 
How to write Testable Javascript
ColdFusionConference
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
Gavin Pickin
 
Rapid Testing, Rapid Development
mennovanslooten
 
Test Automation Framework Designs
Test Automaton
 
Reliable Javascript
Glenn Stovall
 
Arquillian: Effective tests from the client to the server
Lukáš Fryč
 
Front-End Testing: Demystified
Seth McLaughlin
 
Test Automation Framework Designs
Sauce Labs
 
Unit Testing JavaScript Applications
Ynon Perek
 
Automated integration tests for ajax applications (с. карпушин, auriga)
Mobile Developer Day
 
Productive JavaScript Workflow
Krzysztof Szafranek
 
Ad

Recently uploaded (20)

PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 

Testing Ext JS and Sencha Touch

  • 1. Testing Ext JS & Sencha Touch 2012 Mats Bryntse @bryntum
  • 2. Contents • Why test your JavaScript? • Testing Methodologies • Introducing Siesta • Writing testable JS • Automating tests
  • 3. About me var me = { name : ”Mats Bryntse”, age : 35+, lives : ”Helsingborg, Sweden”, does : ”Runs Bryntum”, site : ”www.bryntum.com”, twitter : ”@bryntum” };
  • 4. What we do Ext JS/ST Components Siesta (JS Test Tool)
  • 5. First, a quick raise of hands: How many of you...
  • 6. How many of you... • have a frontend test suite? • have frontend test suite as part of your CI? • run your test suite in all major browsers? • have zero or fewer frontend tests for your app?
  • 8. A typical web app... Interwebs http://www.app.com
  • 9. The backend • Single controlled platform • Simple to test and refactor • Good IDEs and tools PHP C# Java
  • 10. The frontend • Multiple platforms & versions (Mac, Windows XP/Vista/7/8, Linux...) • Multiple browser versions • Hard to refactor • JavaScript support in IDEs is still !== awesome
  • 11. Conclusion Too easy to #FAIL as a frontend developer Testing helps you keep fails to a minimum.
  • 12. But... ”... my code is bug free” ”...testing takes time away from adding new features (+ new bugs)” ”...it’s QA’s job to test” ”... it’s boring and I’ll quit my job”
  • 13. A good investment • Writing tests === investment in your code • Takes time • Will pay you back, though not instantly
  • 14. Scenario: A nasty bug was found 3 options
  • 18. A test suite... => confidence in your code => serves as extra documentation => easier refactoring => bugs happen once, easier to find =======> quality of sleep
  • 19. Code handover • Test cases are really useful when handing over responsibility for a JS module • Developer Bob quits his job. New guy gets responsibility of his JS code. • How will new guy know what parts of the codebase is safe to change & refactor?
  • 20. New guy studies codebase application.js /** * When I wrote this, only God and I understood what I was doing * Now, God only knows **/ /* I am not sure if we need this, but too scared to delete. */ // drunk, fix later // This is my last day...
  • 22. Code handover • Without test suite, will new guy feel good about making major changes? • Only minor cosmetic changes on the surface. • System accumulates cruft over time. • Sounds familiar?
  • 25. Unit testing • Testing the API of a single isolated ’unit’ • Typically pure JS, non UI / DOM • verify set/get method of a Model • verify date manipulation logic • Many tools available
  • 26. Unit testing • Siesta • Jasmine • QUnit (jQuery) • Google js-test (V8)
  • 27. Integration testing • Testing integration between units. • E.g. verify cell editing plugin works in GridPanel
  • 28. Functional Web testing • UI testing of a component or an application as a whole. • Send commands to the web page and evaluate result. • ’click button’, ’type into login field’, ...
  • 29. Functional Web testing • Siesta • Selenium • JsTestDriver
  • 30. Interacting with the DOM Approaches to faking user input • Synthetic events (JavaScript) • Native events (via Java Applet)
  • 31. Synthetic events + Supported in all major browsers + Compatible with mobile + Don’t rely on native event queue Tests can be run in parallell. - Browsers don’t ”trust” synthetic events - Enter key on a focused link - Tab between input fields, etc... - X-browser differences DOM Events, Key events, key codes (http://unixpapa.com)
  • 32. Native events + Java applets are supported in desktop browsers + As close to a ’real’ user as possible - Won’t work on iOS, Android. - No parallell tests since native event queue is used.
  • 34. What is Siesta? • Unit testing and DOM testing tool • Optimized for Ext JS & Sencha Touch - also supports jQuery, NodeJS, or any JS • Simple syntax, Extensible • Automate using PhantomJS & Selenium.
  • 36. Siesta Browser Harness • A UI for Siesta, view DOM, inspect assertions • Define a tree of tests, in logical groups • Global settings for the test suite autoCheckGlobals, preload, testClass
  • 37. A Siesta Test • is pure JavaScript, no magic. StartTest(function(t) { $('body').html('JQuery was here'); t.contentLike(document.body, 'JQuery was here', 'Found correct text in DOM'); });
  • 38. A Siesta Test • is completely isolated in its own iframe (no teardown, cleanup required)
  • 39. A Siesta Test • can be extended with your own custom assertions and helper methods StartTest(function(myTest) { var app = myTest.startApplication(); myTest.performLogin(app); myTest.isLoggedIn(app, ’Logged in ok’); myTest.is(app.nbrUsers, 1, ’Found 1 user’); });
  • 40. Lifecycle of a UI test Setup create grid, load stores Wait for store to load, grid rows to render Simulate click button, type into textbox Verify isEqual(a, b)
  • 41. Setup var userGrid = new My.UserGrid({ … }); userGrid.render(Ext.getBody());
  • 42. Wait t.waitForRowsVisible(userGrid, function(){ // Do something }); t.waitForComponentQuery(“formpanel > textfield”); t.waitForCompositeQuery(“grid => .x-grid-row”);
  • 43. Simulate // A list of actions to simulate t.chain( { desc : 'Should click trigger field', action : 'click', target : 'testgrid triggerfield' }, { desc : 'Should type into filter field', action : 'type', target : 'testgrid triggerfield', text : 'FOO' }, ... );
  • 44. Verify t.is(userStore.getCount(), 5, ”5 users found”); t.willFireNTimes(store, 2, ”write”); t.hasCls(grid.getEl(), ”myClass”, ”Found CSS”); t.hasSize(myWindow, 300, 300, ”Window size ok”);
  • 45. DEMO
  • 46. Sencha Touch support Simulate tap, doubleTap, swipe, longPress, etc...
  • 47. Siesta.next • Benchmarking • Code coverage • Multi-browser, multi-device testing • Crowd sourced test case tool “Code Cowboy” • Your suggestion?
  • 48. Headless testing • Headless browsers are great, fast • Command line, easy to integrate with IDEs • PhantomJS, GUI-less WebKit browser
  • 49. Phantom JS Created by Ariya Hidayat (Sencha Inc.) Fast headless testing Site scraping SVG rendering, PDF/PNG output Supports CoffeeScript
  • 50. Headless browsers + Run tests on command line + Faster + Automation + Doesn’t require an actual browser - Not 100% accurate, but close.
  • 52. Some ground rules • Keep your JavaScript in JS files • Never put JavaScript in your HTML page/tags • Keep code organized in logical manageable files. Decide on some max nbr of lines/file.
  • 54. Testable MVC code • Fat model, skinny view • Don’t pollute your views with business logic • Testing pure JS is a lot easier than testing DOM-dependent JS • Promotes reuse of your code
  • 55. Mixing view and logic Ext.define('UserForm', { extend: 'Ext.FormPanel', width: 400, height: 400, // Returns true if User is valid isValid: function (userModel) { return userModel.name.length > 4 && userModel.password.length > 8; } });
  • 56. Better Ext.define('UserModel', { extend: 'Ext.data.Model ', name : '', password : '', isValid : function () { return this.name.length > 4 && this.password.length > 8; } });
  • 57. Refactored view Ext.define('UserForm', { extend: 'Ext.FormPanel', width: 400, height: 400, // Returns true if User is valid isValid: function () { return this.model.isValid(); } });
  • 58. Avoid private code • Avoid overuse of private functions in closures • If your code cannot be accessed it cannot be tested
  • 59. Testing Ajax • Try to avoid involving your database. • Use either static JS files with mock data (async, slower) • Or Mock the entire Ajax call (sync, faster) Sinon.js, Jasmine-ajax etc.
  • 61. Continuous Integration • Once you have decided on your testing toolset, integrate it with your CI. • Automatically run test suite on pre-commit or post-commit • Nightly builds, full test suite execution, reporting via email etc.
  • 62. CI Tools • Jenkins • TeamCity • Cruise Control • Test Swarm
  • 63. JS Code Coverage • JsCoverage Seems abandoned • ScriptCover Google Chrome Plugin • JsTestDriver Add-in module for coverage • JesCov Rhino, Jasmine
  • 66. ”Without unit tests, you’re not refactoring. You’re just changing shit.” Hamlet D’Arcy
  • 67. Thanks for listening! Questions? 2012 Mats Bryntse @bryntum