30
29.03.2012 How to test your JavaScript TDD and BDD possible Felix Müller

How to test your JavaScript - TDD and BDD possible

Embed Size (px)

Citation preview

Page 1: How to test your JavaScript - TDD and BDD possible

29.03.2012

How to test your JavaScript

TDD and BDD possible

Felix Müller

Page 2: How to test your JavaScript - TDD and BDD possible

Mein Background

► adesso AG, Studentischer Mitarbeiter

► Softwareentwickler

► Twitter: @fmueller_bln

► Mail: [email protected]

29.03.2012 How to test your JavaScript – TDD and BDD possible 2

Page 3: How to test your JavaScript - TDD and BDD possible

Agenda

Professionelle Softwareentwicklung

JavaScript

QUnit

Jasmine

Fazit

29.03.2012 How to test your JavaScript – TDD and BDD possible 3

Page 4: How to test your JavaScript - TDD and BDD possible

Professionelle Softwareentwicklung

29.03.2012 How to test your JavaScript – TDD and BDD possible 4

Page 5: How to test your JavaScript - TDD and BDD possible

Professionelle Softwareentwicklung – Anti-Pattern

29.03.2012 How to test your JavaScript – TDD and BDD possible 5

Page 6: How to test your JavaScript - TDD and BDD possible

Professionelle Softwareentwicklung – TDD & BDD

Test Driven Development

► Test-first Development

► Red – Green – Cycle

► Ermöglicht stetiges Refactoren

► Führt zu lose gekoppelten Systemen

► Common Practice (…hoffentlich!)

Behaviour Driven Development

► Kam nach TDD auf

► Kommuniziert direkt die Anforderungen an Feature, Komponente oder Klasse

► Tests sind ausdrucksstärker

► Tests besser lesbar

29.03.2012 How to test your JavaScript – TDD and BDD possible 6

Page 7: How to test your JavaScript - TDD and BDD possible

Professionelle Softwareentwicklung – TDD

29.03.2012 How to test your JavaScript – TDD and BDD possible 7

Quelle: http://blog.m.artins.net/tdd-listen-to-the-tests-they-tell-smells-in-your-code/

Page 8: How to test your JavaScript - TDD and BDD possible

Professionelle Softwareentwicklung – TDD & ATDD

29.03.2012 How to test your JavaScript – TDD and BDD possible 8

Quelle: http://ukstudio.jp/

Page 9: How to test your JavaScript - TDD and BDD possible

JavaScript – bisher

► Schlechtes Standing in der Java-Welt („Spielzeugsprache“)

► Jeder hat mal ein paar Zeilen geschrieben für visuelle Effekte, Validierung, Ajax

► Kaum Modularisierung oft Spaghetticode nach üblichen Maßstäben

► In den letzten Jahren gab es einen Wandel! (außerhalb der Java-Welt)

29.03.2012 How to test your JavaScript – TDD and BDD possible 9

Page 10: How to test your JavaScript - TDD and BDD possible

JavaScript – everywhere

29.03.2012 How to test your JavaScript – TDD and BDD possible 10

Page 11: How to test your JavaScript - TDD and BDD possible

JavaScript – TDD & BDD

Sind Entwicklungstechniken wie

TDD und BDD möglich?

29.03.2012 How to test your JavaScript – TDD and BDD possible 11

Page 12: How to test your JavaScript - TDD and BDD possible

JavaScript – TDD & BDD

Ja: QUnit und Jasmine

29.03.2012 How to test your JavaScript – TDD and BDD possible 12

Page 13: How to test your JavaScript - TDD and BDD possible

QUnit

► JavaScript Library für Unit Tests

► Aktuelle Version: 1.4.0 (9. März 2012, ~weekly Updates)

► Ursprüngliche Nutzung zum Testen von jQuery

► Sehr einfache Nutzung: qunit.css und qunit.js in HTML-Datei einbinden

29.03.2012 How to test your JavaScript – TDD and BDD possible 13

Page 14: How to test your JavaScript - TDD and BDD possible

QUnit

29.03.2012 How to test your JavaScript – TDD and BDD possible 14

Page 15: How to test your JavaScript - TDD and BDD possible

QUnit

► Markup für eine QUnit Testdatei

29.03.2012 How to test your JavaScript – TDD and BDD possible 15

<body>

<h1 id="qunit-header">QUnit example</h1>

<h2 id="qunit-banner"></h2>

<div id="qunit-testrunner-toolbar"></div>

<h2 id="qunit-userAgent"></h2>

<ol id="qunit-tests"></ol>

<div id="qunit-fixture">

test markup, will be hidden

</div>

</body>

Page 16: How to test your JavaScript - TDD and BDD possible

QUnit

► The first test

29.03.2012 How to test your JavaScript – TDD and BDD possible 16

// test(name, expected, block)

test('some other test', function() {

expect(2);

equal(true, false, 'failing test');

equal(true, true, 'passing test');

});

Page 17: How to test your JavaScript - TDD and BDD possible

QUnit

► Assertions

29.03.2012 How to test your JavaScript – TDD and BDD possible 17

