Testing Web Applications

51
Testing Web Applications presented by Seth McLaughlin @sethmc

description

Introductory overview of testing techniques for web application development. Explains where different testing methods fit in to the software development cycle.

Transcript of Testing Web Applications

Page 1: Testing Web Applications

Testing!Web Applicationspresented by Seth McLaughlin @sethmc

Page 2: Testing Web Applications

E N G I N E E R I N G

www.shapesecurity.com

Page 3: Testing Web Applications

testing is a BIG topic.

Page 4: Testing Web Applications

how to effectively test JavaScript code in your web applications?

Page 5: Testing Web Applications

Workflow.

Page 6: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

Right away!

PM

Build me feature X ASAP!

Page 7: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

working for the man…

Page 8: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

every night and day!

DEV

Page 9: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

everyone’s a critic

Page 10: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

hallelujah!

Page 11: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

my work here is done.

Page 12: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

DEV

my work here is done.

QA

we’ll see about that!

Page 13: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

QA

ship it!

Page 14: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

CUSTOMER

feature X is awesome!

Page 15: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 0 days

start coding!

Page 16: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 7 days

start code review

Page 17: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 9 days

commit code

Page 18: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 10 days

deploy code to staging

Page 19: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 12 days

QA finds a bug in staging

Page 20: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 13 days

fix bug

Page 21: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 15 days

code review fix

Page 22: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 17 days

commit fixed code

Page 23: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 17 days

deploy (again) to staging

Page 24: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 19 days

QA is happy

Page 25: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 20 days

shipped to production

Page 26: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 6 days

Dev finds the bug while coding

Page 27: Testing Web Applications

Start Commit Code Staging QA Sign-off In ProdCode Review

elapsed time: 15 days

could have saved over 5 days by catching bug sooner

alternatively…

Page 28: Testing Web Applications

find bugs as early as possible.

Page 29: Testing Web Applications

Static Analysis

Start Commit Code Staging QA Sign-off In ProdCode Review

var config = {! name: this.name,! style: 'solo',!};

blows up in IE7

Page 30: Testing Web Applications

Static Analysis

Start Commit Code Staging QA Sign-off In ProdCode Review

function getObjs(paths) { return paths.map(function (p) { var obj = null; ! try { obj = require(p); } catch (e) { console.error('Cannot load path', p); } }).filter(function (obj) { return obj !== null; }); }

Page 31: Testing Web Applications

Static Analysis

Start Commit Code Staging QA Sign-off In ProdCode Review

ESLint

• Find common errors and enforce coding style • Run every time you save a file! (automatically) • Fast!

www.jshint.com www.eslint.org

JS Hint

DEV

eslint ftw!

Page 32: Testing Web Applications

Unit Tests

Start Commit Code Staging QA Sign-off In ProdCode Review

• Test code at a granular level • Test as you develop (TDD) • Great traceability • Fast! Fun!

DEV

I ♥ unit tests

visionmedia.github.io/mocha

simple, flexible, fun

jasmine.github.io

www.qunitjs.com

mocha

Page 33: Testing Web Applications

Continuous Integration

Start Commit Code Staging QA Sign-off In ProdCode Review

Pre-Commit

Post-Commit

example: run eslint and mocha tests

example: run selenium tests

hudson-ci.org

Hudsonjenkins-ci.org

Jenkins

travis-ci.org circleci.com

atlassian.com

Bamboo

jetbrains.com

TeamCity

Page 34: Testing Web Applications

End to End Tests

Start Commit Code Staging QA Sign-off In ProdCode Review

• Scenario driven • Tests client and server code • More “realistic” vs. Unit Tests • Less traceability vs. Unit Tests • Slower to execute vs. Unit Tests

I ♥ selenium

QAseleniumhq.org

Selenium

saucelabs.com browserstack.com

Page 35: Testing Web Applications

Techniques.

Page 36: Testing Web Applications

End to End tests with Selenium

Selenium Client API

Test Script

Selenium WebDriver

Web Browser

JavaScript, Java, C#, Python, …

Converts commands to HTTP requests

