Post on 26-Jun-2015
description
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
https://speakerdeck.com/michaelficarra/spidermonkey-parser-api-a-standard-for-structured-js-representations
new C(1 + a)
https://speakerdeck.com/constellation/escodegen-and-esmangle-using-mozilla-javascript-ast-as-an-ir
https://speakerdeck.com/constellation/escodegen-and-esmangle-using-mozilla-javascript-ast-as-an-ir
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!