potatotips #7 2015/5/15 at DeNA
܅Power AssertΛ͍ͬͯΔ͔FUJI Goro (@__gfx__), a software engineer in COOKPAD#potatotips 2014/5/15 at DeNA
View Slide
FUJI Goro (@__gfx__)• software engineer @ COOKPAD Inc.• Android / iOS ͚ڞ௨ϥΠϒϥϦͷઃܭɾ։ൃ
Assertions in Java// EXPR͕ࣦഊ͢Δͱ throw new AssertionError() Λ࣮ߦ͢Δassert foo == 42;!// commentAssertionErrorͷҾͱͯ͠͞ΕΔassert foo == 42 : “with message”;!// assertແޮ͕࣌ࣜධՁ͞Εͳ͍ͷͰॏΊͷલఏ݅νΣοΫՄassert checkParamsButSlow(foo);
Assertions in Android• AndroidͰJavaͷassertจ͕͑Δ• `assert getActivity() != null;`• ͨͩ͠assertσϑΥϧτͰແޮ• `adb shell setprop debug.assert 1` Ͱ༗ޮԽ• …Ͱ͖Δ͜ͱ͋Δʢ࣮ػͩͱͰ͖ͳ͍ʁʣ
Assertionsͷ• εΠον͕ΞϓϦ͝ͱͰͳ͘͝ͱ• ͦͦޮ͔ͳ͔ͬͨΓ͢Δ͠• ։ൃऀશһͰৗʹ༗ޮʹ͢Δͱ͍͏ͷ͍͠• ࣦഊ࣌ͷใʹ͍͠• ৄࡉΛ͏ͨΊʹϒϨʔΫϙΠϯτΛࠐΜͰσόοά͢Δඞཁ͕͋Δ
ͭΒ͍
ͱ͜ΖͰPower AssertΛ͍ͬͯ·͔͢
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.groovyfoo.groovyat foo.run(foo.groovy:4)
࣮ͷͨΊͷπʔϧνΣΠϯ• ࣮ߦલʹίʔυΛॻ͖͑Δඞཁ͕͋Δ• JavaScript൛ιʔείʔυΛॻ͖͑Δ• SpockίϯύΠϧޙͷASTΛॻ͖͑Δ• ASTʹରͯ͠ϝλϓϩάϥϛϯάͰ͖Δڥ͕͋ΕOK
AndroidͰPower Assert͕͍͍ͨੈքઢʹߦ͖͍ͨ…
– OSSքͷ֨ݴ“ͩͬͨΒ͓લ͕Ε”
Γ·ͨ͠
Android Power Assert Plugin• assertจΛڧ੍తʹ༗ޮԽ• assertࣦഊ࣌ʹใΛՃ• ϦϦʔεϏϧυͰԿ͠ͳ͍• ࣮ߦʹӨڹ΄ͱΜͲͳ͠• APKͷαΠζ૿͑ͳ͍
ग़ྗྫassert findViewById(R.id.never).isFocused();
σϑΥϧτͷྫ֎
assert findViewById(R.id.never).isFocused();with default modejava.lang.NullPointerException:at MainActivity.onButton2Click(MainActivity.java:28)(…stacktrace͕ଓ͘…)!// NOTE:// KitKat͔Β͏গ͠ใ͕૿͑ͯɺͳʹ͕nullͩͬͨͷ͔Θ͔Γ͘͢ͳ͍ͬͯΔ
Power Assert༗ޮͷͱ͖
assert findViewById(R.id.never).isFocused();with power assertjava.lang.NullPointerException:26: void onButton2Click() {27> assert findViewById(R.id.never).isFocused();27: }MainActivity.findViewById()=at MainActivity.onButton2Click(MainActivity.java:28)(…stacktrace͕ଓ͘…)
͍ํ// The root build.gradlebuildscript {dependencies {classpath ‘com.github.gfx:android-power-assert-plugin:0.10.+’}}!// in build.gradle of a moduleapply plugin: ‘android-power-assert’
͋ͱassertจΛ͏͚ͩ
Power Assert ೋͭͷଆ໘
ΞϓϦέʔγϣϯίʔυͰ͏• ڥ͕ಛఆͷঢ়ଶͰ͋Δ͜ͱΛอূ͢Δ• ҾͷνΣοΫnullνΣοΫͳͲ• Android StudioͰNPEܯࠂΛ੩ΊΔͨΊ• ϦϦʔε൛Ͱassertจফ͑ΔͷͰɺ͋͘·Ͱʮ։ൃऀ͕ਖ਼͍͠ίʔυΛॻ͍͍ͯΔ͜ͱΛอূ͢ΔʯͨΊʹ͏
ςετͰ͏• ൚༻ςετϚονϟʔͱͯ͠͏• JUnitͷassertEquals()ͷҾͷॱ൪Λߟ͑ͳͯ͘Α͘ͳΔ• ࣜͷ్தܦաΛදࣔ͢ΔͷͰɺෳͷassertXXX()Λ·ͱΊΒΕΔ• assert obj.foo().bar().equals(“baz”)
How it works
JavassistʹΑΔόΠτίʔυૢ࡞• $assertionsDisabledΛৗʹfalseʹ͢Δ• assertจʢ͕ίϯύΠϧ͞ΕͨόΠτίʔυʣΛݟ͚ͭͨΒपลใΛूΊͯจࣈྻΛੜ͢ΔίʔυΛૠೖ͢Δ• field access / method calltry-catchͰғΜͰNPEΛΩϟονˍपลใΛ༩ͯ͠re-throw
՝• Ճใ͕ଟ͗͢Δ• ͍·ϩʔΧϧมΛͯ͢dump͍ͯ͠Δ• SpockͷΑ͏ͳࠩදࣔΛ͍ͨ͠• ͍·commonsͷToStringBuilderΛ͍ͬͯΔ• JavassistͰେྔͷίʔυΛॻ͘ͷਏ͍ͷͰɺग़ྗϑΥʔϚολΛผʹ࣮͢Δඞཁ͕͋Δ
We are hiring!https://info.cookpad.com/jobs/
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠https://github.com/gfx/android-power-assert-pluginਓபืूத