Download - Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Transcript
Page 1: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Testing Javascript

Thursday, December 2, 2010

Page 2: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

TDD Javascript

Thursday, December 2, 2010

Page 3: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Respect your Javascript

Thursday, December 2, 2010

Page 4: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Corey Haines

Journeyman Developer

www.coreyhaines.com

That’s Me!

@coreyhaines

Thursday, December 2, 2010

Page 5: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Why don’t we testJavascript?

• History of scripting language

• UI-focused

• Hard

• No good tools

Thursday, December 2, 2010

Page 6: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

But Javascript Is Here!

Thursday, December 2, 2010

Page 7: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Javascript Environments

• Browser

• Node.js

• Env.js

• More and more!

Out of Browser

Thursday, December 2, 2010

Page 8: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

TDD

• Not tool-specific, concept-specific

• Focused, micro-level tests

• Design technique!

Pain in testing meansyour design has problems

Thursday, December 2, 2010

Page 9: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

TDD Tools

• Jasmine

• QUnit

• JSUnit

• JSpec

• Should.js

• Lots More!

Thursday, December 2, 2010

Page 10: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

BDD

• Not tool-specific, concept-specific

• Feature-level Full Stack tests driving Example-level Isolation tests

• Outside-in

Thursday, December 2, 2010

Page 11: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

BDD Tools!

• Jasmine

• QUnit

• JSUnit

• JSpec

• Should.js

• Lots More!

Thursday, December 2, 2010

Page 12: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

%h1=Total Pay- users = User.where(:invited_at => yesterday)- sorted_users = users.sort_by(&:email)- amount = 0- users.each do |user| - pay = user.salary - amount = amount + pay%h2=amount

Would you write this codein your view?

Thursday, December 2, 2010

Page 13: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Why not?

Thursday, December 2, 2010

Page 14: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Separation of Concerns

Thursday, December 2, 2010

Page 15: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

So why do we mix presentation-specific code with business

logic in our javascript?

Thursday, December 2, 2010

Page 16: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

var users, pay, display;

users = $('#users tr');pay = 0;users.each(function(item){ pay += item.find('td.pay').val().to_i();};display = $("#total_pay");display.text(pay);

Thursday, December 2, 2010

Page 17: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Design Javascript?

Thursday, December 2, 2010

Page 18: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

4 Rules of Simple Design

Thursday, December 2, 2010

Page 19: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Tests Pass

Of course

Thursday, December 2, 2010

Page 20: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

No Duplication (DRY)

Every piece of knowledge has one and only one

representation

Thursday, December 2, 2010

Page 21: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Reveals Intent

Good Names

Thursday, December 2, 2010

Page 22: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Small

Well, we are in Javascript

Thursday, December 2, 2010

Page 23: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

4 Rules of Simple Design

Thursday, December 2, 2010

Page 24: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Test Pass

4 Rules of Simple Design

Thursday, December 2, 2010

Page 25: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Test Pass

No Duplication

4 Rules of Simple Design

Thursday, December 2, 2010

Page 26: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Test Pass

No Duplication

Reveals Intent

4 Rules of Simple Design

Thursday, December 2, 2010

Page 27: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Test Pass

No Duplication

Reveals Intent

Small

4 Rules of Simple Design

Thursday, December 2, 2010

Page 28: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

SOLID Principles

Thursday, December 2, 2010

Page 29: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Thursday, December 2, 2010

Page 30: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Single responsibility

Thursday, December 2, 2010

Page 31: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Single responsibility

Open-Closed Principle

Thursday, December 2, 2010

Page 32: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Single responsibility

Open-Closed Principle

Liskov Substition Principle

Thursday, December 2, 2010

Page 33: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Single responsibility

Open-Closed Principle

Liskov Substition Principle

Interface Segregation

Thursday, December 2, 2010

Page 34: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Single responsibility

Open-Closed Principle

Liskov Substition Principle

Interface Segregation

Dependency Inversion

Thursday, December 2, 2010

Page 35: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Design guidelines

Thursday, December 2, 2010

Page 36: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Stratified Design

It is all about the abstractions

Thursday, December 2, 2010

Page 37: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Find a canonical representation

DRY

Thursday, December 2, 2010

Page 38: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

HTML elementdata-* attributes

Thursday, December 2, 2010

Page 39: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Business Logic

Event Handlers Dom Wrappers

1) button.click()

2) Wrap Dom Elements

Business Logic

3) Pass Wrapper Objects

4) Ajax?

IsolationFixtures

Test Strategies

js object wrapper

dom object

Thursday, December 2, 2010

Page 40: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

var users, pay, display;

users = getUsers($('#users tr'));pay = calculatePayFor(users);display = getDisplay('#total_pay');display.setValue(pay);

Thursday, December 2, 2010

Page 41: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

function calculatePay(users) { return users.inject(0, function(sum, user) { sum += user.salary(); return sum; };}

Thursday, December 2, 2010

Page 42: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Get away of the DOM

ASAP!!

Thursday, December 2, 2010

Page 43: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Wrap interactions with DOM

Builders = { ... }Behaviors = { ... }

Thursday, December 2, 2010

Page 44: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Builders

ball = Builder.createFoo(domElement);

Object Creation is cheap

Builder.createFooDom(ball);

Thursday, December 2, 2010

Page 45: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Use same code for js and html rendering

Thursday, December 2, 2010

Page 46: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Wrap based on behavior!

Interface Segregation

Thursday, December 2, 2010

Page 47: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

UpdateablePersistableDraggable

draggableBall = Behaviors.makeDraggable(ball);

Thursday, December 2, 2010

Page 48: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Guideline:Only the top level gets

to use $() selectors

Event Handlers Dom Wrappers

Thursday, December 2, 2010

Page 49: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Spies/Stubs not Mocks

Thursday, December 2, 2010

Page 50: Testing Javascript - GOTO Conference › ... › CoreyHaines_TestingYourJavascript.pdf · 2010-12-09 · Testing Javascript Thursday, December 2, 2010. TDD Javascript Thursday, December

Questions?

Corey Haines@coreyhaines

Thanks for your time

Thursday, December 2, 2010