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. JUnit Rspec PHPSpec JSpec Circumspec SomethingSpec Y ... T ScrewUnit

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

    JBehave Jasmine Cucumber BlahSpec WhateverSpec BORING!
  3. 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.
  4. 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!
  5. “Program testing can be used to show the presence of

    bugs, but never to show their absence!” Edsger Dijkstra
  6. 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
  7. 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
  8. 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.
  9. M Er Models Messenger Service Message client Message client Fred

    Clara message “Scottish fiction” “Scottish fiction” login login
  10. 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
  11. 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}}).
  12. “Every method you use to prevent or find bugs leaves

    a residue of subtler bugs against which those methods are ineffectual Pesticide Paradox / Beizer
  13. (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
  14. 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", "[email protected]"). pressButton("Sign Me Up!", function(err, browser, status) { assert.equal(browser.text("title"), "Welcome"); }) });
  15. 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); } }
  16. 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 } }
  17. 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 } }
  18. 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) } } }
  19. J M Faster Test feedback Lots of very short tests

    A few very long ones Failures are not randomly distributed Kent Beck
  20. ‘‘What is the use of a book,’’ thought Alice, ‘‘without

    pictures or conversations?’’ Lewis Carroll Alice’s Adventures in Wonderland
  21. T I