BDD - Jasmine
Agenda
• Need of TDD/BDD
• Steps to BDD
• Familiarize terminology
• Installation
• Executing jasmine
• Write tests in jasmine
• What next?
TDD
• Involves writing tests before writing the code
being tested
• Write a small test first (at this point of time no
code being written!)
• Run the test (obviously, it fails!)
• Now make the test pass (well write some code)
• Observe the design, refactor
TDD - Challenges
• As the code size increases more refactor
becomes critical
• Since most of the time the features are not pre-
determined reviewing/refactoring does prove as
time consuming and becomes expensive
So what next???
• In real time objects are the carriers
• They extend the behavior of classes
• This would be mean, “what an object does is
significantly more important!”
• It’s all behavior
BDD
• Behaviour Driven Development is an Agile
development process that comprises aspects of
– Acceptance Test Driven Planning,
– Domain Driven Design
– Test Driven Development
BDD
• BDD puts the focus on Behavior rather than
structure
• Examples
– User inputting values
– Awaiting for the feedback
– Calculations/logic
• It’s all behavior
BDD Triad
• For better communication across the levels
(Business analysts, Developers, Testers) in
software development we narrate/describe the
logical chunks as scenarios
• Given/When/Then – called as BDD triad
BDD Cycle
Jasmine
Jasmine
• It’s a BDD Framework for testing JavaScript
• Does not depend on other frameworks
• Does not require a DOM
• Clean & Obvious syntax
• Influenced by Rspec, JSSpec, Jspec
• Available as stand-alone, ruby gem, Node.js module, as
Maven plugin
Principles
• Should not be tied to any browser, framework,
platform or host language
• Should have idiomatic and unsurprising syntax
• Should work wherever JavaScript runs
• Should play well with IDE’s
Goals
• It should encourage good testing practices
• It should be simple to get start with
• It should integrate easily with continuous build
systems
Terminology
•Specs
•Suites
•describe
•it
•expect
•matchers
•mocks
•spies
Installation
•Required files/structure
•Download stand alone zip file include the lib files
<script type="text/javascript" src="lib/jasmine-1.0.0.rc1/jasmine.js"></script>  
<script type="text/javascript" src="lib/jasmine-1.0.0.rc1/jasmine-html.js"></script>  
•Include styles as well
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.0.rc1/jasmine.css">
Implementation/File structure
•jasmine-example/
• lib/
• jasmine-1.3.1/jasmine.js
• jasmine-1.3.1/jasmine-html.js
• jasmine-1.0.0.rc1/jasmine.css
• specs/
• SpecHelper.js
• BasicMathSpec.js
• scripts/
• BasicMath.js
http://tryjasmine.com/
describe ... it
describe accepts a
string or class.
Helps in
organizing specs
it is what describes the
spec. It optionally
takes a string
// Jasmine
describe “Calculate”, function() {
describe “#Add”, function(){
it “should give sum”, function(){
-----
-----
};
});
});
Filters
// Jasmine
var calc;
beforeEach(function(){
calc = new Calculator();
});
afterEach(function(){
calc.reset();
});
Pretty handy to create data
for each test
before runs the specified
block before each test.
after runs the specified block
after each test.
Expectations
//Jasmine
it (“should return the sum”, function(){
calc = new Calculator();
expect(calc.Add(4,5).toEqual(9));
expect(calc.Add(4,4).not.toEqual(9));
});
http://tryjasmine.com/
Specs - variables
Spec -
describe('panda',function(){
it('is happy',function(){
expect(panda).toBe('happy');
});
});
JavaScript
panda = “happy”;
Specs - variables
Spec -
describe('panda',function(){
it('is happy',function(){
expect(panda).toBe('happy');
});
});
JavaScript
panda = “happy”;
Specs - functions
Spec
describe('Hello World function',function(){
it('just prints a string',function(){
expect(helloWorld()).toEqual("Hello world!");
});
});
JavaScript
function helloWorld(){
return "Hello world!";
}
Specs –matchers
Spec
describe('Hello World function',function(){
it('just prints a string',function(){
expect(helloWorld()).toContain("world!");
});
});
JavaScript
function helloWorld(){
return "Hello world!";
}
Specs –Custom matchers
Spec
describe('Hello world', function() {
beforeEach(function() {
this.addMatchers({
toBeDivisibleByTwo: function() {
return (this.actual % 2) === 0;
}
});
});
it('is divisible by 2', function() {
expect(guessANumber()).toBeDivisibleByTwo();
});
});
Spy
• Spy are handy in tracking down the usage of dependent or
functions that are being invoked by other functions
• Take a scenario, where on the website I would like to wish the
user like Hi, Hello along with salutation Mr, Ms, Mrs
• Say I have a simple function greet() which returns plain string
• Another function which returns the salutation()
• spyOn(obj, 'method')
• expect(obj.method).toHaveBeenCalled()
Spy - usage
• spyOn(obj, 'method')
• expect(obj.method).toHaveBeenCalled()
• expect(obj.method).toHaveBeenCalled(“Hello”,”Mr”)
• obj.method.callCount
Specs – Spy
describe("User", function() {
it("calls the salutation function", function() {
var visitor = new User();
spyOn(visitor, "greetUser");
visitor.greetUser("Hello");
expect(visitor.greetUser).toHaveBeenCalled();
});
});
Specs – Functions
User = function(){};
User.prototype.greetUser = function(salutation){
return this.sayHello() + "" + salutation;
}
User.prototype.sayHello = function(){
return "Hello";
}
DEMO
What next?
• Spies
• Mocking/Faking
• coffee-script
• jasmine-jquery
• jasmine-fixture
• jasmine-stealth
Thanks
References:
http://blog.bandzarewicz.com/blog/2012/03/08/jasmine-cheat-sheet/
http://evanhahn.com/how-do-i-jasmine/
http://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/
https://github.com/pivotal/jasmine/wiki/Spies

