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

標準パッケージにおけるテストでの利用例から学ぶ testing / quick パッケージ/golang-testing-quick

標準パッケージにおけるテストでの利用例から学ぶ testing / quick パッケージ/golang-testing-quick

Go Conference 2019 Spring の発表資料
https://gocon.jp/

Yusuke Hosonuma

May 18, 2019
Tweet

More Decks by Yusuke Hosonuma

Other Decks in Programming

Transcript

  1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ඪ४ύοέʔδʹ͓͚Δ
    ςετͰͷར༻ྫ͔ΒֶͿ
    UFTUJOHRVJDLύοέʔδ
    1
    Go Conference 2019 Spring
    2019/5/18ʢSatʣ

    ࡉপ ༞հ@DeNA

    View Slide

  2. "CPVU
    2
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  3. ॴଐ
    • 48&5άϧʔϓˏ%F/"
    • ςετࣗಈԽνʔϜɿJ04(Pݴޠ
    ޷͖ͳ΋ͷ
    • ݴޠɿ4XJGUɺ)BTLFMMɺ-JTQʢʁʣ
    • झຯɿɺαΠΫϦϯάɺొࢁ
    ίϛϡχςΟ
    • ϖϯΪϯଜ
    ۙگ
    • USZ4XJGU50,:0Ͱొஃ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    3
    ෼τʔΫ
    :VTVLF)PTPOVNB!UPCJʢͱͼʣ

    View Slide

  4. ࠓ೔࿩͢͜ͱ
    4
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  5. UFTUJOHRVJDLύοέʔδ
    5
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ඪ४ύοέʔδʹؚ·ΕΔ

    View Slide

  6. 6
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    (PݴޠͷύοέʔδҰཡ
    IUUQTHPMBOHPSHQLH

    View Slide

  7. 7
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    (PݴޠͷύοέʔδҰཡ
    IUUQTHPMBOHPSHQLH
    ʮϒϥοΫϘοΫεςετʯͷͨΊͷ6UJMJUZΛఏڙ

    View Slide

  8. 8
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    (PݴޠͷύοέʔδҰཡ
    IUUQTHPMBOHPSHQLH
    ʮϒϥοΫϘοΫεςετʯͷͨΊͷ6UJMJUZΛఏڙ
    ୺తʹݴͬͯ͠·͑͹ɺ
    ʮϥϯμϜ஋ʯΛ࢖ͬͨςετ

    View Slide

  9. ଍͠ࢉͷςετͰ
    ൺֱͯ͠ΈΔ
    9
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  10. ௨ৗͷςετ
    10
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    UFTUJOHύοέʔδ

    View Slide

  11. 11
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    0 ʴ 1 ʹ 1
    1 ʴ 1 ʹ 2
    ௨ৗͷςετ

    View Slide

  12. 12
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    0 ʴ 1 ʹ 1
    1 ʴ 1 ʹ 2
    ௨ৗͷςετ
    ೖྗ஋

    View Slide

  13. 13
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    0 ʴ 1 ʹ 1
    1 ʴ 1 ʹ 2
    ௨ৗͷςετ
    ೖྗ஋ ظ଴஋

    View Slide

  14. 14
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    1 ʴ 0 ʹ 1
    1 ʴ 1 ʹ 2
    ௨ৗͷςετ
    ೖྗ஋ ظ଴஋
    ໌֬ͳೖྗ஋ͱظ଴஋Λ

    ༩͑ͯݕূ͢Δ

    View Slide

  15. 15
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ௨ৗͷςετ
    import "testing"
    func TestAdd(t *testing.T) {
    tests := []struct {
    x int
    y int
    want int
    }{
    {x: 0, y: 1, want: 1}, // 0 + 1 = 1
    {x: 1, y: 1, want: 2}, // 1 + 1 = 2
    }
    for _, tt := range tests {
    if got := Add(tt.x, tt.y); got != tt.want {
    t.Errorf("Add() = %v, want %v", got, tt.want)
    }
    }
    }

    View Slide

  16. 16
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ௨ৗͷςετ
    import "testing"
    func TestAdd(t *testing.T) {
    tests := []struct {
    x int
    y int
    want int
    }{
    {x: 0, y: 1, want: 1}, // 0 + 1 = 1
    {x: 1, y: 1, want: 2}, // 1 + 1 = 2
    }
    for _, tt := range tests {
    if got := Add(tt.x, tt.y); got != tt.want {
    t.Errorf("Add() = %v, want %v", got, tt.want)
    }
    }
    }
    ໌֬ͳʮೖྗ஋ʯͱʮظ଴஋ʯΛ༩͑Δ

    View Slide

  17. ϥϯμϜςετ
    17
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    UFTUJOHRVJDLύοέʔδ

    View Slide

  18. 18
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    x ʴ y ʹ z
    y ʴ x ʹ z’
    ϥϯμϜςετ

    View Slide

  19. 19
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    x ʴ y ʹ z
    y ʴ x ʹ z’
    ϥϯμϜςετ
    ೖྗ஋
    YͱZΛϥϯμϜʹੜ੒

    View Slide

  20. 20
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    x ʴ y ʹ z
    y ʴ x ʹ z’
    ϥϯμϜςετ
    ೖྗ஋
    ଍͠ࢉ͸ަ׵๏ଇΛຬͨ͢ͷͰ
    [ͱ[`͸ৗʹҰக͢Δ

    View Slide

  21. 21
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    x ʴ y ʹ z
    y ʴ x ʹ z’
    ϥϯμϜςετ
    ೖྗ஋
    ଍͠ࢉ͸ަ׵๏ଇΛຬͨ͢ͷͰ
    [ͱ[`͸ৗʹҰக͢Δ
    ϥϯμϜ஋ʹରͯ͠

    ຬͨ͢΂͖ੑ࣭Λݕূ͢Δ

    View Slide

  22. 22
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    "testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }

    View Slide

  23. 23
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    "testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }
    UFTUJOHRVJDLΛJNQPSU

    View Slide

  24. 24
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    “testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }
    νΣοΫ༻ͷϔϧύʔؔ਺
    ϥϯμϜͳೖྗ஋͕ೖͬͯ͘Δ૝ఆ

    View Slide

  25. 25
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    "testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }
    ަ׵๏ଇΛຬͨͤ͹USVF

    View Slide

  26. 26
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    "testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }
    ؔ਺͕ৗʹUSVFΛฦ͔͢ςετ

    View Slide

  27. 27
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϥϯμϜςετ
    import (
    "testing"
    "testing/quick"
    )
    func TestAddQuick(t *testing.T) {
    f := func(x, y int) bool {
    return Add(x, y) == Add(y, x)
    }
    if err := quick.Check(f, nil); err != nil {
    t.Error(err.Error())
    }
    }
    USVFΛฦ͞ͳ͍৔߹͸&SSPS͕ฦ٫

    View Slide

  28. ࣦഊ͢ΔέʔεΛݟͯΈΔ
    28
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  29. 29
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࣦഊ͢Δέʔε
    func Add(x, y int) int {
    return x - y
    }
    // ίϯιʔϧग़ྗ
    --- FAIL: TestAddQuick (0.00s)
    #1: failed on input -8046014121776288896, -2929560796466791850

    View Slide

  30. 30
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࣦഊ͢Δέʔε
    func Add(x, y int) int {
    return x - y
    }
    // ίϯιʔϧग़ྗ
    --- FAIL: TestAddQuick (0.00s)
    #1: failed on input -8046014121776288896, -2929560796466791850
    ަ׵๏ଇΛຬͨ͞ͳ͍ʮҾ͖ࢉʯ

    View Slide

  31. 31
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࣦഊ͢Δέʔε
    func Add(x, y int) int {
    return x - y
    }
    // ίϯιʔϧग़ྗ
    --- FAIL: TestAddQuick (0.00s)
    #1: failed on input -8046014121776288896, -2929560796466791850
    Y Z

    View Slide

  32. 32
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࣦഊ͢Δέʔε
    func Add(x, y int) int {
    return x - y
    }
    // ίϯιʔϧग़ྗ
    --- FAIL: TestAddQuick (0.00s)
    #1: failed on input -8046014121776288896, -2929560796466791850
    Y Z
    ͜ΕΒͷ஋ͷ৔߹ʹࣦഊͨ͠ͱ͍͏ใࠂ

    View Slide

  33. ༻ޠͷ੔ཧ
    33
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  34. 34
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ༻ޠͷ੔ཧ
    • &YBNQMFCBTFE5FTU
    ⁃ ໌֬ͳೖྗ஋ͱظ଴஋Λ༩͑Δςετ

    View Slide

  35. 35
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ༻ޠͷ੔ཧ
    • &YBNQMFCBTFE5FTU
    ⁃ ໌֬ͳೖྗ஋ͱظ଴஋Λ༩͑Δςετ
    • 1SPQFSUZCBTFE5FTU
    ⁃ ϥϯμϜ஋ʹج͍ͮͨςετ
    ⁃ ຬͨ͢΂͖ੑ࣭ʢQSPQFSUZʣΛݕূ
    ⁃ )BTLFMMͷ2VJDL$IFDL͕ൃ঵

    View Slide

  36. 36
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ༻ޠͷ੔ཧ
    • &YBNQMFCBTFE5FTU
    ⁃ ໌֬ͳೖྗ஋ͱظ଴஋Λ༩͑Δςετ
    • 1SPQFSUZCBTFE5FTU
    ⁃ ϥϯμϜ஋ʹج͍ͮͨςετ
    ⁃ ຬͨ͢΂͖ੑ࣭ʢQSPQFSUZʣΛݕূ
    ⁃ )BTLFMMͷ2VJDL$IFDL͕ൃ঵
    ʢͨͿΜʣRVJDLͱ͍͏໋໊͸͔͜͜Β

    View Slide

  37. ඪ४ύοέʔδʹ͓͚Δར༻ྫ
    37
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    UFTUJOHRVJDLύοέʔδͷ

    View Slide

  38. ᶃ໌നͳ࣮૷ͱͷൺֱ
    38
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  39. 39
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ᶃ ໌നͳ࣮૷ͱͷൺֱ
    • ໌നͳ࣮૷
    • ͍͍ͨͯͷ৔߹ɺ஗͍
    • ྫɿϑΟϘφον਺ྻΛ࠶ؼͰղ͘
    • ͦ͏Ͱͳ͍࣮૷
    • ͍͍ͨͯͷ৔߹ɺෳࡶ
    • ྫɿϑΟϘφον਺ྻΛ຤ඌ࠶ؼͰղ͘

    View Slide

  40. 40
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ᶃ ໌നͳ࣮૷ͱͷൺֱ
    • ໌നͳ࣮૷
    • ͍͍ͨͯͷ৔߹ɺ஗͍
    • ྫɿϑΟϘφον਺ྻΛ࠶ؼͰղ͘
    • ͦ͏Ͱͳ͍࣮૷
    • ͍͍ͨͯͷ৔߹ɺෳࡶ
    • ྫɿϑΟϘφον਺ྻΛ຤ඌ࠶ؼͰղ͘
    ͲͪΒ΋ಉ͡ೖྗʹରͯ͠͸

    ඞͣಉ݁͡ՌΛฦ͢͸ͣ

    View Slide

  41. DPOTUBOU@UJNFHP
    41
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    DSZQUPTVCUMF

    View Slide

  42. 42
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    // ConstantTimeByteEq returns 1 if x == y and 0 otherwise.
    func ConstantTimeByteEq(x, y uint8) int {
    return int((uint32(x^y) - 1) >> 31)
    }
    ςετର৅

    View Slide

  43. 43
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    // ConstantTimeByteEq returns 1 if x == y and 0 otherwise.
    func ConstantTimeByteEq(x, y uint8) int {
    return int((uint32(x^y) - 1) >> 31)
    }
    YͱZΛఆ਺࣌ؒͰൺֱ͢Δ
    Ұக͢Ε͹ɺҰக͠ͳ͚Ε͹Λฦ͢
    ςετର৅

    View Slide

  44. 44
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    func byteEq(a, b uint8) int {
    if a == b {
    return 1
    }
    return 0
    }
    func TestConstantTimeByteEq(t *testing.T) {
    err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
    if err != nil {
    t.Error(err)
    }
    }
    ςετίʔυ

    View Slide

  45. 45
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    func byteEq(a, b uint8) int {
    if a == b {
    return 1
    }
    return 0
    }
    func TestConstantTimeByteEq(t *testing.T) {
    err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
    if err != nil {
    t.Error(err)
    }
    }
    ఆ਺࣌ؒͰ͸ͳ͍໌നͳൺֱؔ਺
    ςετίʔυ

    View Slide

  46. 46
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    func byteEq(a, b uint8) int {
    if a == b {
    return 1
    }
    return 0
    }
    func TestConstantTimeByteEq(t *testing.T) {
    err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
    if err != nil {
    t.Error(err)
    }
    }
    ςετ༻ͷؔ਺
    ςετίʔυ

    View Slide

  47. 47
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    func byteEq(a, b uint8) int {
    if a == b {
    return 1
    }
    return 0
    }
    func TestConstantTimeByteEq(t *testing.T) {
    err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
    if err != nil {
    t.Error(err)
    }
    }
    ͭͷؔ਺ʹ͍ͭͯಉ݁͡ՌΛฦ͢͜ͱ
    ςετର৅ ໌നͳ࣮૷
    ςετίʔυ

    View Slide

  48. 48
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    $POTUBOU5JNF#ZUF&Rؔ਺
    func byteEq(a, b uint8) int {
    if a == b {
    return 1
    }
    return 0
    }
    func TestConstantTimeByteEq(t *testing.T) {
    err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
    if err != nil {
    t.Error(err)
    }
    }
    ͭͷؔ਺ʹ͍ͭͯಉ݁͡ՌΛฦ͢͜ͱ
    ςετର৅ ໌നͳ࣮૷
    ಉ͡࢓༷ʢͷ͸ͣʣͷؔ਺Ͱ͋Ε͹

    CheckEqualؔ਺ͰಉҰੑΛݕূͰ͖Δ
    ৽چͷΞϧΰϦζϜൺֱʹ΋࢖͑Δ

    View Slide

  49. ᶄ'V[[ςετ
    49
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  50. 50
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ᶄ Fuzz ςετ
    • 'V[[ςετ
    • ༧ଌෆՄೳͳೖྗσʔλʢGV[[ʣΛ༩͑ɺ

    ෆ۩߹͕ൃੜ͢Δέʔε͕ແ͍͔୳͢

    View Slide

  51. 51
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ᶄ Fuzz ςετ
    • 'V[[ςετ
    • ༧ଌෆՄೳͳೖྗσʔλʢGV[[ʣΛ༩͑ɺ

    ෆ۩߹͕ൃੜ͢Δέʔε͕ແ͍͔୳͢
    ϥϯμϜͳ Fuzz ςετ͸

    ࣮֬Ͱ͸ͳ͍͕҆৺ײʹͭͳ͕Δ

    View Slide

  52. QFNHP
    52
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    FODPEJOHQFN

    View Slide

  53. 53
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    // A Block represents a PEM encoded structure.
    //
    // The encoded form is:
    // -----BEGIN Type-----
    // Headers
    // base64-encoded Bytes
    // -----END Type——
    // where Headers is a possibly empty sequence of Key: Value lines.
    type Block struct {
    Type string
    Headers map[string]string
    Bytes []byte
    }
    // Encode writes the PEM encoding of b to out.
    func Encode(out io.Writer, b *Block) error {
    }
    ςετର৅

    View Slide

  54. 54
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    // A Block represents a PEM encoded structure.
    //
    // The encoded form is:
    // -----BEGIN Type-----
    // Headers
    // base64-encoded Bytes
    // -----END Type-----
    // where Headers is a possibly empty sequence of Key: Value lines.
    type Block struct {
    Type string
    Headers map[string]string
    Bytes []byte
    }
    // Encode writes the PEM encoding of b to out.
    func Encode(out io.Writer, b *Block) error {
    }
    1&.ܗࣜͷσʔλߏ଄
    ςετର৅

    View Slide

  55. 55
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    // A Block represents a PEM encoded structure.
    //
    // The encoded form is:
    // -----BEGIN Type-----
    // Headers
    // base64-encoded Bytes
    // -----END Type-----
    // where Headers is a possibly empty sequence of Key: Value lines.
    type Block struct {
    Type string
    Headers map[string]string
    Bytes []byte
    }
    // Encode writes the PEM encoding of b to out.
    func Encode(out io.Writer, b *Block) error {
    }
    Τϯίʔυ༻ͷؔ਺
    ςετର৅

    View Slide

  56. 56
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    func TestFuzz(t *testing.T) {
    testRoundtrip := func(block Block) bool {
    var buf bytes.Buffer
    if err := Encode(&buf, &block); err != nil {
    t.Errorf("Encode of %#v resulted in error: %s", &block, err)
    return false
    }
    decoded, rest := Decode(buf.Bytes())
    if !reflect.DeepEqual(decoded, &block) {
    t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
    return false
    }
    return true
    }
    quick.Check(testRoundtrip, nil)
    }
    ςετίʔυ

    View Slide

  57. 57
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    func TestFuzz(t *testing.T) {
    testRoundtrip := func(block Block) bool {
    var buf bytes.Buffer
    if err := Encode(&buf, &block); err != nil {
    t.Errorf("Encode of %#v resulted in error: %s", &block, err)
    return false
    }
    decoded, rest := Decode(buf.Bytes())
    if !reflect.DeepEqual(decoded, &block) {
    t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
    return false
    }
    return true
    }
    quick.Check(testRoundtrip, nil)
    }
    ςετ༻ͷؔ਺
    ςετίʔυ

    View Slide

  58. 58
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    func TestFuzz(t *testing.T) {
    testRoundtrip := func(block Block) bool {
    var buf bytes.Buffer
    if err := Encode(&buf, &block); err != nil {
    t.Errorf("Encode of %#v resulted in error: %s", &block, err)
    return false
    }
    decoded, rest := Decode(buf.Bytes())
    if !reflect.DeepEqual(decoded, &block) {
    t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
    return false
    }
    return true
    }
    quick.Check(testRoundtrip, nil)
    }
    ೚ҙͷσʔλͰΤϯίʔυʹࣦഊ͠ͳ͍͜ͱ
    ςετίʔυ

    View Slide

  59. 59
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    func TestFuzz(t *testing.T) {
    testRoundtrip := func(block Block) bool {
    var buf bytes.Buffer
    if err := Encode(&buf, &block); err != nil {
    t.Errorf("Encode of %#v resulted in error: %s", &block, err)
    return false
    }
    decoded, rest := Decode(buf.Bytes())
    if !reflect.DeepEqual(decoded, &block) {
    t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
    return false
    }
    return true
    }
    quick.Check(testRoundtrip, nil)
    }
    σίʔυͨ͠ΒݩͱҰக͢Δ͜ͱ
    Τϯίʔυɾσίʔυͨ݁͠Ռ ݩσʔλ
    ςετίʔυ

    View Slide

  60. 60
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    &ODPEFؔ਺
    func TestFuzz(t *testing.T) {
    testRoundtrip := func(block Block) bool {
    var buf bytes.Buffer
    if err := Encode(&buf, &block); err != nil {
    t.Errorf("Encode of %#v resulted in error: %s", &block, err)
    return false
    }
    decoded, rest := Decode(buf.Bytes())
    if !reflect.DeepEqual(decoded, &block) {
    t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
    return false
    }
    return true
    }
    quick.Check(testRoundtrip, nil)
    }
    σίʔυͨ͠ΒݩͱҰக͢Δ͜ͱ
    Τϯίʔυɾσίʔυͨ݁͠Ռ ݩσʔλ
    ϥϯμϜͳೖྗ஋Ͱ΋ຬͨ͢΂͖ੑ࣭Λ

    ςετίʔυͱͯ͠هड़Ͱ͖Δ
    ࠓճ͸
    ɾΤϥʔʹͳΒͳ͍͜ͱ
    ɾΤϯίʔυɾσίʔυͨ͠Βݩʹ໭Δ͜ͱ

    View Slide

  61. ·ͱΊ
    61
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  62. 62
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ·ͱΊ
    • UFTUJOHRVJDL͸ϥϯμϜ஋ʹΑΔςετ
    • 1SPQFSUZCBTFE5FTUJOHͱ΋ݴΘΕΔ
    • (Pඪ४ύοέʔδͷςετͰ΋࢖ΘΕ͍ͯΔ
    ᶃ໌നͳ࣮૷ͱͷൺֱ
    ᶄ'V[[ςετ
    গͳ͍͚Ͳ

    View Slide

  63. 63
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ·ͱΊ
    • UFTUJOHRVJDL͸ϥϯμϜ஋ʹΑΔςετ
    • 1SPQFSUZCBTFE5FTUJOHͱ΋ݴΘΕΔ
    • (Pඪ४ύοέʔδͷςετͰ΋࢖ΘΕ͍ͯΔ
    ᶃ໌നͳ࣮૷ͱͷൺֱ
    ᶄ'V[[ςετ
    গͳ͍͚Ͳ
    ར༻γʔϯ͸ଟ͘ͳ͍͕ɺ

    దࡐదॴͰ࢖͑͹༗ޮͳख๏Ͱ͸ʁ
    ߟ͑ํͱ͓֮ͯ͑ͯ͘͠ͷ΋༗ޮ

    View Slide

  64. 8F`SF)JSJOH
    ςετࣗಈԽʹڵຯ͋Δํͥͻʂ
    64
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࠙਌ձɾ5XJUUFSͳͲ͓ؾܰʹʂ

    View Slide