Slide 1

Slide 1 text

܅͸ Power Assert Λ஌͍ͬͯΔ͔ FUJI Goro (@__gfx__), a software engineer in COOKPAD #potatotips 2014/5/15 at DeNA

Slide 2

Slide 2 text

FUJI Goro (@__gfx__) • software engineer @ COOKPAD Inc. • Android / iOS ޲͚ڞ௨ϥΠϒϥϦͷઃܭɾ։ൃ

Slide 3

Slide 3 text

Assertions in Java // EXPR͕ࣦഊ͢Δͱ throw new AssertionError() Λ࣮ߦ͢Δ assert foo == 42; ! // comment͸AssertionErrorͷҾ਺ͱͯ͠౉͞ΕΔ assert foo == 42 : “with message”; ! // assertແޮ࣌͸͕ࣜධՁ͞Εͳ͍ͷͰॏΊͷલఏ৚݅νΣοΫ΋Մ assert checkParamsButSlow(foo);

Slide 4

Slide 4 text

Assertions in Android • AndroidͰ͸Javaͷassertจ͕࢖͑Δ • `assert getActivity() != null;` • ͨͩ͠assert͸σϑΥϧτͰແޮ • `adb shell setprop debug.assert 1` Ͱ༗ޮԽ • …Ͱ͖Δ͜ͱ΋͋Δʢ࣮ػͩͱͰ͖ͳ͍ʁʣ

Slide 5

Slide 5 text

Assertionsͷ໰୊఺ • εΠον͕ΞϓϦ͝ͱͰ͸ͳ͘୺຤͝ͱ • ͦ΋ͦ΋ޮ͔ͳ͔ͬͨΓ͢Δ͠ • ։ൃऀશһͰৗʹ༗ޮʹ͢Δͱ͍͏ͷ͸೉͍͠ • ࣦഊ࣌ͷ৘ใʹ๡͍͠ • ৄࡉΛ௥͏ͨΊʹϒϨʔΫϙΠϯτΛ࢓ࠐΜͰ σόοά͢Δඞཁ͕͋Δ

Slide 6

Slide 6 text

ͭΒ͍

Slide 7

Slide 7 text

ͱ͜ΖͰ Power Assert Λ஌͍ͬͯ·͔͢

Slide 8

Slide 8 text

Power Assert ͷػೳ • assertࣦഊ࣌ʹؔ܎͢Δࣜͷ஋Λදࣔ͢Δ def x = new File(“foo.groovy”) assert x.absolutePath.contains("bar") // shows: Assertion failed: ! assert x.absolutePath.contains("bar") | | | | | false | /path/to/foo.groovy foo.groovy at foo.run(foo.groovy:4)

Slide 9

Slide 9 text

࣮૷ͷͨΊͷπʔϧνΣΠϯ • ࣮ߦલʹίʔυΛॻ͖׵͑Δඞཁ͕͋Δ • JavaScript൛͸ιʔείʔυΛॻ͖׵͑Δ • Spock͸ίϯύΠϧޙͷASTΛॻ͖׵͑Δ • ASTʹରͯ͠ϝλϓϩάϥϛϯάͰ͖Δ؀ڥ ͕͋Ε͹OK

Slide 10

Slide 10 text

AndroidͰ΋Power Assert͕ ࢖͍͍ͨੈքઢʹߦ͖͍ͨ…

Slide 11

Slide 11 text

– OSSքͷ֨ݴ “ͩͬͨΒ͓લ͕΍Ε”

Slide 12

Slide 12 text

΍Γ·ͨ͠

Slide 13

Slide 13 text

Android Power Assert Plugin • assertจΛڧ੍తʹ༗ޮԽ • assertࣦഊ࣌ʹ৘ใΛ௥Ճ • ϦϦʔεϏϧυͰ͸Կ΋͠ͳ͍ • ࣮ߦ଎౓ʹӨڹ͸΄ͱΜͲͳ͠ • APKͷαΠζ΋૿͑ͳ͍

Slide 14

Slide 14 text

ग़ྗྫ assert findViewById(R.id.never).isFocused();

