power-assert, mechanism and philosophy

Post on 26-Jun-2015

10.236 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

power-assertmechanism and philosophy

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

Takuto Wada@t_wadagithub: twada

agenda

•what is power-assert?•mechanism

•design philosophy

state of JavaScript testing

testingframework

remotetest runner

environment

assertionlibrary

mockinglibrary

plenty of alternatives...

33 Methods!?

too much to learn...

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

What if the `assert` is informative enough?

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

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

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

assert(actual)

assert.deepEqual(actual,expected)

assert.notDeepEqual(actual,expected)

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

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

power-assert is aRenaissance of code

No more assertion war

So, why don’t you run with tests?

agenda

•what is power-assert?•mechanism

•design 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

3 essential AST tools

•esprima

•escodegen•estraverse

espoweresprima

codeAST

escodegen

ASTAST

ASTcode

codecode

espower-source

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

agenda

•what is power-assert?•mechanism

•design philosophy

The UNIX Philosophy

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

Make each program do one thing well

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

Rule of Composition:Design programs to be

connected with other programs.

Rule of Modularity:Write simple parts connected

by clean interfaces.

substack pattern

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

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

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

“Easy” is not “simple”

Simple: objective

Easy: relative

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

Simple• espower• espower-source• empower

separate `simple` from `easy`

wrap-up•No more assertion war

•Use JS to modify JS

•Separate simple from easy

•Make things small and composable

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

Thank you!

top related