55
© Mayflower GmbH 2010 Javascript Testing Sebastian Springer I 10. Oktober 2011

Javascript Ttesting

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Javascript Ttesting

© Mayflower GmbH 2010

Javascript Testing

Sebastian Springer I 10. Oktober 2011

Page 2: Javascript Ttesting

Mayflower GmbH I 2

That's me

I Diplom-Informatiker (FH)

I Zend Certified Developer

I Certified Oracle MySQL Developer

I Scrum Master HI!

MY NAME IS

Sebastian Springer

Page 3: Javascript Ttesting

© A200W ll

Javascript Testing

Page 4: Javascript Ttesting

Mayflower GmbH I 4

Agenda

I Warum Testing?

I Unittests

I Integrationtests

I Automatisierung

©SPH

Page 6: Javascript Ttesting

Mayflower GmbH I 6

Warum Testing?

I Sicherheit

I Refactoring

I Continuous Integration

I Dokumentation

Page 7: Javascript Ttesting

Mayflower GmbH I 7

Testing – Voraussetzungen

©姒儿喵喵

Page 8: Javascript Ttesting

Mayflower GmbH I 8

Testing – Voraussetzungen

I Keine Hindernisse

I Know-how

I Testbarer Code

Page 9: Javascript Ttesting

Mayflower GmbH I 9

Und warum Javascript?

©姒儿喵喵

Page 10: Javascript Ttesting

Mayflower GmbH I 10

Und warum Javascript?

I Wachsende Bedeutung

I User Experience

I Mehr Logik

I Mehr LoC · Applikation vor 4 Jahren: ca. 3% Javascript · Aktuelle Applikation: ca. 43% Javascript

Page 11: Javascript Ttesting

Mayflower GmbH I 11

Unittests

Page 12: Javascript Ttesting

Mayflower GmbH I 12

Unittest Frameworks

© BM5k

Page 13: Javascript Ttesting

Mayflower GmbH I 13

Unittests – Frameworks

J3Unit

JSUnit

QUnit

UnitTesting

TestCase jsUnitTest

YUI Test D.O.H.

Nodeunit

Page 14: Javascript Ttesting

Mayflower GmbH I 14

Unittests – Frameworks

J3Unit

JSUnit

QUnit

UnitTesting

TestCase jsUnitTest

YUI Test D.O.H.

Nodeunit

Page 15: Javascript Ttesting

Mayflower GmbH I 15

Unittests – QUnit

<html> <head> <script src="scripts/library/jquery.js"></script> <script src="scripts/library/underscore.js"></script> <script src="scripts/library/backbone.js"></script> <script src="scripts/library/require.js"></script> <link rel="stylesheet" type="text/css" href="/style/style.css" /> <link rel="stylesheet" type="text/css" href="/style/qunit.css" /> <script src="/scripts/library/qunit.js"></script>

Page 16: Javascript Ttesting

Mayflower GmbH I 16

Unittests – QUnit

<script> require(['/scripts/application/models/ggt.js'], function(gcdClass) { var gcd = new gcdClass(); module('Greatest Common Divisor'); test("Check GCD Success, exact match", 1, function() {...}); test("Check GCD Success, no match", 1, function() {...}); test("Check GCD with Zero", 0, function() {...}); test("This should Fail", function() {...}); }); </script>

Page 17: Javascript Ttesting

Mayflower GmbH I 17

Unittests – QUnit

</head> <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> </html>

Page 18: Javascript Ttesting

Mayflower GmbH I 18

Unittests – QUnit

Page 19: Javascript Ttesting

Mayflower GmbH I 19

Unittests – QUnit Asserts

I ok(state, msg)

I equal(actual, expected, msg)

I deepEqual(actual, expected, msg)

I strictEqual(actual, expected, msg)

I raises(block, expected, msg)

I not...(..., msg) · notEqual(actual, expected, msg)

Page 20: Javascript Ttesting

Mayflower GmbH I 20

Merkmale von Unittests

Page 21: Javascript Ttesting

Mayflower GmbH I 21

Unittests – Isoliert

I Isoliert

Page 22: Javascript Ttesting

Mayflower GmbH I 22

Unittests – Isoliert

function doALotOfAjaxMagicAndTakeACallback(cb) { $.ajax({ type: 'POST', dataType: 'json', data: '{}', contentType: 'application/json', url: 'my/backend', success: function(res) { var result = null; {...} return result; } }); }

Page 23: Javascript Ttesting

Mayflower GmbH I 23

Unittests – Isoliert

test("Test my ajax magic", function() { stop(); doALotOfAjaxMagicAndTakeACallback( function(result) { equals(result, "It's magic"); start(); } ); });

Page 24: Javascript Ttesting

Mayflower GmbH I 24

Unittests – Sinon.js

I Test Spies

I Stubs

I Mocks

I Fake Timers

I Fake XHR und Server

Page 25: Javascript Ttesting

Mayflower GmbH I 25

Unittests – Positiv/Negativ testing

I Isoliert

I Positiv/Negativ testing

Page 26: Javascript Ttesting

Mayflower GmbH I 26

Unittests – Positiv/Negativ testing

test("Check GCD", 1, function() { equal(3, gcd.calculate(15, 9)); });

Page 27: Javascript Ttesting

Mayflower GmbH I 27

Unittests – Positiv/Negativ testing

test("Check GCD Success, exact match", 1, function() { equal(2, gcd.calculate(4, 2)); }); test("Check GCD Success, no match", 1, function() { equal(3, gcd.calculate(15, 9)); }); test("Check GCD Success with Zero", 2, function() { equal(4, gcd.calculate(0, 4)); equal(4, gcd.calculate(4, 0)); }); test("Check GCD Failure", 1, function() { equal(false, gcd.calculate('a', 'b')); });

Page 28: Javascript Ttesting

Mayflower GmbH I 28

Unittests – Häufige Ausführung

I Isoliert

I Positiv/Negativ testing

I Häufige Ausführung

Page 29: Javascript Ttesting

Mayflower GmbH I 29

Unittests – Häufige Ausführung

Page 30: Javascript Ttesting

Mayflower GmbH I 30

Unittests – Blackbox testing

I Isoliert

I Positiv/Negativ testing

I Häufige Ausführung

I Blackbox testing – Input/Output

Page 31: Javascript Ttesting

Mayflower GmbH I 31

Unittests – Blackbox testing

/** * This method calculates the greatest common divisor * and returns the result * * @param m integer * @param n integer * * @return mixed integer result, false if invalid params */ calculate: function (m, n) { if (typeof m != 'number' || typeof n != 'number') { return false; } if (n == 0) { return m; } else if (m == 0) { return n; } else { return this.calculate(n, m % n); } }

Page 32: Javascript Ttesting

Mayflower GmbH I 32

Unittests – Blackbox testing

/** * This method calculates the greatest common divisor * and returns the result * * @param m integer * @param n integer * * @return mixed integer result, false if invalid params */ calculate: function (m, n) {...}

Page 33: Javascript Ttesting

Mayflower GmbH I 33

Unittests – Test First

I Isoliert

I Positiv/Negativ testing

I Häufige Ausführung

I Blackbox testing – Input/Output

I Test First/Test Parallel

Page 34: Javascript Ttesting

Mayflower GmbH I 34

Unittests – Test First

calculate: function (m, n) { if (typeof m != 'number' || typeof n != 'number') { return false; } if (n == 0) { return m; } else if (m == 0) { return n; } else { return this.calculate(n, m % n); } } test(“Check GDC“, function() { // @TODO write testlogic });

Page 35: Javascript Ttesting

Mayflower GmbH I 35

Unittests – Test First

/** * This method calculates the greatest common divisor * and returns the result * * @param m integer * @param n integer * * @return mixed integer result, false if invalid params */ calculate: function (m, n) { return 2; } test(“Check GDC Success, exact match“, function() { equal(2, gcd.calculate(4, 2)); });

Page 36: Javascript Ttesting

Mayflower GmbH I 36

Testbarer Code

Page 37: Javascript Ttesting

Mayflower GmbH I 37

Unittests – Voraussetzung: testbarer Code

I Unabhängiger Code

I Überschaubare Komplexität

I Dependency Injection

Page 38: Javascript Ttesting

Mayflower GmbH I 38

Organisation

Page 39: Javascript Ttesting

Mayflower GmbH I 39

Unittests – Organisation

I module()

I test()

Page 40: Javascript Ttesting

Mayflower GmbH I 40

Integrationtests

Page 41: Javascript Ttesting

Mayflower GmbH I 41

Organisation

© Potatojunkie

Page 42: Javascript Ttesting

Mayflower GmbH I 42

Integrationtests – Selenium IDE

Page 43: Javascript Ttesting

Mayflower GmbH I 43

Integrationtests – Häufig verwendete Kommandos

I waitFor... · z.B. waitForElementPresent

I verify... · z.B. verifyTextPresent

I click

I type

I ...

Page 44: Javascript Ttesting

Mayflower GmbH I 44

Locators

Page 45: Javascript Ttesting

Mayflower GmbH I 45

Integrationtests – Selenium IDE

Page 46: Javascript Ttesting

Mayflower GmbH I 46

Integrationtests – Locators

I identifier=username

I id=password

I name=username

I dom=document.forms[0]

I xpath=//form[@id='loginForm']/div[1]/input[1]

I link=myLinkText

I css=div#loginBox

Page 47: Javascript Ttesting

Mayflower GmbH I 47

Integrationtests – Variablen und Testsuites

Page 48: Javascript Ttesting

Mayflower GmbH I 48

Selenium

Stabilität? © andyarthur

Page 49: Javascript Ttesting

Mayflower GmbH I 49

Automatisierung

Page 50: Javascript Ttesting

Mayflower GmbH I 50

Automatisierung

Page 51: Javascript Ttesting

Mayflower GmbH I 51

Automatisierung

SVN Commit

Jenkins CI

QUnit Selenium

Page 52: Javascript Ttesting

Mayflower GmbH I 52

Automatisierung – Selenium

selenseDirectory

phpunit

Selenium RC

Jenkins

Browser

Selenium RC/grid

Browser Browser Browser

Page 53: Javascript Ttesting

Mayflower GmbH I 53

Automatisierung – QUnit

QUnit

jsTestDriver

Jenkins

Browser Browser Browser Browser

Page 54: Javascript Ttesting

Mayflower GmbH I 54

Fragen?

© br1dotcom

Page 55: Javascript Ttesting

14.10.2011 Mayflower GmbH 55

Vielen Dank für Ihre Aufmerksamkeit!

Kontakt Sebastian Springer

[email protected]

+49 89 242054 1120

Mayflower GmbH

Mannhardtstrasse 6

80538 München