Slide 15

Slide 15 text

σϑΥϧτͷྫ֎

Slide 16

Slide 16 text

assert findViewById(R.id.never).isFocused(); with default mode java.lang.NullPointerException: at MainActivity.onButton2Click(MainActivity.java:28) (…stacktrace͕ଓ͘…) ! // NOTE: // KitKat͔Β͸΋͏গ͠৘ใ͕૿͑ͯɺͳʹ͕nullͩͬͨͷ͔Θ͔Γ΍͘͢ͳ͍ͬͯΔ

Slide 17

Slide 17 text

Power Assert༗ޮͷͱ͖

Slide 18

Slide 18 text

assert findViewById(R.id.never).isFocused(); with power assert java.lang.NullPointerException: 26: void onButton2Click() { 27> assert findViewById(R.id.never).isFocused(); 27: } MainActivity.findViewById()= at MainActivity.onButton2Click(MainActivity.java:28) (…stacktrace͕ଓ͘…)

Slide 19

Slide 19 text

࢖͍ํ // The root build.gradle buildscript { dependencies { classpath ‘com.github.gfx:android-power-assert-plugin:0.10.+’ } } ! // in build.gradle of a module apply plugin: ‘android-power-assert’

Slide 20

Slide 20 text

͋ͱ͸assertจΛ࢖͏͚ͩ

Slide 21

Slide 21 text

Power Assert ೋͭͷଆ໘

Slide 22

Slide 22 text

ΞϓϦέʔγϣϯίʔυͰ࢖͏ • ؀ڥ͕ಛఆͷঢ়ଶͰ͋Δ͜ͱΛอূ͢Δ • Ҿ਺ͷνΣοΫ΍nullνΣοΫͳͲ • Android StudioͰNPEܯࠂΛ੩ΊΔͨΊ • ϦϦʔε൛Ͱassertจ͸ফ͑ΔͷͰɺ͋͘·Ͱ΋ ʮ։ൃऀ͕ਖ਼͍͠ίʔυΛॻ͍͍ͯΔ͜ͱΛอ ূ͢ΔʯͨΊʹ࢖͏

Slide 23

Slide 23 text

ςετͰ࢖͏ • ൚༻ςετϚονϟʔͱͯ͠࢖͏ • JUnitͷassertEquals()ͷҾ਺ͷॱ൪Λߟ͑ͳ͘ ͯΑ͘ͳΔ • ࣜͷ్தܦաΛදࣔ͢ΔͷͰɺෳ਺ͷ assertXXX()Λ·ͱΊΒΕΔ • assert obj.foo().bar().equals(“baz”)

Slide 24

Slide 24 text

How it works

Slide 25

Slide 25 text

JavassistʹΑΔόΠτίʔυૢ࡞ • $assertionsDisabledΛৗʹfalseʹ͢Δ • assertจʢ͕ίϯύΠϧ͞ΕͨόΠτίʔυʣ Λݟ͚ͭͨΒपล৘ใΛूΊͯจࣈྻΛੜ੒ ͢ΔίʔυΛૠೖ͢Δ • field access / method call͸try-catchͰғΜͰ NPEΛΩϟονˍपล৘ใΛ෇༩ͯ͠re-throw

Slide 26

Slide 26 text

՝୊ • ෇Ճ৘ใ͕ଟ͗͢Δ • ͍·͸ϩʔΧϧม਺Λ͢΂ͯdump͍ͯ͠Δ • SpockͷΑ͏ͳࠩ෼දࣔΛ͍ͨ͠ • ͍·͸commonsͷToStringBuilderΛ࢖͍ͬͯΔ • JavassistͰେྔͷίʔυΛॻ͘ͷ͸ਏ͍ͷͰɺग़ྗ ϑΥʔϚολΛผʹ࣮૷͢Δඞཁ͕͋Δ

Slide 27

Slide 27 text

We are hiring! https://info.cookpad.com/jobs/

Slide 28

Slide 28 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ https://github.com/gfx/android-power-assert-plugin ਓபืूத