14
Maintaining JS Code Quality http://kechggeography.blogspot./2012/02/crack-in-wall-my-journey-from-charity.html

Maintaining Quality (HelsinkiJS, Nov 2013)

Embed Size (px)

Citation preview

Page 1: Maintaining Quality (HelsinkiJS, Nov 2013)

Maintaining JS Code Quality

http://kechggeography.blogspot.fi/2012/02/crack-in-wall-my-journey-from-charity.html

Page 2: Maintaining Quality (HelsinkiJS, Nov 2013)

Q: “What is your test coverage?”

A: “That is only a small part of what we do!”

Page 3: Maintaining Quality (HelsinkiJS, Nov 2013)

The main purpose for testing is to give courage

to refactor code.

Page 4: Maintaining Quality (HelsinkiJS, Nov 2013)

Where do we get the courage from?

Page 5: Maintaining Quality (HelsinkiJS, Nov 2013)

A Bag of Tricks

QUnitSelenium

JUnit

JS ErrorReporter

JS Error logging

Server HTTP logsCode reviews

Testing lunchesGet Satisfaction

Mixpanel

Google Analytics

Customer emails

Usertesting.com

Test outsourcing

JSLint

Blanket.js

Bug tracker

Bug fix day

Page 6: Maintaining Quality (HelsinkiJS, Nov 2013)

Unit Tests

Service Tests

UI Tests

Service Tests

Unit Tests

Backend

Frontend

Based on “The Test Pyramid” by Mike Cohn

Page 7: Maintaining Quality (HelsinkiJS, Nov 2013)

Reporting JS Errors in Selenium Tests

Page 8: Maintaining Quality (HelsinkiJS, Nov 2013)

protected void get( String address ) {

    List<JavaScriptError> jsErrors =      JavaScriptError.readErrors(driver);             assertTrue( "JsErrors on page" +         jsErrors.toString(), jsErrors.isEmpty() );     m_driver.get( address ); }

Page 9: Maintaining Quality (HelsinkiJS, Nov 2013)

Logging Javascript Errors from Production

Page 10: Maintaining Quality (HelsinkiJS, Nov 2013)

var maxErrors = 5, curErrors = 0; var origOnErr = window.onerror;   window.onerror = function() {     if(origOnErr) origOnErr.call(null, arguments);         curErrors += 1;     if(curErrors>=maxErrors) return;       $.ajax({         url: BASE_URL+'/reportJsErrors',         data: { error: arguments },         dataType: 'jsonp'     }); };

Page 11: Maintaining Quality (HelsinkiJS, Nov 2013)

Compare that CSS styles match

Page 12: Maintaining Quality (HelsinkiJS, Nov 2013)

function cssStylesMatch($elem1,$elem2) {     return serializeDomToHtml($elem1)===            serializeDomToHtml($elem2); }

Page 13: Maintaining Quality (HelsinkiJS, Nov 2013)

People don’t make bugs, bad processes do.

Page 14: Maintaining Quality (HelsinkiJS, Nov 2013)

Testing can be fun. Be creative!