SlideShare a Scribd company logo
1
Test Driven development
& Jasmine
Anup Singh
https://in.linkedin.com/in/anupsinghpune
Points to Discuss
• Unit Testing & Test Driven Development
• Debugging JS
• Writing Testable Code
• Designing own testing framework
• Jasmine
• Testing Forms
2https://in.linkedin.com/in/anupsinghpune
How do you test your JS?
1. Write your JavaScript code
2. See if it works in your favourite browser
3. Change something + [F5]
4. If it doesn't work repeat #3 until you make it work or you
go crazy...
5. In case you made it work, discover few days/weeks later
that it doesn't work in another browser
3https://in.linkedin.com/in/anupsinghpune
I think I'm going crazy...
4https://in.linkedin.com/in/anupsinghpune
Unit Testing
• In computer programming, unit testing is a
procedure used to validate that individual
modules or units of source code are working
properly.
• Unit testing is used for
(i) Test Driven Development
(ii) Fixing bugs
(iii) Regression testing
5https://in.linkedin.com/in/anupsinghpune
Test Driven Development
• Test-Driven Development (TDD) is a computer
programming technique that involves
repeatedly first writing a test case and then
implementing only the code necessary to pass
the test.
• Test-driven development is a method of
designing software, not merely a method of
testing.
6https://in.linkedin.com/in/anupsinghpune
Test Driven Development
• TDD in its simplest form is just this:
– Write your tests
– Watch them fail
– Make them pass
– Refactor
– Repeat
7https://in.linkedin.com/in/anupsinghpune
The TDD Micro-Cycle
8https://in.linkedin.com/in/anupsinghpune
Fixing bugs/Regression Testing
9
• Fixing bugs
• Regression testing
https://in.linkedin.com/in/anupsinghpune
What do you need?
• A Unit Testing framework
• Development Environment
10https://in.linkedin.com/in/anupsinghpune
Tools
 Firebug - The popular developer extension for Firefox that got the ball rolling.
See http://getfirebug.org/.
 IE Developer Tools - Included in Internet Explorer 8 and later.
 Opera Dragonfly - Included in Opera 9.5 and newer. Also works with mobile versions of Opera.
 WebKit Developer Tools - Introduced in Safari 3, dramatically improved as of Safari 4, and now available in Chrome.