Jasmine - A BDD test framework for JavaScript

  • 1.
  • 2.
    Agenda • Need ofTDD/BDD • Steps to BDD • Familiarize terminology • Installation • Executing jasmine • Write tests in jasmine • What next?
  • 3.
    TDD • Involves writingtests before writing the code being tested • Write a small test first (at this point of time no code being written!) • Run the test (obviously, it fails!) • Now make the test pass (well write some code) • Observe the design, refactor
  • 4.
    TDD - Challenges •As the code size increases more refactor becomes critical • Since most of the time the features are not pre- determined reviewing/refactoring does prove as time consuming and becomes expensive
  • 5.
    So what next??? •In real time objects are the carriers • They extend the behavior of classes • This would be mean, “what an object does is significantly more important!” • It’s all behavior
  • 6.
    BDD • Behaviour DrivenDevelopment is an Agile development process that comprises aspects of – Acceptance Test Driven Planning, – Domain Driven Design – Test Driven Development
  • 7.
    BDD • BDD putsthe focus on Behavior rather than structure • Examples – User inputting values – Awaiting for the feedback – Calculations/logic • It’s all behavior
  • 8.
    BDD Triad • Forbetter communication across the levels (Business analysts, Developers, Testers) in software development we narrate/describe the logical chunks as scenarios • Given/When/Then – called as BDD triad
  • 9.
  • 10.
  • 11.
    Jasmine • It’s aBDD Framework for testing JavaScript • Does not depend on other frameworks • Does not require a DOM • Clean & Obvious syntax • Influenced by Rspec, JSSpec, Jspec • Available as stand-alone, ruby gem, Node.js module, as Maven plugin
  • 12.
    Principles • Should notbe tied to any browser, framework, platform or host language • Should have idiomatic and unsurprising syntax • Should work wherever JavaScript runs • Should play well with IDE’s
  • 13.
    Goals • It shouldencourage good testing practices • It should be simple to get start with • It should integrate easily with continuous build systems
  • 14.
  • 15.
    Installation •Required files/structure •Download standalone zip file include the lib files <script type="text/javascript" src="lib/jasmine-1.0.0.rc1/jasmine.js"></script>   <script type="text/javascript" src="lib/jasmine-1.0.0.rc1/jasmine-html.js"></script>   •Include styles as well <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.0.rc1/jasmine.css">
  • 16.
    Implementation/File structure •jasmine-example/ • lib/ •jasmine-1.3.1/jasmine.js • jasmine-1.3.1/jasmine-html.js • jasmine-1.0.0.rc1/jasmine.css • specs/ • SpecHelper.js • BasicMathSpec.js • scripts/ • BasicMath.js
  • 17.
  • 18.
    describe ... it describeaccepts a string or class. Helps in organizing specs it is what describes the spec. It optionally takes a string // Jasmine describe “Calculate”, function() { describe “#Add”, function(){ it “should give sum”, function(){ ----- ----- }; }); });
  • 19.
    Filters // Jasmine var calc; beforeEach(function(){ calc= new Calculator(); }); afterEach(function(){ calc.reset(); }); Pretty handy to create data for each test before runs the specified block before each test. after runs the specified block after each test.
  • 20.
    Expectations //Jasmine it (“should returnthe sum”, function(){ calc = new Calculator(); expect(calc.Add(4,5).toEqual(9)); expect(calc.Add(4,4).not.toEqual(9)); });
  • 21.
  • 22.
    Specs - variables Spec- describe('panda',function(){ it('is happy',function(){ expect(panda).toBe('happy'); }); }); JavaScript panda = “happy”;
  • 23.
    Specs - variables Spec- describe('panda',function(){ it('is happy',function(){ expect(panda).toBe('happy'); }); }); JavaScript panda = “happy”;
  • 24.
    Specs - functions Spec describe('HelloWorld function',function(){ it('just prints a string',function(){ expect(helloWorld()).toEqual("Hello world!"); }); }); JavaScript function helloWorld(){ return "Hello world!"; }
  • 25.
    Specs –matchers Spec describe('Hello Worldfunction',function(){ it('just prints a string',function(){ expect(helloWorld()).toContain("world!"); }); }); JavaScript function helloWorld(){ return "Hello world!"; }
  • 26.
    Specs –Custom matchers Spec describe('Helloworld', function() { beforeEach(function() { this.addMatchers({ toBeDivisibleByTwo: function() { return (this.actual % 2) === 0; } }); }); it('is divisible by 2', function() { expect(guessANumber()).toBeDivisibleByTwo(); }); });
  • 27.
    Spy • Spy arehandy in tracking down the usage of dependent or functions that are being invoked by other functions • Take a scenario, where on the website I would like to wish the user like Hi, Hello along with salutation Mr, Ms, Mrs • Say I have a simple function greet() which returns plain string • Another function which returns the salutation() • spyOn(obj, 'method') • expect(obj.method).toHaveBeenCalled()
  • 28.
    Spy - usage •spyOn(obj, 'method') • expect(obj.method).toHaveBeenCalled() • expect(obj.method).toHaveBeenCalled(“Hello”,”Mr”) • obj.method.callCount
  • 29.
    Specs – Spy describe("User",function() { it("calls the salutation function", function() { var visitor = new User(); spyOn(visitor, "greetUser"); visitor.greetUser("Hello"); expect(visitor.greetUser).toHaveBeenCalled(); }); });
  • 30.
    Specs – Functions User= function(){}; User.prototype.greetUser = function(salutation){ return this.sayHello() + "" + salutation; } User.prototype.sayHello = function(){ return "Hello"; }
  • 31.
  • 32.
    What next? • Spies •Mocking/Faking • coffee-script • jasmine-jquery • jasmine-fixture • jasmine-stealth
  • 33.