A presentation at Codepen Meetup in in Glasgow, UK by Aaron Bassett
BDD in the Browser @aaronbassett – rawtech.io
@aaronbassett
@rawtechio
BDD in the Browser @aaronbassett – rawtech.io
TDD is DEAD
“I think that's the direction we're heading. Less emphasis on unit tests, because we're no longer doing test-first as a design practice, and more emphasis on, yes, slow, system tests.” – http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html
codon.com/the-dhh-problem
BORING
Having fun with testing. @aaronbassett – rawtech.io
mochajs.org
1 2 3 4 5 6 7 before(function(){ exec("afplay /Codepen/jstest/nyan.mp3"); }); after(function(){ exec("killall afplay"); });
imagesnap
mocha || (imagesnap pic.png && exit 1)
$(date +%y%m%d%H%M%S).png
mocha -R nyan -t 4000 || (imagesnap ~/Pictures/FAIL/$ (date +%y%m%d%H%M%S).png && exit 1)
1 test: 2 mocha ... # Our super long command 3 4 .PHONY: test
2 var exec = require('child_process').exec; 3 var sleep = require('sleep'); 4 var Twitter = require('node-twitter'); 5 6 var mocha = new Mocha({}); 7 var twitterRestClient = new Twitter.RestClient( 8 'CONSUMER_KEY', 9 'CONSUMER_SECRET', 10 'TOKEN', 11 'TOKEN_SECRET' 12 ); 13 14 mocha.addFile('/Users/aaronbassett/twitter/tests.js') 15 16 var failCount = 0; 17 var passCount = 0; 18 19 mocha.run() 20 .on('pass', function(test) { 21 passCount++; 22 }) 23 .on('fail', function(test, err) { 24 failCount++; 25 }) 26 .on('end', function() { 27 if(failCount > 0) { 28 exec("imagesnap /Users/aaronbassett/FAIL.png"); 29 sleep.sleep(2); 30 twitterRestClient.statusesUpdateWithMedia({ 31 'status': '‚ÜÓ ' + passCount + ' passed - ‚Üó ' + failCount + ' failed.', 32 'media[]': '/Users/aaronbassett/FAIL.png' 33 }); 34 } 35 });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 var twilio = require('twilio'); var client = new twilio.RestClient( 'TWILIO_ACCOUNT_SID', 'TWILIO_AUTH_TOKEN' ); client.sms.messages.create({ to: 'MUM', from: 'AARON', body:'I have failed you as a son.' });
1 if(date.getHours() > 17) { 2 client.sms.messages.create({ 3 to: 'WIFE', 4 from: 'AARON', 5 body:'Sorry, I'm going to be a bit late home tonight' 6 }); 7 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var twitterRestClient = new Twitter.RestClient( ... ); var mocha = new Mocha({}); mocha.addFile(...) mocha.run() .on('pass', function(test) {}) .on('fail', function(test, err) {}) .on('end', function() { if(failCount > 0) { ... } });
1 mocha.run() 2 .on('fail', function(test, err) { 3 failCount++; 4 }) 5 .on('end', function() { 6 if(failCount === 0) { 7 exec("afplay applause.mp3"); 8 } 9 });
1 mocha.run() 2 .on('fail', function(test, err) { 3 failCount++; 4 }) 5 .on('end', function() { 6 if(failCount === 0) { 7 exec("afplay applause.mp3"); 8 } 9 });
ssh -t raspberrypi ‘echo O M G $NAME! You broke your tests again? | festival --tts'
Team Member Tests ran Failed Passed Frequency Points 10,439 654 9785 3.6 35226 Steven 9,719 2,198 7,521 2.4 18050.4 Sara 7,976 13 7963 2.1 16722.3 Peter 6,793 356 6437 1.5 9655.5 Jo 3,615 402 3213 2.4 7711.2 Jane 2,923 476 2447 2.6 6362.2 Simon 1,423 187 1236 0.5 618 Jack 543 165 378 0.3 113.4 Mike 847 302 545 0.1 54.5 Anne
BORING
@aaronbassett
Here’s what was said about this presentation on social media.
Great talks tonight from @habanerotweets @Sarahmischa @hb_stylo and @aaronbassett. Thanks to @alistairtweedie for hosting! #CodePenGlasgow
— Keenan Erwin (@mountainbeard) June 17, 2015
Thank you to @habanerotweets @Sarahmischa @hb_stylo and @aaronbassett for speaking at #CodepenGlasgow tonight! I owe you all a drink!
— Alistair Tweedie (@alistairtweedie) June 17, 2015
Thanks @aaronbassett. In talks with @Sarahmischa about integrating the nyan cat into my workflow #CodepenGlasgow
— Chris Shennan (@chrisshennan) June 17, 2015