power-assert
mechanism and philosophy
Takuto Wada (a.k.a @t_wada)
Nov 15, 2014 @ Nodefest Tokyo 2014
Takuto Wada
@t_wada
github: twada
agenda
•what is power-assert?
•mechanism
•design philosophy
state of JavaScript testing
testing
framework
remote
test runner
environment
assertion
library
mocking
library
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-assert
https://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 memorize
assertion APIs any more.
Just write simple assert
arms race among assertion APIs enrich
test vocabulary...resulted in overkill
power-assert is a
Renaissance 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
code
AST
escodegen
AST
AST
AST
code
code
code
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-assert
https://github.com/twada/power-assert
Thank you!

power-assert, mechanism and philosophy