Logging - http://patik.com/blog/complete-cross-browser-console-log/
1. alert()
2. Console.log()
3. Common logging method that for all modern browsers
function log() {
try {
console.log.apply(console, arguments);
} catch (e) {
try {
opera.postError.apply(opera, arguments);
} catch (e) {
alert(Array.prototype.join.call(arguments, " "));
}
}
}
1. Tries to log message using the
most common method
2. Catches any failure in logging
3. Tries to log the Opera way
Uses alert if all else fails
Testing and debugging - Debugging code
Breakpoints allow us to halt execution at a specific line of code so we can take a gander at the state.
<!DOCTYPE html>
<html>
<head>
<title>Listing 2.2</title>
<script type="text/javascript" src="log.js"></script>
<script type="text/javascript">
var x = 213;
log(x);
</script>
</head>
<body>
</body>
</html>
Testing and debugging - Breakpoints
https://in.linkedin.com/in/anupsinghpune
Good tests make Good code - Emphasis on the word good.
It's quite possible to have an extensive test suite that doesn't really help the quality of our
code, if the tests are poorly constructed.
Good tests exhibit three important characteristics:
1. Repeatability - Our test results should be highly reproducible. Tests run repeatedly should always produce
the exact same results. If test results are nondeterministic, how would we know which results are valid and which
are invalid?
2. Simplicity - Our tests should focus on testing one thing. We should strive to remove as much HTML markup,
CSS, or JavaScript as we can without disrupting the intent of the test case. The more we remove, the greater the
likelihood that the test case will only be influenced by the specific code that we’re testing.
3. Independence - Our tests should execute in isolation. We must avoid making the results from one test
dependent upon another. Breaking tests down into the smallest possible
Test generation
https://in.linkedin.com/in/anupsinghpune
A test suite should serve as a fundamental part of your development workflow, so you
should pick a suite that works particularly well for your coding style and your
code
base.
JavaScript unit testing framework features
• The ability to simulate browser behaviour (clicks, keypresses, and so on)
• Interactive control of tests (pausing and resuming tests)
• Handling asynchronous test timeouts
• The ability to filter which tests are to be executed
Testing Frameworks
https://in.linkedin.com/in/anupsinghpune
Market Share of Testing frameworks
15https://in.linkedin.com/in/anupsinghpune
The fundamentals of a test suite
The fundamentals of a test suite
1. Aggregate all the individual tests into a single unit
2. Run the in Bulk
3. Providing a single resource that can be run easily and repeatedly
How to construct a test suite
Q. Why would I want to build a new test suite, When There are already a number of good-quality suites
to choose from?
A. Building your own test suite can serve as a good learning experience, especially when looking at how
asynchronous testing works.
16https://in.linkedin.com/in/anupsinghpune
The Assertion – (assert.html)
17
1. The core of a unit-testing framework is its assertion method, usually named
assert().
2. This takes a value—an expression whose premise is asserted—and a
description that describes the purpose of the assertion. If the value
evaluates to true
3. Either the assertion passes or it’s considered a failure.
4. The associated message is usually logged with an appropriate pass/fail
indicator.
https://in.linkedin.com/in/anupsinghpune
Simple Implementation of JavaScript
Assertion
18https://in.linkedin.com/in/anupsinghpune
More Examples -
• Custom/1_jq_test.html
• Custom/assert.html
• Custom/test_group.html
19https://in.linkedin.com/in/anupsinghpune
Test Groups – (test_group.html)
1. Grouping assertions together in a testing context to form test
groups.
2. Test group will likely represent a collection of assertions as they
relate to a single method in our API or application
3. If any assertion fails, then the entire test group is marked as failing
20https://in.linkedin.com/in/anupsinghpune
So what's the first step to sanity?
WRITE TESTABLE CODE
21https://in.linkedin.com/in/anupsinghpune
What's wrong with this code?
js_sample_001.js
(inline functions and more inside, ajax
directly hooked to element, etc.)
22https://in.linkedin.com/in/anupsinghpune
Anonymous functions, within functions,
within functions...
23https://in.linkedin.com/in/anupsinghpune
I'll put functions in your functions...
24https://in.linkedin.com/in/anupsinghpune
All your DOM elements are belong to JS!
25https://in.linkedin.com/in/anupsinghpune
Server URL coupling
js_sample_001.js
(with highlighted hardcoded url)
26https://in.linkedin.com/in/anupsinghpune
Refactoring...
js_sample_002.js
27https://in.linkedin.com/in/anupsinghpune
Refactoring...
js_sample_002.js
28https://in.linkedin.com/in/anupsinghpune
Now that's better...
29
js_sample_003.js
(init func and hooked named functions to
page)
https://in.linkedin.com/in/anupsinghpune
Now that's better...
30https://in.linkedin.com/in/anupsinghpune
Now that's better...
31https://in.linkedin.com/in/anupsinghpune
Now what about testing?
Popular JS Unit-testing frameworks:
 QUnit
 Jasmine
 UnitJS
 JsUnit (no longer actively maintained)
 Some other – see:
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#JavaScript
32https://in.linkedin.com/in/anupsinghpune
Introducing Jasmine
• Testing framework
• Suites possess a hierarchical structure
• Tests as specifications
• Matchers, both built-in and custom
• Spies, a test double pattern
33https://in.linkedin.com/in/anupsinghpune
Jasmine suite
describe("A specification suite", function() {
…
});
• Group specifications together using nested
describe function blocks.
• Also useful for delineating context-specific
specifications.
34https://in.linkedin.com/in/anupsinghpune
Jasmine specification
describe("A specification suite", function() {
it(“contains spec with an expectation", function() {
expect(view.tagName).toBe(‘tr’);
});
});
• Specifications are expressed with the it function.
• The description should read well in the report.
• Expectations are expressed with the expect
function
35https://in.linkedin.com/in/anupsinghpune
• The describe function, describes a feature of an application. It acts as an
aggregating container for individual tests. You can think of the describe blocks as of
test suites. The describe blocks can be nested inside each other.
• The test itself is located inside the it function. The idea is to exercise one particular
aspect of a feature in one test. A test has a name and a body. Usually the first section
of the test's body calls methods on an object under test while the later one verifies
expected results.
• Code contained in the beforeEach block will get executed before each individual
test. This is a perfect place for any initialization logic that has to be executed before
each test.
• The last things to mention are the expect and the toEqual functions. Using those
two constructs we can compare actual results with the expected ones. Jasmine,
comes with a rich set of matchers, toBeTruthy, toBeDefined, toContain are just
few examples of what is available.
Jasmine specification
36https://in.linkedin.com/in/anupsinghpune
Jasmine matchers
• not
• toBe
• toEqual
• toMatch
• toBeDefined
• toBeUndefined
• toBeNull
• toBeTruthy
• toBeFalsy
• toContain
• toBeLessThan
• toBeGreaterThan
• toBeCloseTo
• toThrow
37https://in.linkedin.com/in/anupsinghpune
Jasmine setup using beforeEach
describe("PintailConsulting.ToDoListView", function() {
var view;
beforeEach(function(){
view = new PintailConsulting.ToDoListView();
});
it(“sets the tagName to ‘div’", function() {
expect(view.tagName).toBe(‘div’);
});
});
38https://in.linkedin.com/in/anupsinghpune
Jasmine tear down using afterEach
describe("PintailConsulting.ToDoListView", function() {
var view;
beforeEach(function(){
view = new PintailConsulting.ToDoListView();
});
afterEach(function(){
view = null;
});
it(“sets the tagName to ‘div’", function() {
expect(view.tagName).toBe(‘div’);
});
});
39https://in.linkedin.com/in/anupsinghpune
Jasmine custom matchers
beforeEach(function() {
this.addMatchers({
toBeLessThan: function(expected) {
var actual = this.actual;
var notText = this.isNot ? " not" : "";
this.message = function () {
return "Expected " + actual + notText + " to be less than " +
expected;
}
return actual < expected;
}
});
});
40https://in.linkedin.com/in/anupsinghpune
Jasmine spies
• Test double pattern.
• Interception-based test double mechanism provided by the
Jasmine library.
• Spies record invocations and invocation parameters, allowing you
to inspect the spy after exercising the SUT.
• Very similar to mock objects.
• More information at
https://github.com/pivotal/jasmine/wiki/Spies.
41https://in.linkedin.com/in/anupsinghpune
Jasmine spy usage
Spying and verifying invocation
var spy = spyOn(dependency, “render”);
systemUnderTest.display();
expect(spy).toHaveBeenCalled();
Spying, verifying invocation and argument(s)
var spy = spyOn(dependency, “render”);
systemUnderTest.display(“Hello”);
expect(spy).toHaveBeenCalledWith(“Hello”);
42https://in.linkedin.com/in/anupsinghpune
Jasmine spy usage
Spying, verifying number of invocations and
arguments for each call
var spy = spyOn(Leaflet, “circle”).andCallThrough();
mapView.processResults(earthquakeJsonResults);
expect(spy).toHaveBeenCalled()
expect(circleConstructorSpy.callCount).toBe(2);
expect(circleConstructorSpy.argsForCall[0][0]).toEqual([56.681
2, -155.0237])
43https://in.linkedin.com/in/anupsinghpune
Loose matching with jasmine.any
• Accepts a constructor or “class” name as an expected
value.
• Returns true if the constructor matches the constructor of
the actual value.
var spy = jasmine.createSpy(My.Namespace, ’foo’);
foo(12, function(x) { return x * x; });
expect(spy).toHaveBeenCalledWith
(jasmine.any(Number), jasmine.any(Function));
44https://in.linkedin.com/in/anupsinghpune
Jasmine spy usage
• andCallThrough(): Allows the invocation to
passthrough to the real subject.
• andReturn(result): Return a hard-coded result.
• andCallFake(fakeImplFunction): Return a
dynamically generated result from a function.
• createSpy(identity): Manually create a spy.
• createSpyObj(identity, propertiesArray): Creates a
mock with multiple property spies.
45https://in.linkedin.com/in/anupsinghpune
Jasmine asynchronous support
• Use runs and waitsFor blocks and a latch function.
• The latch function polls until it returns true or the
timeout expires, whichever comes first.
• If the timeout expires, the specification fails with a
message.
• Kind of clunky to use.
46https://in.linkedin.com/in/anupsinghpune
Jasmine asynchronous example
describe("an async spec", function() {
var done;
beforeEach(function() {
done = false;
var doStuff = function() {
// simulate async stuff and wait 10ms
setTimeout(function() { done = true; }, 10);
};
runs(doStuff);
waitsFor(function() { return done; }, ‘The doStuff function should be done by
now.’, 100);
});
it("did stuff", function() {
expect(done).toBe(true);
});
});
47https://in.linkedin.com/in/anupsinghpune