ok(state, message) // is true?

// ==

equal(actual, expected, message)

notEqual(actual, expected, message)

// ===

deepEqual(actual, expected, message)

notDeepEqual(actual, expected, message)

// ===

strictEqual(actual, expected, message)

notStrictEqual(actual, expected, message)

raises(block, expected, message)

Page 18: How to test your JavaScript - TDD and BDD possible

QUnit

► Module und Lifecycle Callbacks

29.03.2012 How to test your JavaScript – TDD and BDD possible 18

module('module1', {

setup: function() {

this.testData = 'foobar';

},

teardown: function() {

this.testData = '';

}

});

test('test with setup and teardown', function() {

expect(1);

equal(this.testData, 'foobar');

});

module('module2'); // ...

Page 19: How to test your JavaScript - TDD and BDD possible

QUnit

► Test mit Asynchronität

29.03.2012 How to test your JavaScript – TDD and BDD possible 19

test('jQuery.ajax() - success callback', function() {

expect(1);

jQuery.ajaxSetup({ timeout: 0 });

stop();

jQuery.ajax({

url: url('data/name.html'),

success: function(){ ok(true, 'success'); start(); },

error: function(){ ok(false, 'error'); }

});

});

Page 20: How to test your JavaScript - TDD and BDD possible

Jasmine

► JavaScript Library für Behaviour Driven Development

► Aktuelle Version: 1.1.0

► Beschreibung von Spezifikationen

► Auch Mocking möglich, neben Assertions und Lifecycle Callbacks wie bei QUnit

► Ausführung durch Verlinken der Skripte in SpecRunner.html

29.03.2012 How to test your JavaScript – TDD and BDD possible 20

Page 21: How to test your JavaScript - TDD and BDD possible

Jasmine

► Unsere Domäne

29.03.2012 How to test your JavaScript – TDD and BDD possible 21

function Customer() {

this.age = 18;

};

Customer.prototype.incrementAge = function() {

this.age++;

};

Customer.prototype.celebrateBirthday = function() {

this.incrementAge();

};

Page 22: How to test your JavaScript - TDD and BDD possible

Jasmine

29.03.2012 How to test your JavaScript – TDD and BDD possible 22

Page 23: How to test your JavaScript - TDD and BDD possible

Jasmine

► The first spec

29.03.2012 How to test your JavaScript – TDD and BDD possible 23

describe('As a customer', function() {

var dude;

beforeEach(function() {

dude = new Customer();

});

it('I should be able to celebrate my birthday',

function() {

var ageBeforeBirthday = dude.age;

dude.celebrateBirthday();

expect(dude.age).toEqual(ageBeforeBirthday + 1);

});

});

Page 24: How to test your JavaScript - TDD and BDD possible

Jasmine

► Eigene Matcher definieren ausdrucksstarke Specs

29.03.2012 How to test your JavaScript – TDD and BDD possible 24

this.addMatchers({

toBeAdult: function() {

this.message = function() {

return 'Expected ' + this.actual + ' to be adult';

}

return this.actual.age >= 18;

}

});

// enables us to say this

expect(dude).toBeAdult();

Page 25: How to test your JavaScript - TDD and BDD possible

Jasmine

► Spies zum Mocken und Stubben

29.03.2012 How to test your JavaScript – TDD and BDD possible 25

describe('As a customer', function() {

// dude, beforeEach...

describe('when celebrating birthday', function() {

it('should incrementAge only once', function() {

spyOn(dude, 'incrementAge');

dude.celebrateBirthday();

expect(dude.incrementAge).toHaveBeenCalled();

expect(dude.incrementAge.callCount).toBe(1);

});

});

});

Page 26: How to test your JavaScript - TDD and BDD possible

Jasmine

► Mögliche Rückgabewerte von Spies

29.03.2012 How to test your JavaScript – TDD and BDD possible 26

// default: call the underlying method

spyOn(x, 'method').andCallThrough();

// to return a value

spyOn(x, 'method').andReturn(arguments);

// to throw an exception

spyOn(x, 'method').andThrow(exception);

// to provide fake implementation

spyOn(x, 'method').andCallFake(function);

Page 27: How to test your JavaScript - TDD and BDD possible

Fazit

TDD und BDD sind möglich

mit JavaScript!

29.03.2012 How to test your JavaScript – TDD and BDD possible 27

Page 28: How to test your JavaScript - TDD and BDD possible

Fazit

29.03.2012 How to test your JavaScript – TDD and BDD possible 28

Page 29: How to test your JavaScript - TDD and BDD possible

Fazit

► QUnit einfache Unit Test Library

► Jasmine ermöglicht ausdrucksstarke Tests und Mocking

► Integration in Java Build Tools wie Maven?

> js-test-driver

> phantomjs-qunit-runner

> jasmine-maven-plugin

29.03.2012 How to test your JavaScript – TDD and BDD possible 29

Page 30: How to test your JavaScript - TDD and BDD possible

Vielen Dank für die Aufmerksamkeit.

Fragen?

www.adesso.de

[email protected]