Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testing Outside of the Ruby World

Joseph Wilk
September 22, 2011

Testing Outside of the Ruby World

Joseph Wilk

September 22, 2011
Tweet

More Decks by Joseph Wilk

Other Decks in Technology

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