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

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Recently uploaded (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day 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