power-assert, mechanism and philosophy

29
power-assert mechanism and philosophy Takuto Wada (a.k.a @t_wada) Nov 15, 2014 @ Nodefest Tokyo 2014

Upload: takuto-wada

Post on 26-Jun-2015

10.236 views

Category:

Technology


0 download

DESCRIPTION

power-assert, mechanism and philosophy Takuto Wada (a.k.a @t_wada) Nov 15, 2014 @ Nodefest Tokyo 2014

TRANSCRIPT

Page 1: power-assert, mechanism and philosophy

power-assertmechanism and philosophy

Takuto Wada (a.k.a @t_wada)Nov 15, 2014 @ Nodefest Tokyo 2014

Page 2: power-assert, mechanism and philosophy

Takuto Wada@t_wadagithub: twada

Page 3: power-assert, mechanism and philosophy

agenda

•what is power-assert?•mechanism

•design philosophy

Page 4: power-assert, mechanism and philosophy

state of JavaScript testing

testingframework

remotetest runner

environment

assertionlibrary

mockinglibrary

plenty of alternatives...

Page 5: power-assert, mechanism and philosophy

33 Methods!?

too much to learn...

Page 6: power-assert, mechanism and philosophy

Something is wrong with arms race among assertion libraries...

What if the `assert` is informative enough?

Page 7: power-assert, mechanism and philosophy

power-asserthttps://github.com/twada/power-assert

Page 8: power-assert, mechanism and philosophy

1. npm install --save-dev power-assert intelli-espower-loader

2. add "directories" to package.json "directories": { "test": "test" },

3. change var assert = require('assert'); to var assert = require('power-assert');

4. mocha --require intelli-espower-loader

Just 4 steps

Page 9: power-assert, mechanism and philosophy

assert(typeof item.id === 'strong') | | | | | | | false | | "foo" | Item{id:"foo",name:"bar"} "string"

--- [string] 'strong'+++ [string] typeof item.id@@ -1,6 +1,6 @@ str-o+i ng

You get this

work unobtrusively, fail noisily

Page 10: power-assert, mechanism and philosophy

assert(actual)

assert.deepEqual(actual,expected)

assert.notDeepEqual(actual,expected)

You don’t need to memorizeassertion APIs any more.Just write simple assert

Page 11: power-assert, mechanism and philosophy

arms race among assertion APIs enrich test vocabulary...resulted in overkill

power-assert is aRenaissance of code

No more assertion war

Page 12: power-assert, mechanism and philosophy

So, why don’t you run with tests?

Page 13: power-assert, mechanism and philosophy

agenda

•what is power-assert?•mechanism

•design philosophy

Page 14: power-assert, mechanism and philosophy

var assert = require('power-assert');function Item(id, name) { this.id = id; this.name = name;}describe('Item', function () { it('has string id', function () { var item = new Item(1000, 'bar'); assert(assert._expr(assert._capt(assert._capt(typeof assert._capt(assert._capt(item, 'arguments/0/left/argument/object').id, 'arguments/0/left/argument'), 'arguments/0/left') === 'string', 'arguments/0'), { content: 'assert(typeof item.id === \'string\')', filepath: 'test/item_test.js', line: 11 })); });});

var assert = require('power-assert');function Item (id, name) { this.id = id; this.name = name;}describe('Item', function () { it('has string id', function () { var item = new Item(1000, 'bar'); assert(typeof item.id === 'string'); });});

But How?

test code

transpiled to

Page 18: power-assert, mechanism and philosophy

3 essential AST tools

•esprima

•escodegen•estraverse

Page 19: power-assert, mechanism and philosophy

espoweresprima

codeAST

escodegen

ASTAST

ASTcode

codecode

espower-source

grunt-espower / gulp-espower / espowerify /espower-loader / espower-coffee / espower-cli

Page 20: power-assert, mechanism and philosophy

agenda

•what is power-assert?•mechanism

•design philosophy

Page 21: power-assert, mechanism and philosophy

The UNIX Philosophy

https://github.com/substack/nodefest-2012

Page 22: power-assert, mechanism and philosophy

Make each program do one thing well

https://github.com/substack/nodefest-2012

Page 23: power-assert, mechanism and philosophy

Rule of Composition:Design programs to be

connected with other programs.

Rule of Modularity:Write simple parts connected

by clean interfaces.

Page 24: power-assert, mechanism and philosophy

substack pattern

module.exports = function(arg) { // do one thing well};

Page 25: power-assert, mechanism and philosophy

First version (4)• power-assert• empower

• espower• grunt-espower

Currently (15)• power-assert• empower• power-assert-formatter• espower• espower-source• type-name• stringifier• espurify• escallmatch• grunt-espower• gulp-espower• espowerify• espower-loader• espower-coffee• espower-cli

modularize

Page 26: power-assert, mechanism and philosophy

“Your sensibilities about simplicity being equal to ease of use are wrong.”

“Easy” is not “simple”

Simple: objective

Easy: relative

Page 27: power-assert, mechanism and philosophy

Easy• power-assert• grunt-espower• gulp-espower• espowerify• espower-loader• espower-cli• espower-coffee

Simple• espower• espower-source• empower

separate `simple` from `easy`

Page 28: power-assert, mechanism and philosophy

wrap-up•No more assertion war

•Use JS to modify JS

•Separate simple from easy

•Make things small and composable

Page 29: power-assert, mechanism and philosophy

power-asserthttps://github.com/twada/power-assert

Thank you!