Communicates with web browser

...

Page 37: Testing Web Applications

End to End tests with Selenium

Selenium Client APITest Script Selenium Grid

VM #1

VM #2

VM #5 IE 7

VM #4 IE 8

VM #6 IE 9

Page 38: Testing Web Applications

End to End tests with Selenium

module.exports = { 'Get free VMs': function (browser) { browser .url('http://www.modern.ie') .assert.title('Modern.IE') .end(); } };

Nightwatch.js

Page 39: Testing Web Applications

Unit Testing with Mocha (node.js)

test_file.js

Node.js

test_file.jscode_to_test.js

mocha

test results

Page 40: Testing Web Applications

Unit Testing with Mocha (node.js)

module.exports = { name: function (title, first, last) { return [title, first, last].join(); } };

formatter.js

Page 41: Testing Web Applications

Unit Testing with Mocha (node.js)

var fmt = require('../../formatter'); var assert = require('assert'); !describe('format', function () { it('should return full name', function () { var actual = fmt.name('Mr.', 'Bob', 'Rogers'); var expected = 'Mr. Bob Rogers'; ! assert.equal(actual, expected); }); });

formatter.spec.js

Page 42: Testing Web Applications

Unit Testing with Venus & Mocha (browser)

test_file.js

Venus

Node.js Browser

test_file.js

code_to_test.js

mocha

test results

Page 43: Testing Web Applications

Unit Testing with Venus & Mocha (browser)

function formatName(title, first, last) { return [title, first, last].join(); } !

formatter.js

Page 44: Testing Web Applications

Unit Testing with Venus & Mocha (browser)

/** * @venus-library mocha * @venus-code formatter.js */ describe('format', function () { var actual = formatName('Mr.', 'Bob', 'Rogers'); var expected = 'Mr. Bob Rogers'; ! it('should return full name', function () { expect(actual).to.be(expected); }); }); !

formatter.spec.js

Page 45: Testing Web Applications

Unit Testing with Venus & Mocha (browser)

<!DOCTYPE html> <html> <head> <title>Test for Formatter</title> <script type="text/javascript" src=“mocha.js”></script> <script type="text/javascript" src=“venus_client.js”></script> <script type="text/javascript" src="formatter.js"></script> <script type="text/javascript" src=“specs/formatter.spec.js”></script> <script type="text/javascript"> testLibrary.run(); </script> </head> <body> <div id="results"></div> </body> </html>

test_harness.html

Page 46: Testing Web Applications

Example: Spy

var callback = sinon.spy(); !PubSub.subscribe('message', callback); PubSub.publishSync('message'); !assert(callback.called === true); !

A function that records information about how it is called.

sinonjs.org

Page 47: Testing Web Applications

Example: Mock

XMLHttpRequestmyLib jQuery Web Server

Page 48: Testing Web Applications

Example: Mock

Mock XMLHttpRequestmyLib jQuery

Page 49: Testing Web Applications

A fake implementation of a code dependency.

Sinon.js XHR Mock

var xhr = sinon.useFakeXMLHttpRequest(); var requests = []; var callback = sinon.spy(); !xhr.onCreate = function (xhr) { requests.push(xhr); }; !myLib.getCommentsFor("/some/article", callback); assertEquals(1, requests.length); !requests[0].respond(200, { "Content-Type": "application/json" }, '[{ "id": 12, "comment": "Hey there" }]' ); !assert(callback.calledWith([{ id: 12, comment: "Hey there" }]));

Page 50: Testing Web Applications

Code Samples

End-to-End test with Selenium

Unit Test node.js code

Unit Test browser code

1

2

3

http://sethmcl.com/testing-web-apps/

Page 51: Testing Web Applications

Learn More.Introduction to writing testable JavaScript!LinkedIn Tech Talk Smashing Magazine !Unit Testing with Venus.js !LinkedIn Tech Talk Venusjs.org !End to End testing with Selenium!The Selenium Project Selenium Architecture Nightwatchjs.org !Free Windows VMs and other testing resources!modern.ie

http://sethmcl.com/testing-web-apps/