More Related Content

What's hot (20)

Testing in-python-and-pytest-framework
Testing in-python-and-pytest-frameworkTesting in-python-and-pytest-framework
Testing in-python-and-pytest-framework
Arulalan T
 
AngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and JasmineAngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and Jasmine
foxp2code
 
Testing Legacy Rails Apps
Testing Legacy Rails AppsTesting Legacy Rails Apps
Testing Legacy Rails Apps
Rabble .
 
Jasmine BDD for Javascript
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for Javascript
Luis Alfredo Porras Páez
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJS
Jim Lynch
 
Angular testing
Angular testingAngular testing
Angular testing
Raissa Ferreira
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
Knoldus Inc.
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with Jest
Michał Pierzchała
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
Gil Fink
 
Angularjs - Unit testing introduction
Angularjs - Unit testing introductionAngularjs - Unit testing introduction
Angularjs - Unit testing introduction
Nir Kaufman
 
Intro to testing Javascript with jasmine
Intro to testing Javascript with jasmineIntro to testing Javascript with jasmine
Intro to testing Javascript with jasmine
Timothy Oxley
 
AngularJS Unit Test
AngularJS Unit TestAngularJS Unit Test
AngularJS Unit Test
Chiew Carol
 
Unit-testing and E2E testing in JS
Unit-testing and E2E testing in JSUnit-testing and E2E testing in JS
Unit-testing and E2E testing in JS
Michael Haberman
 
Unit Testing in iOS
Unit Testing in iOSUnit Testing in iOS
Unit Testing in iOS
Long Weekend LLC
 
iOS Unit Testing
iOS Unit TestingiOS Unit Testing
iOS Unit Testing
sgleadow
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Harry Potter
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
David Wheeler
 
20111018 boost and gtest
20111018 boost and gtest20111018 boost and gtest
20111018 boost and gtest
Will Shen
 
Test-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS Applications
FITC
 
Laravel Unit Testing
Laravel Unit TestingLaravel Unit Testing
Laravel Unit Testing
Dr. Syed Hassan Amin
 
Testing in-python-and-pytest-framework
Testing in-python-and-pytest-frameworkTesting in-python-and-pytest-framework
Testing in-python-and-pytest-framework
Arulalan T
 
AngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and JasmineAngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and Jasmine
foxp2code
 
Testing Legacy Rails Apps
Testing Legacy Rails AppsTesting Legacy Rails Apps
Testing Legacy Rails Apps
Rabble .
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJS
Jim Lynch
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
Knoldus Inc.
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with Jest
Michał Pierzchała
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
Gil Fink
 
Angularjs - Unit testing introduction
Angularjs - Unit testing introductionAngularjs - Unit testing introduction
Angularjs - Unit testing introduction
Nir Kaufman
 
Intro to testing Javascript with jasmine
Intro to testing Javascript with jasmineIntro to testing Javascript with jasmine
Intro to testing Javascript with jasmine
Timothy Oxley
 
AngularJS Unit Test
AngularJS Unit TestAngularJS Unit Test
AngularJS Unit Test
Chiew Carol
 
Unit-testing and E2E testing in JS
Unit-testing and E2E testing in JSUnit-testing and E2E testing in JS
Unit-testing and E2E testing in JS
Michael Haberman
 
iOS Unit Testing
iOS Unit TestingiOS Unit Testing
iOS Unit Testing
sgleadow
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Harry Potter
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
David Wheeler
 
20111018 boost and gtest
20111018 boost and gtest20111018 boost and gtest
20111018 boost and gtest
Will Shen
 
Test-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS Applications
FITC
 

Viewers also liked (20)

CasperJS and PhantomJS for Automated Testing
CasperJS and PhantomJS for Automated TestingCasperJS and PhantomJS for Automated Testing
CasperJS and PhantomJS for Automated Testing
X-Team
 
Javascript Unit Testing Tools
Javascript Unit Testing ToolsJavascript Unit Testing Tools
Javascript Unit Testing Tools
PixelCrayons
 
jasmine
jasminejasmine
jasmine
Asanka Indrajith
 
Automated Testing With Jasmine, PhantomJS and Jenkins
Automated Testing With Jasmine, PhantomJS and JenkinsAutomated Testing With Jasmine, PhantomJS and Jenkins
Automated Testing With Jasmine, PhantomJS and Jenkins
Work at Play
 
Javascript unit tests with angular 1.x
Javascript unit tests with angular 1.xJavascript unit tests with angular 1.x
Javascript unit tests with angular 1.x
Ron Apelbaum
 
Site Testing with CasperJS
Site Testing with CasperJSSite Testing with CasperJS
Site Testing with CasperJS
Joseph Scott
 
Test driven development
Test driven developmentTest driven development
Test driven development
Dennis Ahaus
 
CasperJS
CasperJSCasperJS
CasperJS
LearningTech
 
Angular testing
Angular testingAngular testing
Angular testing
Yu Jin
 
Developer Experience to Testing
Developer Experience to TestingDeveloper Experience to Testing
Developer Experience to Testing
Mozaic Works
 
Testing javascript in the frontend
Testing javascript in the frontendTesting javascript in the frontend
Testing javascript in the frontend
Frederic CABASSUT
 
JavaScript Unit Testing
JavaScript Unit TestingJavaScript Unit Testing
JavaScript Unit Testing
Keir Bowden
 
Unit Testing Lightning Components with Jasmine
Unit Testing Lightning Components with JasmineUnit Testing Lightning Components with Jasmine
Unit Testing Lightning Components with Jasmine
Keir Bowden
 
The Developer Experience
The Developer ExperienceThe Developer Experience
The Developer Experience
Atlassian
 
Introducing Sencha Touch 2
Introducing Sencha Touch 2Introducing Sencha Touch 2
Introducing Sencha Touch 2
Sencha
 
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven DevelopmentABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
Hendrik Neumann
 
Test Driven Development (TDD) & Continuous Integration (CI)
Test Driven Development (TDD) & Continuous Integration (CI)Test Driven Development (TDD) & Continuous Integration (CI)
Test Driven Development (TDD) & Continuous Integration (CI)
Fatkul Amri
 
Test Driven Development SpeedRun
Test Driven Development SpeedRunTest Driven Development SpeedRun
Test Driven Development SpeedRun
Speck&Tech
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
Gavin Pickin
 
Javascript testing: tools of the trade
Javascript testing: tools of the tradeJavascript testing: tools of the trade
Javascript testing: tools of the trade
Juanma Orta
 
CasperJS and PhantomJS for Automated Testing
CasperJS and PhantomJS for Automated TestingCasperJS and PhantomJS for Automated Testing
CasperJS and PhantomJS for Automated Testing
X-Team
 
Javascript Unit Testing Tools
Javascript Unit Testing ToolsJavascript Unit Testing Tools
Javascript Unit Testing Tools
PixelCrayons
 
Automated Testing With Jasmine, PhantomJS and Jenkins
Automated Testing With Jasmine, PhantomJS and JenkinsAutomated Testing With Jasmine, PhantomJS and Jenkins
Automated Testing With Jasmine, PhantomJS and Jenkins
Work at Play
 
Javascript unit tests with angular 1.x
Javascript unit tests with angular 1.xJavascript unit tests with angular 1.x
Javascript unit tests with angular 1.x
Ron Apelbaum
 
Site Testing with CasperJS
Site Testing with CasperJSSite Testing with CasperJS
Site Testing with CasperJS
Joseph Scott
 
Test driven development
Test driven developmentTest driven development
Test driven development
Dennis Ahaus
 
Angular testing
Angular testingAngular testing
Angular testing
Yu Jin
 
Developer Experience to Testing
Developer Experience to TestingDeveloper Experience to Testing
Developer Experience to Testing
Mozaic Works
 
Testing javascript in the frontend
Testing javascript in the frontendTesting javascript in the frontend
Testing javascript in the frontend
Frederic CABASSUT
 
JavaScript Unit Testing
JavaScript Unit TestingJavaScript Unit Testing
JavaScript Unit Testing
Keir Bowden
 
Unit Testing Lightning Components with Jasmine
Unit Testing Lightning Components with JasmineUnit Testing Lightning Components with Jasmine
Unit Testing Lightning Components with Jasmine
Keir Bowden
 
The Developer Experience
The Developer ExperienceThe Developer Experience
The Developer Experience
Atlassian
 
Introducing Sencha Touch 2
Introducing Sencha Touch 2Introducing Sencha Touch 2
Introducing Sencha Touch 2
Sencha
 
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven DevelopmentABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
ABAP Code Retreat Frankfurt 2016: TDD - Test Driven Development
Hendrik Neumann
 
Test Driven Development (TDD) & Continuous Integration (CI)
Test Driven Development (TDD) & Continuous Integration (CI)Test Driven Development (TDD) & Continuous Integration (CI)
Test Driven Development (TDD) & Continuous Integration (CI)
Fatkul Amri
 
Test Driven Development SpeedRun
Test Driven Development SpeedRunTest Driven Development SpeedRun
Test Driven Development SpeedRun
Speck&Tech
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
Gavin Pickin
 
Javascript testing: tools of the trade
Javascript testing: tools of the tradeJavascript testing: tools of the trade
Javascript testing: tools of the trade
Juanma Orta
 
Ad

Similar to JAVASCRIPT Test Driven Development & Jasmine (20)

Implementing TDD in for .net Core applications
Implementing TDD in for .net Core applicationsImplementing TDD in for .net Core applications
Implementing TDD in for .net Core applications
Ahmad Kazemi
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
JavaScript Unit Testing
JavaScript Unit TestingJavaScript Unit Testing
JavaScript Unit Testing
L&T Technology Services Limited
 
3 WAYS TO TEST YOUR COLDFUSION API
3 WAYS TO TEST YOUR COLDFUSION API3 WAYS TO TEST YOUR COLDFUSION API
3 WAYS TO TEST YOUR COLDFUSION API
Gavin Pickin
 
3 WAYS TO TEST YOUR COLDFUSION API -
3 WAYS TO TEST YOUR COLDFUSION API - 3 WAYS TO TEST YOUR COLDFUSION API -
3 WAYS TO TEST YOUR COLDFUSION API -
Ortus Solutions, Corp
 
Unit testing (Exploring the other side as a tester)
Unit testing (Exploring the other side as a tester)Unit testing (Exploring the other side as a tester)
Unit testing (Exploring the other side as a tester)
Abhijeet Vaikar
 
Zero to Testing in JavaScript
Zero to Testing in JavaScriptZero to Testing in JavaScript
Zero to Testing in JavaScript
pamselle
 
Introduction to Javascript Unit Testing With xUnit.js
Introduction to Javascript Unit Testing With xUnit.jsIntroduction to Javascript Unit Testing With xUnit.js
Introduction to Javascript Unit Testing With xUnit.js
Salesforce Developers
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
Gil Fink
 
Testing for software engineers
Testing for software engineersTesting for software engineers
Testing for software engineers
Mohammed Ashour
 
Writing useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you buildWriting useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you build
Andrei Sebastian Cîmpean
 
Testing Strategies for Node.pdf
Testing Strategies for Node.pdfTesting Strategies for Node.pdf
Testing Strategies for Node.pdf
infowindtech
 
Js unit testingpresentation
Js unit testingpresentationJs unit testingpresentation
Js unit testingpresentation
Jonathan Gregory
 
Unit Testing and TDD 2017
Unit Testing and TDD 2017Unit Testing and TDD 2017
Unit Testing and TDD 2017
Xavi Hidalgo
 
Dot Net Notts Js Unit Testing at Microlise
Dot Net Notts Js Unit Testing at  MicroliseDot Net Notts Js Unit Testing at  Microlise
Dot Net Notts Js Unit Testing at Microlise
Jonathan Gregory
 
In search of JavaScript code quality: unit testing
In search of JavaScript code quality: unit testingIn search of JavaScript code quality: unit testing
In search of JavaScript code quality: unit testing
Anna Khabibullina
 
Agile Testing
Agile Testing  Agile Testing
Agile Testing
Intelliware Development Inc.
 
Agile Testing - What is it?
Agile Testing - What is it?Agile Testing - What is it?
Agile Testing - What is it?
Intelliware Development Inc.
 
How do I Write Testable Javascript so I can Test my CF API on Server and Client
How do I Write Testable Javascript so I can Test my CF API on Server and ClientHow do I Write Testable Javascript so I can Test my CF API on Server and Client
How do I Write Testable Javascript so I can Test my CF API on Server and Client
ColdFusionConference
 
How do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and ClientHow do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and Client
Gavin Pickin
 
Implementing TDD in for .net Core applications
Implementing TDD in for .net Core applicationsImplementing TDD in for .net Core applications
Implementing TDD in for .net Core applications
Ahmad Kazemi
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
3 WAYS TO TEST YOUR COLDFUSION API
3 WAYS TO TEST YOUR COLDFUSION API3 WAYS TO TEST YOUR COLDFUSION API
3 WAYS TO TEST YOUR COLDFUSION API
Gavin Pickin
 
3 WAYS TO TEST YOUR COLDFUSION API -
3 WAYS TO TEST YOUR COLDFUSION API - 3 WAYS TO TEST YOUR COLDFUSION API -
3 WAYS TO TEST YOUR COLDFUSION API -
Ortus Solutions, Corp
 
Unit testing (Exploring the other side as a tester)
Unit testing (Exploring the other side as a tester)Unit testing (Exploring the other side as a tester)
Unit testing (Exploring the other side as a tester)
Abhijeet Vaikar
 
Zero to Testing in JavaScript
Zero to Testing in JavaScriptZero to Testing in JavaScript
Zero to Testing in JavaScript
pamselle
 
Introduction to Javascript Unit Testing With xUnit.js
Introduction to Javascript Unit Testing With xUnit.jsIntroduction to Javascript Unit Testing With xUnit.js
Introduction to Javascript Unit Testing With xUnit.js
Salesforce Developers
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
Gil Fink
 
Testing for software engineers
Testing for software engineersTesting for software engineers
Testing for software engineers
Mohammed Ashour
 
Writing useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you buildWriting useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you build
Andrei Sebastian Cîmpean
 
Testing Strategies for Node.pdf
Testing Strategies for Node.pdfTesting Strategies for Node.pdf
Testing Strategies for Node.pdf
infowindtech
 
Js unit testingpresentation
Js unit testingpresentationJs unit testingpresentation
Js unit testingpresentation
Jonathan Gregory
 
Unit Testing and TDD 2017
Unit Testing and TDD 2017Unit Testing and TDD 2017
Unit Testing and TDD 2017
Xavi Hidalgo
 
Dot Net Notts Js Unit Testing at Microlise
Dot Net Notts Js Unit Testing at  MicroliseDot Net Notts Js Unit Testing at  Microlise
Dot Net Notts Js Unit Testing at Microlise
Jonathan Gregory
 
In search of JavaScript code quality: unit testing
In search of JavaScript code quality: unit testingIn search of JavaScript code quality: unit testing
In search of JavaScript code quality: unit testing
Anna Khabibullina
 
How do I Write Testable Javascript so I can Test my CF API on Server and Client
How do I Write Testable Javascript so I can Test my CF API on Server and ClientHow do I Write Testable Javascript so I can Test my CF API on Server and Client
How do I Write Testable Javascript so I can Test my CF API on Server and Client
ColdFusionConference
 
How do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and ClientHow do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and Client
Gavin Pickin
 
Ad

Recently uploaded (20)

Shortcomings of EHS Software – And How to Overcome Them
Shortcomings of EHS Software – And How to Overcome ThemShortcomings of EHS Software – And How to Overcome Them
Shortcomings of EHS Software – And How to Overcome Them
TECH EHS Solution
 
How AI Can Improve Media Quality Testing Across Platforms (1).pptx
How AI Can Improve Media Quality Testing Across Platforms (1).pptxHow AI Can Improve Media Quality Testing Across Platforms (1).pptx
How AI Can Improve Media Quality Testing Across Platforms (1).pptx
kalichargn70th171
 
Topic 26 Security Testing Considerations.pptx
Topic 26 Security Testing Considerations.pptxTopic 26 Security Testing Considerations.pptx
Topic 26 Security Testing Considerations.pptx
marutnand8
 
Techdebt handling with cleancode focus and as risk taker
Techdebt handling with cleancode focus and as risk takerTechdebt handling with cleancode focus and as risk taker
Techdebt handling with cleancode focus and as risk taker
RajaNagendraKumar
 
Design by Contract - Building Robust Software with Contract-First Development
Design by Contract - Building Robust Software with Contract-First DevelopmentDesign by Contract - Building Robust Software with Contract-First Development
Design by Contract - Building Robust Software with Contract-First Development
Par-Tec S.p.A.
 
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdfHow to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
QuickBooks Training
 
