Testing Outside of the Ruby World

3c28deaff162aeda44f2e0bcdca1dacf?s=47 Joseph Wilk
September 22, 2011

Testing Outside of the Ruby World

3c28deaff162aeda44f2e0bcdca1dacf?s=128

Joseph Wilk

September 22, 2011
Tweet

Transcript

  1. T O f R b W r Joseph Wilk

  2. W ’ R b f r ?

  3. S r ... N R b . R .

  4. S “The number of languages you know corresponds to your

    programming skill”
  5. JUnit Rspec PHPSpec JSpec Circumspec SomethingSpec Y ... T ScrewUnit

    JBehave Jasmine Cucumber BlahSpec WhateverSpec
  6. JUnit Rspec PHPSpec JSpec Circumspec SomethingSpec Y ... T ScrewUnit

    JBehave Jasmine Cucumber BlahSpec WhateverSpec BORING!
  7. T & M Java Ruby Monkey.stub!(:new).and_return(mock("monkey")) I owe you one

    Java mocking example. I don’t have the will power to write it. Sorry.
  8. T & M Java Ruby Monkey.stub!(:new).and_return(mock("monkey")) I owe you one

    Java mocking example. I don’t have the will power to write it. Sorry. BORING!
  9. I r Asynchronous Property testing Model testing Permutation explosions Test

    feedback Metrics Graphical tests
  10. H Curry

  11. “Program testing can be used to show the presence of

    bugs, but never to show their absence!” Edsger Dijkstra
  12. Q C Properties ˲TMFOHUI GJWF@SBOEPN@DIBSBDUFST T  For all values

    of s the length of the thing returned by five_random_characters is 5
  13. Q C Logic Randomly generate tests Function Function Properties QuickCheck

  14. Q C Logic Randomly generate tests Function Function Properties QuickCheck

  15. Q C Logic Randomly generate tests Function Function Properties QuickCheck

  16. Q C Logic Randomly generate tests Function Properties QuickCheck

  17. Q C Logic Randomly generate tests Function Properties QuickCheck Counter

    Examples
  18. Q C Properties it "should reverse a string" do "monkeys".reverse.reverse.should

    == "monkeys" end 100.times.map {“#{rand(10)}#{rand(10)}”}.each do |char| it "should reverse a string" do char.reverse.reverse.should == char end end
  19. Q C import Data.Char import Test.QuickCheck instance Arbitrary Char where

    arbitrary = choose ('\32', '\128') coarbitrary c = variant (ord c `rem` 4) prop_RevRev xs = reverse (reverse xs) == xs where types = xs::[Char] Properties $ Main> quickCheck prop_RevRev OK, passed 100 tests.
  20. Er Messaging/ Concurrency

  21. Erlang runtime system McErlang runtime system M Er Models communication

    concurrency distribution
  22. M Er Models Messenger Service Message client Message client Fred

    Clara message “Scottish fiction” “Scottish fiction” login login
  23. M Er if user1 does not send a message m

    to user2 until user2 is logged on, then if user1 does send a message m to user2 then eventually user2 receives the message m. "not P until Q => (eventually P => eventually R)” P: clara sends message “Scottish fiction” to fred Q: fred is logged on R: fred receives the message “Scottish fiction” from clara Models
  24. M Er Models {program={scenario,start,[[ [{logon,clara},{message,fred,"hi"},logoff], [{logon,fred},logoff]]]}, monitor={mce_ltl_parse:ltl_string2module_and_load ("not P until

    Q implies (eventually P implies eventually R)", messenger_mon), {void,[{'P',basicPredicates:message_to (clara,fred,"hi")}, {'Q',basicPredicates:logon(fred)}, {'R',basicPredicates:message_received (fred,clara,"hi")}]}}, algorithm={mce_alg_buechi,void}}).
  25. “Every method you use to prevent or find bugs leaves

    a residue of subtler bugs against which those methods are ineffectual Pesticide Paradox / Beizer
  26. C r Bracket hell

  27. (fact (alive-in-next-generation? ...cell...) => truthy (provided (alive? ...cell...) => false

    (neighbor-count ...cell...) => 3)) M Facts cell = mock("a cell") cell.stub(:alive?).and_return(false) cell.stub(:neighbour_count).and_return(3) cell.alive_in_next_generation.should == true
  28. I Brief visit

  29. I Specs are documentation

  30. I Specs are documentation

  31. J v S r p Without the Java

  32. Z b . Trapped inside a browser

  33. Z b . Trapped inside a browser var zombie =

    require("zombie"); var assert = require("assert"); zombie.visit("http://localhost:3000/", function (err, browser, status) { browser. fill("email", "zombie@underworld.dead"). pressButton("Sign Me Up!", function(err, browser, status) { assert.equal(browser.text("title"), "Welcome"); }) });
  34. V w Topics { topic: function () { return 42

    }, 'should be a number': function (topic) { assert.isNumber (topic); }, 'should be equal to 42': function (topic) { assert.equal (topic, 42); } }
  35. V w Asynchronous calls { topic: function () { fs.stat('~/FILE',

    this.callback); }, 'can be accessed': function (err, stat) { assert.isNull (err); // We have no error assert.isObject (stat); // We have a stat object }, 'is not empty': function (err, stat) { assert.isNotZero (stat.size); // The file size is > 0 } }
  36. V w Promises / Futures { topic: function () {

    var promise = new(events.EventEmitter); fs.stat('~/FILE', function (e, res) { if (e) { promise.emit('error', e) } else { promise.emit('success', res) } }); return promise; }, 'can be accessed': function (err, stat) { assert.isNull (err); //We have no error assert.isObject (stat); //We have a stat object }, 'is not empty': function (err, stat) { assert.isNotZero (stat.size); //The file size is > 0 } }
  37. V w Parallel Execution { '/dev/stdout': { topic: function ()

    { path.exists('/dev/stdout',this.callback) }, 'exists': function (result) { assert.isTrue(result) } }, '/dev/tty': { topic: function () { path.exists('/dev/tty',this.callback) }, 'exists': function (result) { assert.isTrue(result) } }, '/dev/null': { topic: function () { path.exists('/dev/null',this.callback) }, 'exists': function (result) { assert.isTrue(result) } } }
  38. Permutation Explosion T Sw r

  39. Permutation Explosion T Sw r

  40. J v Really

  41. J M Faster Test feedback Lots of very short tests

    A few very long ones Failures are not randomly distributed Kent Beck
  42. J M Faster Test feedback

  43. I r L Learn from Metrics

  44. O r ff dessert

  45. ‘‘What is the use of a book,’’ thought Alice, ‘‘without

    pictures or conversations?’’ Lewis Carroll Alice’s Adventures in Wonderland
  46. Sw L Words are not enough Ward Cunningham

  47. Ward Cunningham http://vimeo.com/22165070

  48. Gr p T Brian Marick

  49. http://testobsessed.com/wp-content/uploads/2007/02/testheuristicscheatsheetv1.pdf ‘‘How much do you know about the heuristics of

    failure?’ Joseph Wilk Scotland Ruby Conf 2011
  50. T I

  51. ! Joseph Wilk @josephwilk http://blog.josephwilk.net