Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTest Ͱ࢝ΊΔ
Property-based Testing
Yusuke Hosonuma
@DeNA
Kotlin Fest 2019
Slide 2
Slide 2 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Yusuke Hosonuma
@DeNA
Swift / Haskell / Go
Twitter @tobi462
Slide 3
Slide 3 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
SoftWare Engineer in Test
ςετࣗಈԽʢiOS / Android / Goʣ
CI/CDɺςετٕज़ͷݚڀ
Slide 4
Slide 4 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ࣥච $PNNJOHTPPOʜ
Slide 5
Slide 5 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Agenda
• KotlinTest ͬͯʁ
• Property-based Testing ͬͯʁ
• ͲΜͳͱ͖ʹ͑Δʁ
• ·ͱΊ ͳΜͱͳ͘ཧղ͕ΰʔϧ
Slide 6
Slide 6 text
KotlinTest ͬͯʁ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͣ
Slide 7
Slide 7 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTest
Slide 8
Slide 8 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTest
ଟ͘ͷػೳΛαϙʔτ͢Δ
ςεςΟϯάϑϨʔϜϫʔΫ
Slide 9
Slide 9 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ςεςΟϯάελΠϧ
String Spec Behavior Spec
Feature Spec
#%%
Slide 10
Slide 10 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ϚονϟʔAPI
ʴ
Slide 11
Slide 11 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ςʔϒϧۦಈςετ
σʔλΛࣄલʹྻڍ
Slide 12
Slide 12 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ςʔϒϧۦಈςετ
σʔλΛࣄલʹྻڍ
ΘΓͱશ෦Γͳ
ςεςΟϯάϑϨʔϜϫʔΫ
ͱ͍͏ҹ
Slide 13
Slide 13 text
Property-based Testing
ͬͯʁ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
͡Ό͋
Slide 14
Slide 14 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Property-based Testing
• ςετσʔλΛϥϯμϜʹੜͤ͞
• ͕ؔຬͨ͢ੑ࣭ʢPropertyʣΛݕূ͢Δ
Slide 15
Slide 15 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Property-based Testing
• ςετσʔλΛϥϯμϜʹੜͤ͞
• ͦͷ͕ؔຬͨ͢ੑ࣭ʢPropertyʣΛݕূ͢Δ
ͳΔ΄ͲɺΘ͔ΒΜɻ
ྫΛݟͯΈΔ
Slide 16
Slide 16 text
͠ࢉʢʴʣͷ
ςετͰൺֱ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 17
Slide 17 text
Example-based Testing
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ීஈͬͯΔ
Slide 18
Slide 18 text
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
}
}
})
Slide 19
Slide 19 text
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
Slide 20
Slide 20 text
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
Slide 21
Slide 21 text
Property-based Testing
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Ͱʁ
Slide 22
Slide 22 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ੑ࣭Λߟ͑Δ
a + b = b + a
ަ๏ଇΛຬͨ͢
Slide 23
Slide 23 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ੑ࣭Λߟ͑Δ
a + b = b + a
ʁ
ʁ
ͲΜͳͰΓཱͭ
Slide 24
Slide 24 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTestͰݕূ
class AddProperty: StringSpec({
"commutative" {
assertAll { a: Int, b: Int ->
(a + b) shouldBe (b + a)
}
}
})
Slide 25
Slide 25 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTestͰݕূ
class AddProperty: StringSpec({
“commutative" {
assertAll { a: Int, b: Int ->
(a + b) shouldBe (b + a)
}
}
})
ͯ͢ͷ
Slide 26
Slide 26 text
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ʹ͍ͭͯ
Slide 27
Slide 27 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTestͰݕূ
class AddProperty: StringSpec({
"commutative" {
assertAll { a: Int, b: Int ->
(a + b) shouldBe (b + a)
}
}
}) BCCBͰ͋Δ͜ͱ
Slide 28
Slide 28 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
KotlinTestͰݕূ
class AddProperty: StringSpec({
"commutative" {
assertAll { a: Int, b: Int ->
(a + b) shouldBe (b + a)
}
}
}) BCCBͰ͋Δ͜ͱ
ϥϯμϜͳೖྗʹରͯ͠
ຬͨ͞ΕΔ͖ੑ࣭Λݕূ
ৗʹ
Slide 29
Slide 29 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
debug print ͯ͠ΈΔͱ
ཚͰ
ճࢼߦ͞ΕͯΔ
Slide 30
Slide 30 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
debug print ͯ͠ΈΔͱ
ཚͰ
ճࢼߦ͞ΕͯΔ
ύε͠ͳ͍σʔλ͕ͳ͍͔
େྔͷཚͰ͋ͿΓग़͢
ͱߟ͑Δͱ͔Γ͍͢
Slide 31
Slide 31 text
ͲΜͳ࣌ʹ͑Δʁ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Ͱ
Slide 32
Slide 32 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
͍Ͳ͜Ζ
1. ཚΛར༻ͨ͠ΞϧΰϦζϜ
2. ରশੑͷ͋ΔΞϧΰϦζϜ
3. ߴ vs
Slide 33
Slide 33 text
ཚΛར༻ͨ͠ΞϧΰϦζϜ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 34
Slide 34 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
໎࿏ੜ
• ͲΜͳ໎࿏Ͱղ͚ͳ͍ͱཱ͠ͳ͍
• ʮඞͣղ͚Δʯͱ͍͏ੑ࣭Λݕূ͢Δ
Slide 35
Slide 35 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
໎࿏ੜ
• ͲΜͳ໎࿏Ͱղ͚ͳ͍ͱཱ͠ͳ͍
• ٯʹݴ͑ղ͚ͳ͍ͱόά
• ʮඞͣղ͚Δʯͱ͍͏ੑ࣭Λݕূ͢Δ
ྫ͑
Monkey Runner
ϥϯμϜͳΠϕϯτΛൃߦ͠ଓ͚
ʮམͪͳ͍ʯੑ࣭Λݕূ͢Δ
"OESPJEͷ
Slide 36
Slide 36 text
ରশੑͷ͋ΔΞϧΰϦζϜ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 37
Slide 37 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Τϯίʔυ / σίʔυ
• ͲΜͳΛΤϯίʔυ → σίʔυ ͯ͠
• ඞͣʮݩͷʹΔʯͱ͍͏ੑ࣭Λݕূ
Slide 38
Slide 38 text
ߴ vs
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 39
Slide 39 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ߴ vs
• ߴͳίʔυ͍ʢ͚Ͳෳࡶʣ
• ͳίʔυ໌നʢ͚Ͳ͍ʣ
• ͲͪΒʮಉ݁͡ՌʹͳΔʯͱ͍͏ੑ࣭Λར༻
• લऀͷݕূʹޙऀΛར༻͢Δ
Slide 40
Slide 40 text
·ͱΊ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 41
Slide 41 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͱΊ
• KotlinTest ςεςΟϯάϑϨʔϜϫʔΫ
• Property-based Testing αϙʔτ
• ϥϯμϜͳೖྗΛݩʹੑ࣭Λݕূ
• Example-based Λஔ͖͑ΔͷͰͳ͍
Slide 42
Slide 42 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͱΊ
• KotlinTest DSL Λ׆༻ͨ͠ςετϥΠϒϥϦ
• Property-based Testing αϙʔτ
• ϥϯμϜͳೖྗΛݩʹੑ࣭Λݕূ
• Example-based Λஔ͖͑ΔͷͰͳ͍
ͱ͖ͬͭͮΒ͍ߟ͑ํ͕ͩ
͓֮͑ͯ͘ͱڧྗͳΧʔυ
࠷ॳ
Slide 43
Slide 43 text
એ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Slide 44
Slide 44 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ͲͳͨͰొஃ0,ʂ
Slide 45
Slide 45 text
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ͲͳͨͰొஃ0,ʂ
DeNA ʹͯ
9/9ʢ݄ʣ 19:00 ʙ
Slide 46
Slide 46 text
Let’s try
Property-based Testing
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
XJUI,PUMJO5FTU