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

君はPower Assertを知っているか #potatotips

君はPower Assertを知っているか #potatotips

potatotips #7 2015/5/15 at DeNA

FUJI Goro

May 15, 2014
Tweet

More Decks by FUJI Goro

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. ͭΒ͍

    View Slide

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

    View Slide

  8. 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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. ΍Γ·ͨ͠

    View Slide

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

    View Slide

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

    View Slide

  15. σϑΥϧτͷྫ֎

    View Slide

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

    View Slide

  17. Power Assert༗ޮͷͱ͖

    View Slide

  18. 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͕ଓ͘…)

    View Slide

  19. ࢖͍ํ
    // 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’

    View Slide

  20. ͋ͱ͸assertจΛ࢖͏͚ͩ

    View Slide

  21. Power Assert ೋͭͷଆ໘

    View Slide

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

    View Slide

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

    View Slide

  24. How it works

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide