SlideShare a Scribd company logo
1 of 49
Download to read offline
В поисках качества
JavaScript:
модульное тестирование
Анна Хабибуллина
DA-14 / da-14.com
anna.khabibullina@da-14.com
akhabibullina
_khabibullina
ZE QUALITYS?
“Any feature without a test doesn’t exist”
Steve Loughran HP Laboratories
AGENDA
 Unit Testing Concept
 Pros & Cons
 Basic Terms & Structure
 TDD &/vs. BDD
 Tools & Libraries
 Unit Testing Specifics
in JavaScript
 Best Practices
UNIT TESTING CONCEPT
Unit testing is a method by which individual
units of source code are tested to determine
if they are fit for use.
WHY UNIT TESTING?
Unit tests find problems early in the
development cycle (TDD & BDD)
Refactoring
Integration
Documentation
Better design
IS UNIT TESTING A GOOD INVESTMENT?
 slow down the development process
 share the same blind spots with the code
 doesn’t prove that they’re compatible with
one another or configured correctly
BASIC TERMS
In simple words, the goal of assertion is to
forcefully define if the test fails or passes.
STATEMENT PASSES FAILS
x = 1 assert(x > 0) assert(x < 0)
expect(4+5).to.equal(9);
ASSERTION
function initialize() {
// The initialization was successful.
return true;
}
Given the function initialize():
ASSERTION: EXAMPLE
ASSERTION: EXAMPLE
var isInitialized = initialize();
TDD assert.isTrue(isInitialized)
BDD expect(isInitialized).to.be.true
Check that function initialize() returns true
when called.
FIXTURE
A test fixture is a fixed state of the software
under test used as a baseline for running
tests.
In JavaScript for client side:
simulate AJAX responses;
loading known set of data such as html
objects.
FIXTURE: EXAMPLE
Require the piece of markup stored in
myfixturemarkup.html file before each test:
beforeEach(function() {
loadFixtures('myfixturemarkup.html');
});
STUB
Method stubs
are functions
with pre-
programmed
behavior.
STUB: EXAMPLE
Forcing a method to throw an error in order
to test error handling.
var fn = foo.stub().throws(Error);
expect(fn).to.throw(Error);
SPY
A test spy is a
function that
records
arguments,
return value, the
value of this and
exception thrown
(if any) for all its
calls.
SPY: EXAMPLE
Test that a function cursor.hide() has been
only called once, and only once.
sinon.spy(cursor, "hide");
TDD sinon.assert.calledOnce(cursor.hide)
BDD expect(cursor.hide.calledOnce).to.be.true
MOCK
Mocks are fake objects with pre-
programmed behavior (like stubs) and
pre-programmed expectations.
They are like both stubs and spies – in
one.
MOCK: EXAMPLE
Create an expectation that jQuery.each is
called once, and only once, and also
instructs the mock to behave as we pre-
define.
var mock = sinon.mock(jQuery);
MOCK: EXAMPLE
#1 – which method?
#2 – how many times it is called?
#3 – what are the arguments when the
method called?
#4 – what the method returns?
TEST DRIVEN DEVELOPMENT(TDD)
TDD is a software
development
process that…
I’ll tell you the rest 
WHAT ARE THESE BDD?
ALRIGHT, WHAT IS BDD YOU ASK?
Terminology:
TDD BDD
Test Example
Assertion Expectation
Unit Behavior
BASIC STRUCTURE
#1. Setup/BeforeEach/Before
#2. Prepare an input
#3. Call a method
#4. Check an output
#5. Tear down/AfterEach/After
#1. Setup / Before
before(function(done) {
// Create a basic document.
document = jsdom.jsdom();
window = document.parentWindow;
done();
});
BASIC STRUCTURE: EXPLAINED
Before / BeforeEach
before(function() { console.log(‘before test’); });
test(‘first test’, function() { console.log(‘first test’); });
test(‘second test’, function() { console.log(‘second test’);});
afterEach(function() { console.log(‘after each test’); });
Result
before test
first test
after each test
second test
after each test
BASIC STRUCTURE: EXPLAINED
BASIC STRUCTURE: EXPLAINED
it('should initialize cursor if zoom level >= minimum zoom
level.',
#2. Prepare an input and predicted result.
var minZoomLevel = 1;
var zoomLevel = minZoomLevel + 0.1;
var expectedCursor = {‘color’: ‘white’, ‘height’: … };
#3. Call a method.
var actualCursor = cursor.init(zoomLevel);
#4. Check an output.
expect(actualCursor).to.deep.equal(expectedCursor);
done();
});
function(done) {
BASIC STRUCTURE: EXPLAINED
it('should initialize cursor if zoom level >= minimum zoom
level.',
#2. Prepare an input and predicted result.
var minZoomLevel = 1;
var zoomLevel = minZoomLevel + 0.1;
var expectedCursor = {‘color’: ‘white’, ‘height’: … };
#3. Call a method.
var actualCursor = cursor.init(zoomLevel);
#4. Check an output.
expect(actualCursor).to.deep.equal(expectedCursor);
done();
});
function(done) {
BASIC STRUCTURE: EXPLAINED
it('should initialize cursor if zoom level >= minimum zoom
level.',
#2. Prepare an input and predicted result.
var minZoomLevel = 1;
var zoomLevel = minZoomLevel + 0.1;
var expectedCursor = {‘color’: ‘white’, ‘height’: … };
#3. Call a method.
var actualCursor = cursor.init(zoomLevel);
#4. Check an output.
expect(actualCursor).to.deep.equal(expectedCursor);
done();
});
function(done) {
BASIC STRUCTURE: EXPLAINED
it('should initialize cursor if zoom level >= minimum zoom
level.',
#2. Prepare an input and predicted result.
var minZoomLevel = 1;
var zoomLevel = minZoomLevel + 0.1;
var expectedCursor = {‘color’: ‘white’, ‘height’: … };
#3. Call a method.
var actualCursor = cursor.init(zoomLevel);
#4. Check an output.
expect(actualCursor).to.deep.equal(expectedCursor);
done();
});
function(done) {
#5. TearDown / After
after(function(done) {
// Remove global objects document.
document = null;
window = null;
done();
});
BASIC STRUCTURE: EXPLAINED
OUTPUT
<testsuite name="Macchiato Tests" tests="13"
failures="0" errors="0" skipped="0"
timestamp="Mon, 02 Dec 2013 11:08:09 GMT"
time="0.114">
<testcase classname = "cursor #init ()"
name = "should initialize cursor if
zoom level &gt; minimum zoom level."
time="0.004"/>
</testsuite>
OUTPUT: SUCCESS
<failure classname="cursor #init()"
name="should initialize cursor if zoom level
&gt; minimum zoom level." time="0"
message="Cannot read property 'show' of
undefined"><![CDATA[TypeError: Cannot read
property 'show' of undefined
// ..... Exception Stack Trace .....
</failure>
OUTPUT: FAILURE
TOOLS
TOOLS
> 40 frameworks & libraries
qUnit(TDD) light-weight TDD framework
Jasmine(BDD) flexible BDD framework
Mocha / Karma test runner for async code
+ Chai TDD / BDD assertion library
+ Sinon test spies, stubs & mocks
ENTIRE SPACE OF FRAMEWORKS…
HOW DO I UNIT TEST
Known Frameworks / Libraries?
What to test? What to use?
Angular, React, Flight Karma + Jasmine
Backbone qUnit
Ember Karma + qUnit (ember-app-kit)
ExtJs Jasmine, Siesta (UI)
TypeScript tsUnit
CoffeeScript qUnit
Dart Unittest, Hop and Drone.io
NodeJs expresso and vows, Nodeunit
TOOLS: WHAT WE USE
 Run UT: Mocha
 Run UT in parallel: Macchiato
 Assert/Expect: Chai
 W3C DOM in JavaScript: Jsdom
 Mock, spy, stub: Sinon
 Code coverage tool: None
 Routine automation: make/Grunt
TOOLS: WHAT WE USE
TOOLS: WHAT WE USE
Project unit tested like a dream ♥
UNIT TESTING SPECIFICS IN JAVASCRIPT
UI
Load fake data via “fixtures”
Jsdom(W3C JavaScript implementation)
UNIT TESTING SPECIFICS IN JAVASCRIPT
AJAX
Stub jQuery.ajax
Fake XMLHttpRequest
(XMLHTTP ActiveXObject)
Fake server
UNIT TESTING SPECIFICS IN JAVASCRIPT
3rd-party scripts
Stubbing jQuery plugin functions
(mock jQuery.fn)
UNIT TESTING SPECIFICS IN JAVASCRIPT
Dependency Injection
Mocking deps in RequireJs sucks hard!
Squire.js lib / testr.js
UNIT TESTING SPECIFICS IN JAVASCRIPT
NodeJs
Server-side specifics
rewire: node.js dependency injection
BEST PRACTISES
Fast
Isolated
Consistent
Responsibility
Self-descriptive
No exception Handling
Use assertions when needed
WRAPPING UP
 Each test verifies a small chunk of code
 Unit tests work best in isolation
 Mocks, stubs and spies help to isolate test
 Don’t test everything but write many tests
 > 40 tools are available to ease unit testing
experience, so CHOOSE YOUR OWN!
SHWEEET
ありがとう

More Related Content

What's hot

Typescript tips & tricks
Typescript tips & tricksTypescript tips & tricks
Typescript tips & tricksOri Calvo
 
Adventures In JavaScript Testing
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript TestingThomas Fuchs
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Jaroslaw Palka
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?FITC
 
Design patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsDesign patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsRavi Bhadauria
 
Introduction to Dart
Introduction to DartIntroduction to Dart
Introduction to DartRamesh Nair
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingLars Thorup
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit TestingWen-Tien Chang
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma Christopher Bartling
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiRan Mizrahi
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyWen-Tien Chang
 
Javascript best practices
Javascript best practicesJavascript best practices
Javascript best practicesManav Gupta
 
How AngularJS Embraced Traditional Design Patterns
How AngularJS Embraced Traditional Design PatternsHow AngularJS Embraced Traditional Design Patterns
How AngularJS Embraced Traditional Design PatternsRan Mizrahi
 

What's hot (18)

Typescript tips & tricks
Typescript tips & tricksTypescript tips & tricks
Typescript tips & tricks
 
Runtime
RuntimeRuntime
Runtime
 
Adventures In JavaScript Testing
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript Testing
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014
 
Jasmine BDD for Javascript
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for Javascript
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?
 
From dot net_to_rails
From dot net_to_railsFrom dot net_to_rails
From dot net_to_rails
 
Design patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsDesign patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjs
 
Google Dart
Google DartGoogle Dart
Google Dart
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Introduction to Dart
Introduction to DartIntroduction to Dart
Introduction to Dart
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit Testing
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit Testing
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in Ruby
 
Javascript best practices
Javascript best practicesJavascript best practices
Javascript best practices
 
How AngularJS Embraced Traditional Design Patterns
How AngularJS Embraced Traditional Design PatternsHow AngularJS Embraced Traditional Design Patterns
How AngularJS Embraced Traditional Design Patterns
 

Similar to Js fwdays unit tesing javascript(by Anna Khabibullina)

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 testingAnna Khabibullina
 
Grails unit testing
Grails unit testingGrails unit testing
Grails unit testingpleeps
 
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 jasmineGil Fink
 
Javascript tdd byandreapaciolla
Javascript tdd byandreapaciollaJavascript tdd byandreapaciolla
Javascript tdd byandreapaciollaAndrea Paciolla
 
Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeJosh Mock
 
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
JAVASCRIPT TDD(Test driven Development) & Qunit TutorialJAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
JAVASCRIPT TDD(Test driven Development) & Qunit TutorialAnup Singh
 
Security testing of YUI powered applications
Security testing of YUI powered applicationsSecurity testing of YUI powered applications
Security testing of YUI powered applicationsdimisec
 
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 SummitOrtus Solutions, Corp
 
Understanding JavaScript Testing
Understanding JavaScript TestingUnderstanding JavaScript Testing
Understanding JavaScript TestingKissy Team
 
Java script unit testing
Java script unit testingJava script unit testing
Java script unit testingMats Bryntse
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
CBDW2014 - MockBox, get ready to mock your socks off!
CBDW2014 - MockBox, get ready to mock your socks off!CBDW2014 - MockBox, get ready to mock your socks off!
CBDW2014 - MockBox, get ready to mock your socks off!Ortus Solutions, Corp
 
JavaScript (without DOM)
JavaScript (without DOM)JavaScript (without DOM)
JavaScript (without DOM)Piyush Katariya
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
Pragmatic Parallels: Java and JavaScript
Pragmatic Parallels: Java and JavaScriptPragmatic Parallels: Java and JavaScript
Pragmatic Parallels: Java and JavaScriptdavejohnson
 
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 JasmineGil Fink
 
Front end unit testing using jasmine
Front end unit testing using jasmineFront end unit testing using jasmine
Front end unit testing using jasmineGil Fink
 
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMockUnit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMockRobot Media
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctlyDror Helper
 

Similar to Js fwdays unit tesing javascript(by Anna Khabibullina) (20)

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
 
Grails unit testing
Grails unit testingGrails unit testing
Grails unit testing
 
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
 
Javascript tdd byandreapaciolla
Javascript tdd byandreapaciollaJavascript tdd byandreapaciolla
Javascript tdd byandreapaciolla
 
Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and Node
 
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
JAVASCRIPT TDD(Test driven Development) & Qunit TutorialJAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
 
Security testing of YUI powered applications
Security testing of YUI powered applicationsSecurity testing of YUI powered applications
Security testing of YUI powered applications
 
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
 
Understanding JavaScript Testing
Understanding JavaScript TestingUnderstanding JavaScript Testing
Understanding JavaScript Testing
 
Java script unit testing
Java script unit testingJava script unit testing
Java script unit testing
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
CBDW2014 - MockBox, get ready to mock your socks off!
CBDW2014 - MockBox, get ready to mock your socks off!CBDW2014 - MockBox, get ready to mock your socks off!
CBDW2014 - MockBox, get ready to mock your socks off!
 
TDD & BDD
TDD & BDDTDD & BDD
TDD & BDD
 
JavaScript (without DOM)
JavaScript (without DOM)JavaScript (without DOM)
JavaScript (without DOM)
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Pragmatic Parallels: Java and JavaScript
Pragmatic Parallels: Java and JavaScriptPragmatic Parallels: Java and JavaScript
Pragmatic Parallels: Java and JavaScript
 
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
 
Front end unit testing using jasmine
Front end unit testing using jasmineFront end unit testing using jasmine
Front end unit testing using jasmine
 
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMockUnit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctly
 

More from Anna Khabibullina

Key Challenges of Smart Home
Key Challenges of Smart HomeKey Challenges of Smart Home
Key Challenges of Smart HomeAnna Khabibullina
 
Influence without authority annakh@ slideshare
Influence without authority   annakh@ slideshareInfluence without authority   annakh@ slideshare
Influence without authority annakh@ slideshareAnna Khabibullina
 
Don’t forget to add doctype
Don’t forget to add doctypeDon’t forget to add doctype
Don’t forget to add doctypeAnna Khabibullina
 
Web Accessibility: You can and You should
Web Accessibility: You can and You shouldWeb Accessibility: You can and You should
Web Accessibility: You can and You shouldAnna Khabibullina
 
Typescript: A Story Of A Project
Typescript: A Story Of A ProjectTypescript: A Story Of A Project
Typescript: A Story Of A ProjectAnna Khabibullina
 

More from Anna Khabibullina (6)

Key Challenges of Smart Home
Key Challenges of Smart HomeKey Challenges of Smart Home
Key Challenges of Smart Home
 
Influence without authority annakh@ slideshare
Influence without authority   annakh@ slideshareInfluence without authority   annakh@ slideshare
Influence without authority annakh@ slideshare
 
Don’t forget to add doctype
Don’t forget to add doctypeDon’t forget to add doctype
Don’t forget to add doctype
 
Web Accessibility: You can and You should
Web Accessibility: You can and You shouldWeb Accessibility: You can and You should
Web Accessibility: You can and You should
 
SVG Accessibility
SVG AccessibilitySVG Accessibility
SVG Accessibility
 
Typescript: A Story Of A Project
Typescript: A Story Of A ProjectTypescript: A Story Of A Project
Typescript: A Story Of A Project
 

Recently uploaded

2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projectssmsksolar
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayEpec Engineered Technologies
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptNANDHAKUMARA10
 
Introduction to Serverless with AWS Lambda
Introduction to Serverless with AWS LambdaIntroduction to Serverless with AWS Lambda
Introduction to Serverless with AWS LambdaOmar Fathy
 
Computer Networks Basics of Network Devices
Computer Networks  Basics of Network DevicesComputer Networks  Basics of Network Devices
Computer Networks Basics of Network DevicesChandrakantDivate1
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptxJIT KUMAR GUPTA
 
DC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationDC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationBhangaleSonal
 
Rums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdfRums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdfsmsksolar
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...soginsider
 
Online food ordering system project report.pdf
Online food ordering system project report.pdfOnline food ordering system project report.pdf
Online food ordering system project report.pdfKamal Acharya
 
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...HenryBriggs2
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptMsecMca
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdfKamal Acharya
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.Kamal Acharya
 
Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086anil_gaur
 
Air Compressor reciprocating single stage
Air Compressor reciprocating single stageAir Compressor reciprocating single stage
Air Compressor reciprocating single stageAbc194748
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . pptDineshKumar4165
 

Recently uploaded (20)

Call Girls in South Ex (delhi) call me [🔝9953056974🔝] escort service 24X7
Call Girls in South Ex (delhi) call me [🔝9953056974🔝] escort service 24X7Call Girls in South Ex (delhi) call me [🔝9953056974🔝] escort service 24X7
Call Girls in South Ex (delhi) call me [🔝9953056974🔝] escort service 24X7
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.ppt
 
Introduction to Serverless with AWS Lambda
Introduction to Serverless with AWS LambdaIntroduction to Serverless with AWS Lambda
Introduction to Serverless with AWS Lambda
 
Computer Networks Basics of Network Devices
Computer Networks  Basics of Network DevicesComputer Networks  Basics of Network Devices
Computer Networks Basics of Network Devices
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
 
DC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationDC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equation
 
Rums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdfRums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdf
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Online food ordering system project report.pdf
Online food ordering system project report.pdfOnline food ordering system project report.pdf
Online food ordering system project report.pdf
 
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced LoadsFEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086
 
Air Compressor reciprocating single stage
Air Compressor reciprocating single stageAir Compressor reciprocating single stage
Air Compressor reciprocating single stage
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 

Js fwdays unit tesing javascript(by Anna Khabibullina)

  • 1. В поисках качества JavaScript: модульное тестирование Анна Хабибуллина DA-14 / da-14.com anna.khabibullina@da-14.com akhabibullina _khabibullina
  • 2. ZE QUALITYS? “Any feature without a test doesn’t exist” Steve Loughran HP Laboratories
  • 3. AGENDA  Unit Testing Concept  Pros & Cons  Basic Terms & Structure  TDD &/vs. BDD  Tools & Libraries  Unit Testing Specifics in JavaScript  Best Practices
  • 4. UNIT TESTING CONCEPT Unit testing is a method by which individual units of source code are tested to determine if they are fit for use.
  • 5. WHY UNIT TESTING? Unit tests find problems early in the development cycle (TDD & BDD) Refactoring Integration Documentation Better design
  • 6. IS UNIT TESTING A GOOD INVESTMENT?  slow down the development process  share the same blind spots with the code  doesn’t prove that they’re compatible with one another or configured correctly
  • 8. In simple words, the goal of assertion is to forcefully define if the test fails or passes. STATEMENT PASSES FAILS x = 1 assert(x > 0) assert(x < 0) expect(4+5).to.equal(9); ASSERTION
  • 9. function initialize() { // The initialization was successful. return true; } Given the function initialize(): ASSERTION: EXAMPLE
  • 10. ASSERTION: EXAMPLE var isInitialized = initialize(); TDD assert.isTrue(isInitialized) BDD expect(isInitialized).to.be.true Check that function initialize() returns true when called.
  • 11. FIXTURE A test fixture is a fixed state of the software under test used as a baseline for running tests. In JavaScript for client side: simulate AJAX responses; loading known set of data such as html objects.
  • 12. FIXTURE: EXAMPLE Require the piece of markup stored in myfixturemarkup.html file before each test: beforeEach(function() { loadFixtures('myfixturemarkup.html'); });
  • 13. STUB Method stubs are functions with pre- programmed behavior.
  • 14. STUB: EXAMPLE Forcing a method to throw an error in order to test error handling. var fn = foo.stub().throws(Error); expect(fn).to.throw(Error);
  • 15. SPY A test spy is a function that records arguments, return value, the value of this and exception thrown (if any) for all its calls.
  • 16. SPY: EXAMPLE Test that a function cursor.hide() has been only called once, and only once. sinon.spy(cursor, "hide"); TDD sinon.assert.calledOnce(cursor.hide) BDD expect(cursor.hide.calledOnce).to.be.true
  • 17. MOCK Mocks are fake objects with pre- programmed behavior (like stubs) and pre-programmed expectations. They are like both stubs and spies – in one.
  • 18. MOCK: EXAMPLE Create an expectation that jQuery.each is called once, and only once, and also instructs the mock to behave as we pre- define. var mock = sinon.mock(jQuery);
  • 19. MOCK: EXAMPLE #1 – which method? #2 – how many times it is called? #3 – what are the arguments when the method called? #4 – what the method returns?
  • 20. TEST DRIVEN DEVELOPMENT(TDD) TDD is a software development process that… I’ll tell you the rest 
  • 22. ALRIGHT, WHAT IS BDD YOU ASK? Terminology: TDD BDD Test Example Assertion Expectation Unit Behavior
  • 23. BASIC STRUCTURE #1. Setup/BeforeEach/Before #2. Prepare an input #3. Call a method #4. Check an output #5. Tear down/AfterEach/After
  • 24. #1. Setup / Before before(function(done) { // Create a basic document. document = jsdom.jsdom(); window = document.parentWindow; done(); }); BASIC STRUCTURE: EXPLAINED
  • 25. Before / BeforeEach before(function() { console.log(‘before test’); }); test(‘first test’, function() { console.log(‘first test’); }); test(‘second test’, function() { console.log(‘second test’);}); afterEach(function() { console.log(‘after each test’); }); Result before test first test after each test second test after each test BASIC STRUCTURE: EXPLAINED
  • 26. BASIC STRUCTURE: EXPLAINED it('should initialize cursor if zoom level >= minimum zoom level.', #2. Prepare an input and predicted result. var minZoomLevel = 1; var zoomLevel = minZoomLevel + 0.1; var expectedCursor = {‘color’: ‘white’, ‘height’: … }; #3. Call a method. var actualCursor = cursor.init(zoomLevel); #4. Check an output. expect(actualCursor).to.deep.equal(expectedCursor); done(); }); function(done) {
  • 27. BASIC STRUCTURE: EXPLAINED it('should initialize cursor if zoom level >= minimum zoom level.', #2. Prepare an input and predicted result. var minZoomLevel = 1; var zoomLevel = minZoomLevel + 0.1; var expectedCursor = {‘color’: ‘white’, ‘height’: … }; #3. Call a method. var actualCursor = cursor.init(zoomLevel); #4. Check an output. expect(actualCursor).to.deep.equal(expectedCursor); done(); }); function(done) {
  • 28. BASIC STRUCTURE: EXPLAINED it('should initialize cursor if zoom level >= minimum zoom level.', #2. Prepare an input and predicted result. var minZoomLevel = 1; var zoomLevel = minZoomLevel + 0.1; var expectedCursor = {‘color’: ‘white’, ‘height’: … }; #3. Call a method. var actualCursor = cursor.init(zoomLevel); #4. Check an output. expect(actualCursor).to.deep.equal(expectedCursor); done(); }); function(done) {
  • 29. BASIC STRUCTURE: EXPLAINED it('should initialize cursor if zoom level >= minimum zoom level.', #2. Prepare an input and predicted result. var minZoomLevel = 1; var zoomLevel = minZoomLevel + 0.1; var expectedCursor = {‘color’: ‘white’, ‘height’: … }; #3. Call a method. var actualCursor = cursor.init(zoomLevel); #4. Check an output. expect(actualCursor).to.deep.equal(expectedCursor); done(); }); function(done) {
  • 30. #5. TearDown / After after(function(done) { // Remove global objects document. document = null; window = null; done(); }); BASIC STRUCTURE: EXPLAINED
  • 32. <testsuite name="Macchiato Tests" tests="13" failures="0" errors="0" skipped="0" timestamp="Mon, 02 Dec 2013 11:08:09 GMT" time="0.114"> <testcase classname = "cursor #init ()" name = "should initialize cursor if zoom level &gt; minimum zoom level." time="0.004"/> </testsuite> OUTPUT: SUCCESS
  • 33. <failure classname="cursor #init()" name="should initialize cursor if zoom level &gt; minimum zoom level." time="0" message="Cannot read property 'show' of undefined"><![CDATA[TypeError: Cannot read property 'show' of undefined // ..... Exception Stack Trace ..... </failure> OUTPUT: FAILURE
  • 34. TOOLS
  • 35. TOOLS > 40 frameworks & libraries qUnit(TDD) light-weight TDD framework Jasmine(BDD) flexible BDD framework Mocha / Karma test runner for async code + Chai TDD / BDD assertion library + Sinon test spies, stubs & mocks
  • 36. ENTIRE SPACE OF FRAMEWORKS…
  • 37. HOW DO I UNIT TEST Known Frameworks / Libraries? What to test? What to use? Angular, React, Flight Karma + Jasmine Backbone qUnit Ember Karma + qUnit (ember-app-kit) ExtJs Jasmine, Siesta (UI) TypeScript tsUnit CoffeeScript qUnit Dart Unittest, Hop and Drone.io NodeJs expresso and vows, Nodeunit
  • 38. TOOLS: WHAT WE USE  Run UT: Mocha  Run UT in parallel: Macchiato  Assert/Expect: Chai  W3C DOM in JavaScript: Jsdom  Mock, spy, stub: Sinon  Code coverage tool: None  Routine automation: make/Grunt
  • 40. TOOLS: WHAT WE USE Project unit tested like a dream ♥
  • 41. UNIT TESTING SPECIFICS IN JAVASCRIPT UI Load fake data via “fixtures” Jsdom(W3C JavaScript implementation)
  • 42. UNIT TESTING SPECIFICS IN JAVASCRIPT AJAX Stub jQuery.ajax Fake XMLHttpRequest (XMLHTTP ActiveXObject) Fake server
  • 43. UNIT TESTING SPECIFICS IN JAVASCRIPT 3rd-party scripts Stubbing jQuery plugin functions (mock jQuery.fn)
  • 44. UNIT TESTING SPECIFICS IN JAVASCRIPT Dependency Injection Mocking deps in RequireJs sucks hard! Squire.js lib / testr.js
  • 45. UNIT TESTING SPECIFICS IN JAVASCRIPT NodeJs Server-side specifics rewire: node.js dependency injection
  • 47. WRAPPING UP  Each test verifies a small chunk of code  Unit tests work best in isolation  Mocks, stubs and spies help to isolate test  Don’t test everything but write many tests  > 40 tools are available to ease unit testing experience, so CHOOSE YOUR OWN!