Online Queue Management System for Public Service Offices [Focused on Municip...
Online Queue Management System for Public Service Offices [Focused on Municip...Online Queue Management System for Public Service Offices [Focused on Municip...
Online Queue Management System for Public Service Offices [Focused on Municip...
Rishab Acharya
 
Issues in AI Presentation and machine learning.pptx
Issues in AI Presentation and machine learning.pptxIssues in AI Presentation and machine learning.pptx
Issues in AI Presentation and machine learning.pptx
Jalalkhan657136
 
Software Risk and Quality management.pptx
Software Risk and Quality management.pptxSoftware Risk and Quality management.pptx
Software Risk and Quality management.pptx
HassanBangash9
 
War Story: Removing Offensive Language from Percona Toolkit
War Story: Removing Offensive Language from Percona ToolkitWar Story: Removing Offensive Language from Percona Toolkit
War Story: Removing Offensive Language from Percona Toolkit
Sveta Smirnova
 
Optimising Claims Management with Claims Processing Systems
Optimising Claims Management with Claims Processing SystemsOptimising Claims Management with Claims Processing Systems
Optimising Claims Management with Claims Processing Systems
Insurance Tech Services
 
Internship in South western railways on software
Internship in South western railways on softwareInternship in South western railways on software
Internship in South western railways on software
abhim5889
 
Build enterprise-ready applications using skills you already have!
Build enterprise-ready applications using skills you already have!Build enterprise-ready applications using skills you already have!
Build enterprise-ready applications using skills you already have!
PhilMeredith3
 
Top 10 Mobile Banking Apps in the USA.pdf
Top 10 Mobile Banking Apps in the USA.pdfTop 10 Mobile Banking Apps in the USA.pdf
Top 10 Mobile Banking Apps in the USA.pdf
LL Technolab
 
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdfBoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
Ortus Solutions, Corp
 
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire
 
UberEats clone app Development TechBuilder
UberEats clone app Development  TechBuilderUberEats clone app Development  TechBuilder
UberEats clone app Development TechBuilder
TechBuilder
 
Marketing And Sales Software Services.pptx
Marketing And Sales Software Services.pptxMarketing And Sales Software Services.pptx
Marketing And Sales Software Services.pptx
julia smits
 
AI Alternative - Discover the best AI tools and their alternatives
AI Alternative - Discover the best AI tools and their alternativesAI Alternative - Discover the best AI tools and their alternatives
AI Alternative - Discover the best AI tools and their alternatives
AI Alternative
 
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
gauravvmanchandaa200
 
Shortcomings of EHS Software – And How to Overcome Them
Shortcomings of EHS Software – And How to Overcome ThemShortcomings of EHS Software – And How to Overcome Them
Shortcomings of EHS Software – And How to Overcome Them
TECH EHS Solution
 
How AI Can Improve Media Quality Testing Across Platforms (1).pptx
How AI Can Improve Media Quality Testing Across Platforms (1).pptxHow AI Can Improve Media Quality Testing Across Platforms (1).pptx
How AI Can Improve Media Quality Testing Across Platforms (1).pptx
kalichargn70th171
 
Topic 26 Security Testing Considerations.pptx
Topic 26 Security Testing Considerations.pptxTopic 26 Security Testing Considerations.pptx
Topic 26 Security Testing Considerations.pptx
marutnand8
 
Techdebt handling with cleancode focus and as risk taker
Techdebt handling with cleancode focus and as risk takerTechdebt handling with cleancode focus and as risk taker
Techdebt handling with cleancode focus and as risk taker
RajaNagendraKumar
 
Design by Contract - Building Robust Software with Contract-First Development
Design by Contract - Building Robust Software with Contract-First DevelopmentDesign by Contract - Building Robust Software with Contract-First Development
Design by Contract - Building Robust Software with Contract-First Development
Par-Tec S.p.A.
 
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdfHow to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
How to Generate Financial Statements in QuickBooks Like a Pro (1).pdf
QuickBooks Training
 
Online Queue Management System for Public Service Offices [Focused on Municip...
Online Queue Management System for Public Service Offices [Focused on Municip...Online Queue Management System for Public Service Offices [Focused on Municip...
Online Queue Management System for Public Service Offices [Focused on Municip...
Rishab Acharya
 
Issues in AI Presentation and machine learning.pptx
Issues in AI Presentation and machine learning.pptxIssues in AI Presentation and machine learning.pptx
Issues in AI Presentation and machine learning.pptx
Jalalkhan657136
 
Software Risk and Quality management.pptx
Software Risk and Quality management.pptxSoftware Risk and Quality management.pptx
Software Risk and Quality management.pptx
HassanBangash9
 
War Story: Removing Offensive Language from Percona Toolkit
War Story: Removing Offensive Language from Percona ToolkitWar Story: Removing Offensive Language from Percona Toolkit
War Story: Removing Offensive Language from Percona Toolkit
Sveta Smirnova
 
Optimising Claims Management with Claims Processing Systems
Optimising Claims Management with Claims Processing SystemsOptimising Claims Management with Claims Processing Systems
Optimising Claims Management with Claims Processing Systems
Insurance Tech Services
 
Internship in South western railways on software
Internship in South western railways on softwareInternship in South western railways on software
Internship in South western railways on software
abhim5889
 
Build enterprise-ready applications using skills you already have!
Build enterprise-ready applications using skills you already have!Build enterprise-ready applications using skills you already have!
Build enterprise-ready applications using skills you already have!
PhilMeredith3
 
Top 10 Mobile Banking Apps in the USA.pdf
Top 10 Mobile Banking Apps in the USA.pdfTop 10 Mobile Banking Apps in the USA.pdf
Top 10 Mobile Banking Apps in the USA.pdf
LL Technolab
 
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdfBoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
BoxLang-Dynamic-AWS-Lambda by Luis Majano.pdf
Ortus Solutions, Corp
 
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire Unlocking the Future of Tech Talent with AI-Powered Hiring Solution...
GirikHire
 
UberEats clone app Development TechBuilder
UberEats clone app Development  TechBuilderUberEats clone app Development  TechBuilder
UberEats clone app Development TechBuilder
TechBuilder
 
Marketing And Sales Software Services.pptx
Marketing And Sales Software Services.pptxMarketing And Sales Software Services.pptx
Marketing And Sales Software Services.pptx
julia smits
 
AI Alternative - Discover the best AI tools and their alternatives
AI Alternative - Discover the best AI tools and their alternativesAI Alternative - Discover the best AI tools and their alternatives
AI Alternative - Discover the best AI tools and their alternatives
AI Alternative
 
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
Risk Management in Software Projects: Identifying, Analyzing, and Controlling...
gauravvmanchandaa200
 

JAVASCRIPT Test Driven Development & Jasmine

  • 1. 1 Test Driven development & Jasmine Anup Singh https://in.linkedin.com/in/anupsinghpune
  • 2. Points to Discuss • Unit Testing & Test Driven Development • Debugging JS • Writing Testable Code • Designing own testing framework • Jasmine • Testing Forms 2https://in.linkedin.com/in/anupsinghpune
  • 3. How do you test your JS? 1. Write your JavaScript code 2. See if it works in your favourite browser 3. Change something + [F5] 4. If it doesn't work repeat #3 until you make it work or you go crazy... 5. In case you made it work, discover few days/weeks later that it doesn't work in another browser 3https://in.linkedin.com/in/anupsinghpune
  • 4. I think I'm going crazy... 4https://in.linkedin.com/in/anupsinghpune
  • 5. Unit Testing • In computer programming, unit testing is a procedure used to validate that individual modules or units of source code are working properly. • Unit testing is used for (i) Test Driven Development (ii) Fixing bugs (iii) Regression testing 5https://in.linkedin.com/in/anupsinghpune
  • 6. Test Driven Development • Test-Driven Development (TDD) is a computer programming technique that involves repeatedly first writing a test case and then implementing only the code necessary to pass the test. • Test-driven development is a method of designing software, not merely a method of testing. 6https://in.linkedin.com/in/anupsinghpune
  • 7. Test Driven Development • TDD in its simplest form is just this: – Write your tests – Watch them fail – Make them pass – Refactor – Repeat 7https://in.linkedin.com/in/anupsinghpune
  • 9. Fixing bugs/Regression Testing 9 • Fixing bugs • Regression testing https://in.linkedin.com/in/anupsinghpune
  • 10. What do you need? • A Unit Testing framework • Development Environment 10https://in.linkedin.com/in/anupsinghpune
  • 11. Tools  Firebug - The popular developer extension for Firefox that got the ball rolling. See http://getfirebug.org/.  IE Developer Tools - Included in Internet Explorer 8 and later.  Opera Dragonfly - Included in Opera 9.5 and newer. Also works with mobile versions of Opera.  WebKit Developer Tools - Introduced in Safari 3, dramatically improved as of Safari 4, and now available in Chrome. Logging - http://patik.com/blog/complete-cross-browser-console-log/ 1. alert() 2. Console.log() 3. Common logging method that for all modern browsers function log() { try { console.log.apply(console, arguments); } catch (e) { try { opera.postError.apply(opera, arguments); } catch (e) { alert(Array.prototype.join.call(arguments, " ")); } } } 1. Tries to log message using the most common method 2. Catches any failure in logging 3. Tries to log the Opera way Uses alert if all else fails Testing and debugging - Debugging code
  • 12. Breakpoints allow us to halt execution at a specific line of code so we can take a gander at the state. <!DOCTYPE html> <html> <head> <title>Listing 2.2</title> <script type="text/javascript" src="log.js"></script> <script type="text/javascript"> var x = 213; log(x); </script> </head> <body> </body> </html> Testing and debugging - Breakpoints https://in.linkedin.com/in/anupsinghpune
  • 13. Good tests make Good code - Emphasis on the word good. It's quite possible to have an extensive test suite that doesn't really help the quality of our code, if the tests are poorly constructed. Good tests exhibit three important characteristics: 1. Repeatability - Our test results should be highly reproducible. Tests run repeatedly should always produce the exact same results. If test results are nondeterministic, how would we know which results are valid and which are invalid? 2. Simplicity - Our tests should focus on testing one thing. We should strive to remove as much HTML markup, CSS, or JavaScript as we can without disrupting the intent of the test case. The more we remove, the greater the likelihood that the test case will only be influenced by the specific code that we’re testing. 3. Independence - Our tests should execute in isolation. We must avoid making the results from one test dependent upon another. Breaking tests down into the smallest possible Test generation https://in.linkedin.com/in/anupsinghpune
  • 14. A test suite should serve as a fundamental part of your development workflow, so you should pick a suite that works particularly well for your coding style and your code base. JavaScript unit testing framework features • The ability to simulate browser behaviour (clicks, keypresses, and so on) • Interactive control of tests (pausing and resuming tests) • Handling asynchronous test timeouts • The ability to filter which tests are to be executed Testing Frameworks https://in.linkedin.com/in/anupsinghpune
  • 15. Market Share of Testing frameworks 15https://in.linkedin.com/in/anupsinghpune
  • 16. The fundamentals of a test suite The fundamentals of a test suite 1. Aggregate all the individual tests into a single unit 2. Run the in Bulk 3. Providing a single resource that can be run easily and repeatedly How to construct a test suite Q. Why would I want to build a new test suite, When There are already a number of good-quality suites to choose from? A. Building your own test suite can serve as a good learning experience, especially when looking at how asynchronous testing works. 16https://in.linkedin.com/in/anupsinghpune
  • 17. The Assertion – (assert.html) 17 1. The core of a unit-testing framework is its assertion method, usually named assert(). 2. This takes a value—an expression whose premise is asserted—and a description that describes the purpose of the assertion. If the value evaluates to true 3. Either the assertion passes or it’s considered a failure. 4. The associated message is usually logged with an appropriate pass/fail indicator. https://in.linkedin.com/in/anupsinghpune
  • 18. Simple Implementation of JavaScript Assertion 18https://in.linkedin.com/in/anupsinghpune
  • 19. More Examples - • Custom/1_jq_test.html • Custom/assert.html • Custom/test_group.html 19https://in.linkedin.com/in/anupsinghpune
  • 20. Test Groups – (test_group.html) 1. Grouping assertions together in a testing context to form test groups. 2. Test group will likely represent a collection of assertions as they relate to a single method in our API or application 3. If any assertion fails, then the entire test group is marked as failing 20https://in.linkedin.com/in/anupsinghpune
  • 21. So what's the first step to sanity? WRITE TESTABLE CODE 21https://in.linkedin.com/in/anupsinghpune
  • 22. What's wrong with this code? js_sample_001.js (inline functions and more inside, ajax directly hooked to element, etc.) 22https://in.linkedin.com/in/anupsinghpune
  • 23. Anonymous functions, within functions, within functions... 23https://in.linkedin.com/in/anupsinghpune
  • 24. I'll put functions in your functions... 24https://in.linkedin.com/in/anupsinghpune
  • 25. All your DOM elements are belong to JS! 25https://in.linkedin.com/in/anupsinghpune
  • 26. Server URL coupling js_sample_001.js (with highlighted hardcoded url) 26https://in.linkedin.com/in/anupsinghpune
  • 29. Now that's better... 29 js_sample_003.js (init func and hooked named functions to page) https://in.linkedin.com/in/anupsinghpune
  • 32. Now what about testing? Popular JS Unit-testing frameworks:  QUnit  Jasmine  UnitJS  JsUnit (no longer actively maintained)  Some other – see: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#JavaScript 32https://in.linkedin.com/in/anupsinghpune
  • 33. Introducing Jasmine • Testing framework • Suites possess a hierarchical structure • Tests as specifications • Matchers, both built-in and custom • Spies, a test double pattern 33https://in.linkedin.com/in/anupsinghpune
  • 34. Jasmine suite describe("A specification suite", function() { … }); • Group specifications together using nested describe function blocks. • Also useful for delineating context-specific specifications. 34https://in.linkedin.com/in/anupsinghpune
  • 35. Jasmine specification describe("A specification suite", function() { it(“contains spec with an expectation", function() { expect(view.tagName).toBe(‘tr’); }); }); • Specifications are expressed with the it function. • The description should read well in the report. • Expectations are expressed with the expect function 35https://in.linkedin.com/in/anupsinghpune
  • 36. • The describe function, describes a feature of an application. It acts as an aggregating container for individual tests. You can think of the describe blocks as of test suites. The describe blocks can be nested inside each other. • The test itself is located inside the it function. The idea is to exercise one particular aspect of a feature in one test. A test has a name and a body. Usually the first section of the test's body calls methods on an object under test while the later one verifies expected results. • Code contained in the beforeEach block will get executed before each individual test. This is a perfect place for any initialization logic that has to be executed before each test. • The last things to mention are the expect and the toEqual functions. Using those two constructs we can compare actual results with the expected ones. Jasmine, comes with a rich set of matchers, toBeTruthy, toBeDefined, toContain are just few examples of what is available. Jasmine specification 36https://in.linkedin.com/in/anupsinghpune
  • 37. Jasmine matchers • not • toBe • toEqual • toMatch • toBeDefined • toBeUndefined • toBeNull • toBeTruthy • toBeFalsy • toContain • toBeLessThan • toBeGreaterThan • toBeCloseTo • toThrow 37https://in.linkedin.com/in/anupsinghpune
  • 38. Jasmine setup using beforeEach describe("PintailConsulting.ToDoListView", function() { var view; beforeEach(function(){ view = new PintailConsulting.ToDoListView(); }); it(“sets the tagName to ‘div’", function() { expect(view.tagName).toBe(‘div’); }); }); 38https://in.linkedin.com/in/anupsinghpune
  • 39. Jasmine tear down using afterEach describe("PintailConsulting.ToDoListView", function() { var view; beforeEach(function(){ view = new PintailConsulting.ToDoListView(); }); afterEach(function(){ view = null; }); it(“sets the tagName to ‘div’", function() { expect(view.tagName).toBe(‘div’); }); }); 39https://in.linkedin.com/in/anupsinghpune
  • 40. Jasmine custom matchers beforeEach(function() { this.addMatchers({ toBeLessThan: function(expected) { var actual = this.actual; var notText = this.isNot ? " not" : ""; this.message = function () { return "Expected " + actual + notText + " to be less than " + expected; } return actual < expected; } }); }); 40https://in.linkedin.com/in/anupsinghpune
  • 41. Jasmine spies • Test double pattern. • Interception-based test double mechanism provided by the Jasmine library. • Spies record invocations and invocation parameters, allowing you to inspect the spy after exercising the SUT. • Very similar to mock objects. • More information at https://github.com/pivotal/jasmine/wiki/Spies. 41https://in.linkedin.com/in/anupsinghpune
  • 42. Jasmine spy usage Spying and verifying invocation var spy = spyOn(dependency, “render”); systemUnderTest.display(); expect(spy).toHaveBeenCalled(); Spying, verifying invocation and argument(s) var spy = spyOn(dependency, “render”); systemUnderTest.display(“Hello”); expect(spy).toHaveBeenCalledWith(“Hello”); 42https://in.linkedin.com/in/anupsinghpune
  • 43. Jasmine spy usage Spying, verifying number of invocations and arguments for each call var spy = spyOn(Leaflet, “circle”).andCallThrough(); mapView.processResults(earthquakeJsonResults); expect(spy).toHaveBeenCalled() expect(circleConstructorSpy.callCount).toBe(2); expect(circleConstructorSpy.argsForCall[0][0]).toEqual([56.681 2, -155.0237]) 43https://in.linkedin.com/in/anupsinghpune
  • 44. Loose matching with jasmine.any • Accepts a constructor or “class” name as an expected value. • Returns true if the constructor matches the constructor of the actual value. var spy = jasmine.createSpy(My.Namespace, ’foo’); foo(12, function(x) { return x * x; }); expect(spy).toHaveBeenCalledWith (jasmine.any(Number), jasmine.any(Function)); 44https://in.linkedin.com/in/anupsinghpune
  • 45. Jasmine spy usage • andCallThrough(): Allows the invocation to passthrough to the real subject. • andReturn(result): Return a hard-coded result. • andCallFake(fakeImplFunction): Return a dynamically generated result from a function. • createSpy(identity): Manually create a spy. • createSpyObj(identity, propertiesArray): Creates a mock with multiple property spies. 45https://in.linkedin.com/in/anupsinghpune
  • 46. Jasmine asynchronous support • Use runs and waitsFor blocks and a latch function. • The latch function polls until it returns true or the timeout expires, whichever comes first. • If the timeout expires, the specification fails with a message. • Kind of clunky to use. 46https://in.linkedin.com/in/anupsinghpune
  • 47. Jasmine asynchronous example describe("an async spec", function() { var done; beforeEach(function() { done = false; var doStuff = function() { // simulate async stuff and wait 10ms setTimeout(function() { done = true; }, 10); }; runs(doStuff); waitsFor(function() { return done; }, ‘The doStuff function should be done by now.’, 100); }); it("did stuff", function() { expect(done).toBe(true); }); }); 47https://in.linkedin.com/in/anupsinghpune