SlideShare a Scribd company logo
1 of 21
Download to read offline
Javascript is
software too!
(so where are the unit tests?)
        Kerry Buckley — @kerryb
  FESuffolk lightning talk 25 March 2013
http://www.flickr.com/photos/saparevo/4948914064
http://www.flickr.com/photos/igormazic/299854107
UT                            No         Yes                                                        ut/)
                                                            No            [107] (http://lbrtw.com/javascript-unit-
                                                                                                                   Developed as a learning project
                                                                          test-framework-part-1)
     JSUnit             Yes        No         Yes           No            [108] (http://www.jsunit.net/)
                                                                                                                   JSUnit is no longer actively maintain
     Enhance JS         Yes                                                                                                                                ed
                                   No         Yes           No            [10 6]
     QUnit                                                                                                         Port of Enhance PHP
                                              Yes         Yes         [109] (http://qunitjs.com/)
                                                                                                                   jQuery test harness
     RhUnit                                                           [110]
                                              Yes         Yes
                                                                      (http://www.iankent.co.uk/rhunit/)           QUnit compatible Rhino/JUnit framew
    Crosscheck                                                                                                                                             ork
                                              No          Yes         [10 7]
    J3Unit                                                                                                         Browserless java-based framework
                                          Yes             No          [111] (http://j3unit.sourceforge.net/)
    Mocha               No     Yes                                   [112]
                                          Yes             Yes
                                                                     (http://visionmedia.github.com/moch
    JSNUnit                                                                                              a/)
                                          Yes             No         [10 8]
   YUI Test          Yes       Yes        Yes           Yes          [10 9]
   JSSpec
                                          Yes             No         [11 0]
   UnitTesting                                                                                                    Behaviour-driven development framew
                                          Yes                                                                                                              ork
                                                        No          [11 1]
                                                                                                                 script.aculo.us javascript test harness
   JSpec                                                            [113]
                                          Yes          Yes                                                       Highly readable BDD, 50+ matchers
                                                                    (http://visionmedia.github.com/jspec)                                             , DOM / framework independent,
                                                                                                                 async, rhino, node.js support and mo
                                                                                                                                                      re (no longer maintained)
   Jasmine                                                          [114]                                        BDD, framework independent, easy
                                         Yes           Yes                                                                                            integration with Ruby projects
                                                                    (http://pivotal.github.com/jasmine)          and continuous builds. Allows for bot
                                                                                                                                                       h DOM-less testing and
  screw-unit                                                                                                     asynchronous testing.
                                         Yes           No           [11 2]
                                                                                                                 Requires jQuery
  Test.Simple     No[11 3]    Yes        Yes           No          [11 4]                                       Write TAP-emitting unit tests in JavaSc
                                                                                                                                                        ript and run them in your
                                                                                                                browser.
  Test.More       No[1]       Yes        Yes           No          [11 5]                                       Write TAP-emitting unit tests in JavaSc
                                                                                                                                                       ript and run them in your
  TestCase                                                                                                      browser.
                                         Yes           No          [11 6]
 TestIt
                                         Yes          Yes          [11 7]
 jsUnitTest                                                                                                     Light-weight, non-polluting, and eas
                                         Yes                                                                                                         y to set up and use
                                                    Yes[11 8]
 JSTest                                                                                                         Based on TestCase but without the Pro
                                        Yes                                                                                                             totype dependency
                                                      No          [11 9]
                                                                                                                Light-weight, non-polluting browser-b
 JSTest.NET                                                                                                                                            ased framework
                                         No           Yes         [115] (http://jstest.codeplex.com)            Browserless JavaScript unit test runner
                                                                                                                                                        for use with MsTest, XUnit,
 jsUnity          Yes                                                                                           NUnit, etc.
                              No        Yes          Yes          [116] (http://jsunity.com/)
RhinoUnit                                                                                                      Context-agnostic (JavaScript, JScript
                                        No           Yes         [12 0]                                                                              (ASP/WSH), Rhino, etc.)
                                                                                                               Rhino-based framework that allows test
JasUnit                                                                                                                                                 s to be run in Ant
                  Yes         No        Yes          No          [12 1]                                        Light-weight framework. Part of a pro
                                                                                                                                                      ject that provides Mocks and
                                                                                                               IoC.)
FireUnit
                                        Yes          No          [117] (http://fireunit.org/)                  Testing framework that provides loggin
                                                                                                                                                        g and viewing within a new
                                                                                                               tab of Firebug.
Js-test-
driver            Yes                   Yes          No          [12 2]                                        The goal of JsTestDriver is to build a
                                                                                                                                                      JavaSc
describe "2 + 2", ->
  it "is 4", ->
    expect(2 + 2).toEqual 4




describe("2 + 2", function() {
  it("should be 4", function() {
    expect(2 + 2).toEqual(4);
  });
});
$ jasmine-headless-webkit -c

Running Jasmine specs...
.
PASS: 1 test, 0 failures, 0.003 secs.

Test ordering seed: --seed 2026
encrypt = ->
  plainText = $("#plain-text").val()
  $.get "/encrypt", {text: plainText}, update

update = (data) ->
  $("#encrypted-text").val data.text

$ ->
  $("#plain-text").keyup encrypt
source "https://rubygems.org"

...

group :development, :test do
  ...
  gem "jasmine-headless-webkit"
  gem "jasmine-spec-extras"
end
src_files:
  - ["application.js"]
helpers:
  - helpers/**/*
spec_files:
  - "**/*[Ss]pec.*"
src_dir:
- app/assets/javascripts
- vendor/assets/javascripts
spec_dir: spec/javascripts
describe "Encryptor", ->
  beforeEach ->
    loadFixtures "encryptor.html"

  describe ".update", ->
    ...




<input id="plain-text" />
<input id="encrypted-text" />
describe "Encryptor", ->
  beforeEach ->
    loadFixtures "encryptor.html"

  describe ".update", ->
    it "sets the #encrypted-text element's value to the
        supplied data's text attribute", ->
      update {text: "foo"}
      expect($("#encrypted-text").val()).toEqual "foo"
Running Jasmine specs...
F
FAIL: 1 test, 1 failure, 0.003 secs.

Encryptor .update sets the #encrypted-text
element's value to the supplied data's text
attribute. (...spec/javascripts/
encryptor_spec.coffee:3)

  ReferenceError: Can't find variable: update
// Generated by CoffeeScript 1.6.1
(function() {
  var encrypt, update;

  encrypt = function() {
     var plainText;
     plainText = $("#plain-text").val();
     return $.get("/encrypt", {
       text: plainText
     }, update);
  };

  update = function(data) {
     return $("#encrypted-text").val(data.text);
  };

  $(function() {
    return $("#plain-text").keyup(encrypt);
  });

}).call(this);
class Encryptor
  constructor: ->
    $("#plain-text").keyup @encrypt

  encrypt: =>
    plainText = $("#plain-text").val()
    $.get "/encrypt", {text: plainText}, @update

  update: (data) =>
    $("#encrypted-text").val data.text

$ ->
  window.encryptor = new Encryptor
describe ".encrypt", ->
  it "requests encryption of the #plain-text field,
      calling .update on success", ->

    $("#plain-text").val "foo"
    spyOn $, "get"

    window.encryptor.encrypt()

    expect($.get).toHaveBeenCalledWith "/encrypt",
      {text: "foo"}, window.encryptor.update
someObject = {doSomething: ->}

describe "an easy mistake to make", ->
  it "catches me out all the time", ->
    spyOn someObject, "doSomething"

    # Should fail – I'm not calling doSomething
    expect(someObject.doSomething).toHaveBeenCalled




Running Jasmine specs...
.
PASS: 1 test, 0 failures, 0.004 secs.

Test ordering seed: --seed 7220
Tuesday 2 April, 7pm
  The Brewery Tap

More Related Content

More from Kerry Buckley

Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
Kerry Buckley
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
Background processing
Background processingBackground processing
Background processing
Kerry Buckley
 

More from Kerry Buckley (20)

BDD with cucumber
BDD with cucumberBDD with cucumber
BDD with cucumber
 
Ruby nooks & crannies
Ruby nooks & cranniesRuby nooks & crannies
Ruby nooks & crannies
 
TDD refresher
TDD refresherTDD refresher
TDD refresher
 
Javasccript MV* frameworks
Javasccript MV* frameworksJavasccript MV* frameworks
Javasccript MV* frameworks
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
 
7li7w devcon5
7li7w devcon57li7w devcon5
7li7w devcon5
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
 
Functional ruby
Functional rubyFunctional ruby
Functional ruby
 
MongoMapper lightning talk
MongoMapper lightning talkMongoMapper lightning talk
MongoMapper lightning talk
 
Ruby
RubyRuby
Ruby
 
Cloud
CloudCloud
Cloud
 
The secret life of bees
The secret life of beesThe secret life of bees
The secret life of bees
 
Background processing
Background processingBackground processing
Background processing
 
Katas, Contests and Coding Dojos
Katas, Contests and Coding DojosKatas, Contests and Coding Dojos
Katas, Contests and Coding Dojos
 
Rack
RackRack
Rack
 
Doing REST Right
Doing REST RightDoing REST Right
Doing REST Right
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
 
Software Development Trends
Software Development TrendsSoftware Development Trends
Software Development Trends
 
TDD
TDDTDD
TDD
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 

Jasmine

  • 1. Javascript is software too! (so where are the unit tests?) Kerry Buckley — @kerryb FESuffolk lightning talk 25 March 2013
  • 4. UT No Yes ut/) No [107] (http://lbrtw.com/javascript-unit- Developed as a learning project test-framework-part-1) JSUnit Yes No Yes No [108] (http://www.jsunit.net/) JSUnit is no longer actively maintain Enhance JS Yes ed No Yes No [10 6] QUnit Port of Enhance PHP Yes Yes [109] (http://qunitjs.com/) jQuery test harness RhUnit [110] Yes Yes (http://www.iankent.co.uk/rhunit/) QUnit compatible Rhino/JUnit framew Crosscheck ork No Yes [10 7] J3Unit Browserless java-based framework Yes No [111] (http://j3unit.sourceforge.net/) Mocha No Yes [112] Yes Yes (http://visionmedia.github.com/moch JSNUnit a/) Yes No [10 8] YUI Test Yes Yes Yes Yes [10 9] JSSpec Yes No [11 0] UnitTesting Behaviour-driven development framew Yes ork No [11 1] script.aculo.us javascript test harness JSpec [113] Yes Yes Highly readable BDD, 50+ matchers (http://visionmedia.github.com/jspec) , DOM / framework independent, async, rhino, node.js support and mo re (no longer maintained) Jasmine [114] BDD, framework independent, easy Yes Yes integration with Ruby projects (http://pivotal.github.com/jasmine) and continuous builds. Allows for bot h DOM-less testing and screw-unit asynchronous testing. Yes No [11 2] Requires jQuery Test.Simple No[11 3] Yes Yes No [11 4] Write TAP-emitting unit tests in JavaSc ript and run them in your browser. Test.More No[1] Yes Yes No [11 5] Write TAP-emitting unit tests in JavaSc ript and run them in your TestCase browser. Yes No [11 6] TestIt Yes Yes [11 7] jsUnitTest Light-weight, non-polluting, and eas Yes y to set up and use Yes[11 8] JSTest Based on TestCase but without the Pro Yes totype dependency No [11 9] Light-weight, non-polluting browser-b JSTest.NET ased framework No Yes [115] (http://jstest.codeplex.com) Browserless JavaScript unit test runner for use with MsTest, XUnit, jsUnity Yes NUnit, etc. No Yes Yes [116] (http://jsunity.com/) RhinoUnit Context-agnostic (JavaScript, JScript No Yes [12 0] (ASP/WSH), Rhino, etc.) Rhino-based framework that allows test JasUnit s to be run in Ant Yes No Yes No [12 1] Light-weight framework. Part of a pro ject that provides Mocks and IoC.) FireUnit Yes No [117] (http://fireunit.org/) Testing framework that provides loggin g and viewing within a new tab of Firebug. Js-test- driver Yes Yes No [12 2] The goal of JsTestDriver is to build a JavaSc
  • 5.
  • 6.
  • 7. describe "2 + 2", -> it "is 4", -> expect(2 + 2).toEqual 4 describe("2 + 2", function() { it("should be 4", function() { expect(2 + 2).toEqual(4); }); });
  • 8. $ jasmine-headless-webkit -c Running Jasmine specs... . PASS: 1 test, 0 failures, 0.003 secs. Test ordering seed: --seed 2026
  • 9.
  • 10. encrypt = -> plainText = $("#plain-text").val() $.get "/encrypt", {text: plainText}, update update = (data) -> $("#encrypted-text").val data.text $ -> $("#plain-text").keyup encrypt
  • 11. source "https://rubygems.org" ... group :development, :test do ... gem "jasmine-headless-webkit" gem "jasmine-spec-extras" end
  • 12. src_files: - ["application.js"] helpers: - helpers/**/* spec_files: - "**/*[Ss]pec.*" src_dir: - app/assets/javascripts - vendor/assets/javascripts spec_dir: spec/javascripts
  • 13. describe "Encryptor", -> beforeEach -> loadFixtures "encryptor.html" describe ".update", -> ... <input id="plain-text" /> <input id="encrypted-text" />
  • 14. describe "Encryptor", -> beforeEach -> loadFixtures "encryptor.html" describe ".update", -> it "sets the #encrypted-text element's value to the supplied data's text attribute", -> update {text: "foo"} expect($("#encrypted-text").val()).toEqual "foo"
  • 15. Running Jasmine specs... F FAIL: 1 test, 1 failure, 0.003 secs. Encryptor .update sets the #encrypted-text element's value to the supplied data's text attribute. (...spec/javascripts/ encryptor_spec.coffee:3) ReferenceError: Can't find variable: update
  • 16. // Generated by CoffeeScript 1.6.1 (function() { var encrypt, update; encrypt = function() { var plainText; plainText = $("#plain-text").val(); return $.get("/encrypt", { text: plainText }, update); }; update = function(data) { return $("#encrypted-text").val(data.text); }; $(function() { return $("#plain-text").keyup(encrypt); }); }).call(this);
  • 17. class Encryptor constructor: -> $("#plain-text").keyup @encrypt encrypt: => plainText = $("#plain-text").val() $.get "/encrypt", {text: plainText}, @update update: (data) => $("#encrypted-text").val data.text $ -> window.encryptor = new Encryptor
  • 18. describe ".encrypt", -> it "requests encryption of the #plain-text field, calling .update on success", -> $("#plain-text").val "foo" spyOn $, "get" window.encryptor.encrypt() expect($.get).toHaveBeenCalledWith "/encrypt", {text: "foo"}, window.encryptor.update
  • 19. someObject = {doSomething: ->} describe "an easy mistake to make", -> it "catches me out all the time", -> spyOn someObject, "doSomething" # Should fail – I'm not calling doSomething expect(someObject.doSomething).toHaveBeenCalled Running Jasmine specs... . PASS: 1 test, 0 failures, 0.004 secs. Test ordering seed: --seed 7220
  • 20.
  • 21. Tuesday 2 April, 7pm The Brewery Tap