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

    View Slide

  2. W ’
    R b f r ?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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.

    View Slide

  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!

    View Slide

  9. I r
    Asynchronous Property testing
    Model testing
    Permutation
    explosions
    Test feedback
    Metrics
    Graphical tests

    View Slide

  10. H
    Curry

    View Slide

  11. “Program testing can be used to show the
    presence of bugs, but never to show their
    absence!”
    Edsger Dijkstra

    View Slide

  12. Q C
    Properties
    ˲TMFOHUI [email protected]@DIBSBDUFST T


    For all values of s the length of the thing
    returned by five_random_characters is 5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. Q C
    Logic
    Randomly
    generate
    tests
    Function
    Properties
    QuickCheck

    View Slide

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

    View Slide

  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

    View Slide

  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.

    View Slide

  20. Er
    Messaging/
    Concurrency

    View Slide

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

    View Slide

  22. M Er
    Models
    Messenger
    Service
    Message
    client
    Message
    client
    Fred Clara
    message
    “Scottish
    fiction”
    “Scottish
    fiction”
    login login

    View Slide

  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

    View Slide

  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}}).

    View Slide

  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

    View Slide

  26. C r
    Bracket
    hell

    View Slide

  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

    View Slide

  28. I
    Brief visit

    View Slide

  29. I
    Specs are documentation

    View Slide

  30. I
    Specs are documentation

    View Slide

  31. J v S r p
    Without
    the Java

    View Slide

  32. Z b .
    Trapped inside a browser

    View Slide

  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", "[email protected]").
    pressButton("Sign Me Up!",
    function(err, browser, status) {
    assert.equal(browser.text("title"), "Welcome");
    })
    });

    View Slide

  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);
    }
    }

    View Slide

  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
    }
    }

    View Slide

  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
    }
    }

    View Slide

  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) }
    }
    }

    View Slide

  38. Permutation Explosion
    T Sw r

    View Slide

  39. Permutation Explosion
    T Sw r

    View Slide

  40. J v
    Really

    View Slide

  41. J M
    Faster Test feedback
    Lots of very short tests
    A few very long ones
    Failures are not
    randomly distributed
    Kent Beck

    View Slide

  42. J M
    Faster Test feedback

    View Slide

  43. I r L
    Learn from Metrics

    View Slide

  44. O r ff
    dessert

    View Slide

  45. ‘‘What is the use of a book,’’ thought Alice,
    ‘‘without pictures or conversations?’’
    Lewis Carroll
    Alice’s Adventures in Wonderland

    View Slide

  46. Sw L
    Words are not enough
    Ward Cunningham

    View Slide

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

    View Slide

  48. Gr p T
    Brian Marick

    View Slide

  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

    View Slide

  50. T I

    View Slide

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

    View Slide