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

KotlinTest で始める Property-based Testing/kotlintest-property-based-testing

KotlinTest で始める Property-based Testing/kotlintest-property-based-testing

Yusuke Hosonuma

August 24, 2019
Tweet

More Decks by Yusuke Hosonuma

Other Decks in Programming

Transcript

  1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTest Ͱ࢝ΊΔ
    Property-based Testing
    Yusuke Hosonuma
    @DeNA
    Kotlin Fest 2019

    View Slide

  2. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Yusuke Hosonuma
    @DeNA
    Swift / Haskell / Go
    Twitter @tobi462

    View Slide

  3. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    SoftWare Engineer in Test
    ςετࣗಈԽʢiOS / Android / Goʣ
    CI/CDɺςετٕज़ͷݚڀ

    View Slide

  4. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࣥච $PNNJOHTPPOʜ

    View Slide

  5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Agenda
    • KotlinTest ͬͯʁ

    • Property-based Testing ͬͯʁ

    • ͲΜͳͱ͖ʹ࢖͑Δʁ

    • ·ͱΊ ͳΜͱͳ͘ཧղ͕ΰʔϧ

    View Slide

  6. KotlinTest ͬͯʁ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ·ͣ

    View Slide

  7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTest

    View Slide

  8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTest
    ଟ͘ͷػೳΛαϙʔτ͢Δ

    ςεςΟϯάϑϨʔϜϫʔΫ

    View Slide

  9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ςεςΟϯάελΠϧ
    String Spec Behavior Spec
    Feature Spec
    #%%

    View Slide

  10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ϚονϟʔAPI
    ʴ

    View Slide

  11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ςʔϒϧۦಈςετ
    σʔλΛࣄલʹྻڍ

    View Slide

  12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ςʔϒϧۦಈςετ
    σʔλΛࣄલʹྻڍ
    ΘΓͱશ෦੝Γͳ

    ςεςΟϯάϑϨʔϜϫʔΫ
    ͱ͍͏ҹ৅

    View Slide

  13. Property-based Testing
    ͬͯʁ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ͡Ό͋

    View Slide

  14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Property-based Testing
    • ςετσʔλΛϥϯμϜʹੜ੒ͤ͞

    • ؔ਺͕ຬͨ͢ੑ࣭ʢPropertyʣΛݕূ͢Δ

    View Slide

  15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Property-based Testing
    • ςετσʔλΛϥϯμϜʹੜ੒ͤ͞

    • ͦͷؔ਺͕ຬͨ͢ੑ࣭ʢPropertyʣΛݕূ͢Δ
    ͳΔ΄ͲɺΘ͔ΒΜɻ
    ྫΛݟͯΈΔ

    View Slide

  16. ଍͠ࢉʢʴʣͷ
    ςετͰൺֱ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  17. Example-based Testing
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ීஈ΍ͬͯΔ

    View Slide

  18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    1 + 1 = 2 / 2 + 3 = 5
    class AddSpec: StringSpec({
    "add" {
    forall(
    row(1, 1, 2),
    row(2, 3, 5)
    ) { a, b, expected ->
    (a + b) shouldBe expected
    }
    }
    })

    View Slide

  19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    class AddSpec: StringSpec({
    "add" {
    forall(
    row(1, 1, 2),
    row(2, 3, 5)
    ) { a, b, expected ->
    (a + b) shouldBe expected
    }
    }
    })
    ೖྗ஋ͱظ଴஋Λ༻ҙͯ͠
    1 + 1 = 2 / 2 + 3 = 5

    View Slide

  20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    class AddSpec: StringSpec({
    "add" {
    forall(
    row(1, 1, 2),
    row(2, 3, 5)
    ) { a, b, expected ->
    (a + b) shouldBe expected
    }
    }
    })
    ݁Ռͱظ଴஋͕Ұக͢Δ͔ʁ
    1 + 1 = 2 / 2 + 3 = 5

    View Slide

  21. Property-based Testing
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Ͱ͸ʁ

    View Slide

  22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ੑ࣭Λߟ͑Δ
    a + b = b + a
    ަ׵๏ଇΛຬͨ͢

    View Slide

  23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ੑ࣭Λߟ͑Δ
    a + b = b + a
    ʁ
    ʁ
    ͲΜͳ஋Ͱ΋੒Γཱͭ

    View Slide

  24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTestͰݕূ
    class AddProperty: StringSpec({
    "commutative" {
    assertAll { a: Int, b: Int ->
    (a + b) shouldBe (b + a)
    }
    }
    })

    View Slide

  25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTestͰݕূ
    class AddProperty: StringSpec({
    “commutative" {
    assertAll { a: Int, b: Int ->
    (a + b) shouldBe (b + a)
    }
    }
    })
    ͢΂ͯͷ

    View Slide

  26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTestͰݕূ
    class AddProperty: StringSpec({
    “commutative" {
    assertAll { a: Int, b: Int ->
    (a + b) shouldBe (b + a)
    }
    }
    })
    औΓ͏Δ஋BͱCʹ͍ͭͯ

    View Slide

  27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTestͰݕূ
    class AddProperty: StringSpec({
    "commutative" {
    assertAll { a: Int, b: Int ->
    (a + b) shouldBe (b + a)
    }
    }
    }) BCCBͰ͋Δ͜ͱ

    View Slide

  28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    KotlinTestͰݕূ
    class AddProperty: StringSpec({
    "commutative" {
    assertAll { a: Int, b: Int ->
    (a + b) shouldBe (b + a)
    }
    }
    }) BCCBͰ͋Δ͜ͱ
    ϥϯμϜͳೖྗ஋ʹରͯ͠

    ຬͨ͞ΕΔ΂͖ੑ࣭Λݕূ
    ৗʹ

    View Slide

  29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    debug print ͯ͠ΈΔͱ
    ཚ਺Ͱ ճࢼߦ͞ΕͯΔ

    View Slide

  30. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    debug print ͯ͠ΈΔͱ
    ཚ਺Ͱ ճࢼߦ͞ΕͯΔ
    ύε͠ͳ͍σʔλ͕ͳ͍͔

    େྔͷཚ਺Ͱ͋ͿΓग़͢
    ͱߟ͑Δͱ෼͔Γ΍͍͢

    View Slide

  31. ͲΜͳ࣌ʹ࢖͑Δʁ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Ͱ͸

    View Slide

  32. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ࢖͍Ͳ͜Ζ
    1. ཚ਺Λར༻ͨ͠ΞϧΰϦζϜ

    2. ରশੑͷ͋ΔΞϧΰϦζϜ

    3. ߴ଎ vs ௿଎

    View Slide

  33. ཚ਺Λར༻ͨ͠ΞϧΰϦζϜ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  34. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ໎࿏ੜ੒
    • ͲΜͳ໎࿏Ͱ΋ղ͚ͳ͍ͱ੒ཱ͠ͳ͍

    • ʮඞͣղ͚Δʯͱ͍͏ੑ࣭Λݕূ͢Δ

    View Slide

  35. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ໎࿏ੜ੒
    • ͲΜͳ໎࿏Ͱ΋ղ͚ͳ͍ͱ੒ཱ͠ͳ͍

    • ٯʹݴ͑͹ղ͚ͳ͍ͱόά

    • ʮඞͣղ͚Δʯͱ͍͏ੑ࣭Λݕূ͢Δ
    ྫ͑͹
    Monkey Runner ΋

    ϥϯμϜͳΠϕϯτΛൃߦ͠ଓ͚

    ʮམͪͳ͍ʯੑ࣭Λݕূ͢Δ
    "OESPJEͷ

    View Slide

  36. ରশੑͷ͋ΔΞϧΰϦζϜ
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  37. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    Τϯίʔυ / σίʔυ
    • ͲΜͳ஋ΛΤϯίʔυ → σίʔυ ͯ͠΋

    • ඞͣʮݩͷ஋ʹ໭Δʯͱ͍͏ੑ࣭Λݕূ

    View Slide

  38. ߴ଎ vs ௿଎
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  39. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ߴ଎ vs ௿଎
    • ߴ଎ͳίʔυ͸଎͍ʢ͚Ͳෳࡶʣ

    • ௿଎ͳίʔυ͸໌നʢ͚Ͳ஗͍ʣ

    • ͲͪΒ΋ʮಉ݁͡ՌʹͳΔʯͱ͍͏ੑ࣭Λར༻

    • લऀͷݕূʹޙऀΛར༻͢Δ

    View Slide

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

    View Slide

  41. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ·ͱΊ
    • KotlinTest ͸ ςεςΟϯάϑϨʔϜϫʔΫ
    • Property-based Testing ΋αϙʔτ

    • ϥϯμϜͳೖྗΛݩʹੑ࣭Λݕূ

    • Example-based Λஔ͖׵͑Δ΋ͷͰ͸ͳ͍

    View Slide

  42. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ·ͱΊ
    • KotlinTest ͸ DSL Λ׆༻ͨ͠ςετϥΠϒϥϦ

    • Property-based Testing ΋αϙʔτ

    • ϥϯμϜͳೖྗΛݩʹੑ࣭Λݕূ

    • Example-based Λஔ͖׵͑Δ΋ͷͰ͸ͳ͍
    ͱ͖ͬͭͮΒ͍ߟ͑ํ͕ͩ

    ͓֮͑ͯ͘ͱڧྗͳΧʔυ
    ࠷ॳ͸

    View Slide

  43. એ఻
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

    View Slide

  44. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ͲͳͨͰ΋ొஃ0,ʂ

    View Slide

  45. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    ͲͳͨͰ΋ొஃ0,ʂ
    DeNA ʹͯ
    9/9ʢ݄ʣ 19:00 ʙ

    View Slide

  46. Let’s try
    Property-based Testing
    Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
    XJUI,PUMJO5FTU

    View Slide