58
アアアアアアアアアアアアアアアア 2016/02/16 Sansan×SONY アアアアアア Sansan アアアア アアア

アプリの不具合を少なくするために

Embed Size (px)

Citation preview

Page 1: アプリの不具合を少なくするために

アプリの不具合を少なくするために

2016/02/16   Sansan×SONY アプリ勉強会

Sansan 株式会社 辰濱健一

Page 2: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Agenda

2

• 自己紹介

• Sansan アプリについて

• 不具合を少なくするために

• 導入ツール

• 手動でのテスト

• 自動テスト

• まとめ

Page 3: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 3

自己紹介

Page 4: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自己紹介

4

• 辰濱健一• https://www.facebook.com/kenichi.tatsuhama• http://www.slideshare.net/kenichitatsuhama

• 徳島県生まれ、徳島県勤務

• Tokushima.app というスマホアプリ勉強会を主催

• 趣味は音楽&旅行

Page 5: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自己紹介

5

• 業務経歴

• 1 社目@徳島市

• Java, C++, MFC• UWSC を使った Windows アプリの UI 自動テストの導入

• 性能改善チームにて、自動性能計測ツールを作成

• 2 社目@徳島市

• iOS ( Objective-C ) , Android ( Java ) , Windows ( C# )のスマホ&タブレット向けアプリ開発

• 機能担当制、 iOS で作った機能は作った人が他 OS に移植

• 3 社目@徳島県神山町

• スマホアプリの自動テスト

• リモートワーク

開発&品質担保と自動テスト

モバイル開発

モバイル開発での品質担保と自動テスト

Page 6: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自己紹介

6

• Sansan 神山ラボ(勤務先)

Page 7: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 7

Sansan アプリについて

Page 8: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Sansan アプリについて

8

• 法人向け名刺管理サービスのクライアントアプリ

• 社員の名刺を検索・閲覧でき、社内の人脈を共有

Page 9: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Sansan アプリについて

9

• iOS / Android ほぼ同一仕様、ネイティブ実装

• 安価な機能制限版(海外向け)もワンバイナリで実現

• アプリ内でモードによる分岐多々…

• 海外向けには色んな施策を試すべく、スピーディーに対応する必要がある

• 日本語 / 英語に対応

• 名刺データ(個人情報)を扱っているので、アプリの品質が悪いと、サービスだけでなく会社の信用失墜に繋がる

Page 10: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Sansan Android アプリについて

10

• 辰濱の入社前までは外注していた

• 辰濱の入社後も、早期リリースに迫られ外注さんのコードベースで不具合修正&機能追加を余儀なくされる

• 直近まで、事業部内で Android エンジニアが1人だったので事業要求に応えるだけで精一杯(現在は2名体制)

• スピード感と品質が求められる

Page 11: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 11

不具合を少なくするために

Page 12: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>不具合を少なくするために

12

• 導入ツール

• 手動でのテスト

• 自動でのテスト

Page 13: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 13

不具合を少なくするために

〜 導入ツール 〜

Page 14: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>導入ツール

14

• Lint• Android Studio Inspect Code• Support Annotations• Crashlytics• Infer ( Facebook )

• QARK ( LinkedIn )

Page 15: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Lint

15

• http://developer.android.com/intl/ja/tools/help/lint.html

• Android SDK tools に含まれている静的コード解析ツール

• ./gradlew lint で実行

• 指摘内容

• UnuserdResources (未使用リソース)

• UselessParent ( View の不要なネスト)

• HardcodedText (国際化非対応)

など…

Page 16: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Lint

16

未使用文言

Notification icon の visual style

Page 17: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Android Studio Inspect Code

17

• Android Studio から実行できる静的コード解析

• Analyze > Inspect Code で実行

• 指摘内容

• Deprecated API use  (非推奨 API の利用)

• Field can be local  (変数のスコープの指摘)

• Javadoc issues  ( Javadoc コメントと実体の乖離)

• Declaration can have final modifier ( final にできる)

• Spelling  (スペルミス)

• Actual method parameter is the same constant(同じ値しか渡ってこない)

など…

Page 18: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Android Studio Inspect Code

18

Android Studio 上でレポートを確認できる

自動補正もサポート!

Page 19: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Support Annotations

19

• http://tools.android.com/tech-docs/support-annotations

• アノテーションを使って、パラメータの nonnull / nullable や値範囲を宣言できる

• Android Studio 上で警告してくれる

Page 20: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Crashlytics

20

• https://try.crashlytics.com/• クラッシュレポート収集&分析ツール

• ダッシュボードで、クラッシュの詳細を見ることができる

• 時刻、端末情報、アプリバージョン、発生箇所、頻度…

• ProGuard をかけた apk でも、元のクラス名・関数名・行数で確認できるのは嬉しい

Page 21: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Crashlytics

21

Page 22: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Infer

22

• http://fbinfer.com/• Facebook 製、静的コード解析ツール

• 指摘内容

• CONTEXT_LEAK• NULL_DEREFERENCE• RESOURCE_LEAK

• 結果は CSV, Json で出力される

• Android Studio Inspect Code での内容と重複するところもあるが、 Inspect Code にない指摘もある

Page 23: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>QARK

23

• https://github.com/linkedin/qark • LinkedIn 製、セキュリティチェックツール

• 指摘内容

• export されたコンポーネント

• WebView の設定

• Intent のセキュリティ

• 弱い暗号方式の利用など…

• 結果は html で出力される

Page 24: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 24

不具合を少なくするために

〜 手動でのテスト 〜

Page 25: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

25

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 26: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

26

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 27: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>アクティビティを保持しない

27

• 開発者向けオプションで設定

• この時に、

• 正しく画面遷移(行き来)できるか

• 最小化 → 復帰後の状態は適切か

• 各種変数の値

• 表示中のダイアログやメッセージが、復帰後も正しく動作するか?

• これにより以下の確認になる

• on(Save/Restore)InstanceState 対応

• 適切な Fragment の扱い方

Page 28: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>【コラム】適切な Fragment の扱い方

28

• デフォルトコンストラクタを使っているか?

• 外から渡したい値は、 Bundle で渡しているか?

Page 29: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>【コラム】適切な Fragment の扱い方

29

• setListener などしていないか?

• フラグメント再構築時に、 setter は呼ばれない!

• ※onCreate は呼ばれます

• DialogFragment に setListener してると、再構築時に Listener が set されず、意図した Listener の呼び出しが行われない

• 詳しくは「Master of Fragment」を!http://tatsu-zine.com/books/master-of-fragments

Page 30: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

30

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 31: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>さまざまな通信環境

31

• 安定した通信環境 (当然なので解説省略)

• 機内モードの時

• 通信が遅いとき

• Wi-Fi に繋がっているが、インターネットに繋がっていない場合

Page 32: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>機内モードの時

32

• 端末で予め判定できる( ConnectivityManager )

• 事前のエラー表示ができているか?(そもそも画面遷移させないなど)

• 通信処理を行った場合、エラーハンドリングできているか?

• キャッシュで表示できるモノだけでも表示する?

• 送信処理を受け付け、オンラインになったら送信? ( Facebook などはオフライン投稿機能がある)

Page 33: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>通信が遅いとき

33

• 再現方法は色々

• 通信ライブラリと interceptor で可能かも?

• 低速 SIM• Android エミュレータの設定 など…

• UX は適切か? (ぐるぐる表示、進捗表示)

• 最小化や画面遷移後のコールバック処理は大丈夫か?• Fragment#isAdded() で Activity に attach されているかチェッ

• ViewPager 内の破棄された Fragment へのコールバックは忘れがち

• 可能であれば、前画面用の通信はキャンセル or 優先度を下げたい

Page 34: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

> Wi-Fi にはつながってるが、ネットにつながってない

34

• 基本的には、前項の項目と同じ

• ※端末側での判定は難しい

• ただ、サーバからのレスポンスが帰ってこないので、タイムアウトのエラーハンドリングが必要

• タイムアウトまで通信スレッドを占有するので、通信キューが山積みになったり、いくつものスレッドを走らせすぎる懸念

Page 35: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

35

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 36: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>iOS 版や Web 版との比較

36

• 同じ操作をしたり、同じデータを表示させて見比べる

• よくある差違

• 数値や日付の表示形式

• データのソート順

• 長い文字列の対応(末尾…、折り返し、スクロール)

Page 37: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>iOS 版や Web 版との比較

37

桁区切りの有無

数値の違い

Page 38: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

38

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 39: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>社内 β 版の配布

39

• 社内ヘビーユーザにリリース前に配布

• 実データならではの問題が出る可能性がある

• 開発中に使っていない端末でも問題なく動作するか?

• なかなか気づかない操作の癖

• バックキー使い? ナビゲーションで戻る?

• キーボードの虫眼鏡ボタンで検索?

• 2点タップどっちから離すか

• A+B: A押下 → B押下 → どっちから離す??

• ↑前々職でどっちから離すかで再現が別れる問題があった

Page 40: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>手動でのテストの観点

40

• アクティビティを保持しない

• さまざまな通信環境

• iOS 版や Web 版との比較

• 社内 β 版の配布

• リグレッションテスト

Page 41: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>リグレッションテスト

41

• リリース直前に必ず実施

• 主要機能のデグレードがないことを確認

• やる)

• 主要機能のワンパス

• ログイン、名刺登録、編集、削除、ログアウト など

• 過去の重大な不具合が再現しないこと

• やらない)

• 100 文字制限のところに 101 文字入れたときのエラー

• アプリにサーバリリース前にも行っている

Page 42: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 42

不具合を少なくするために

〜 自動テスト 〜

Page 43: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>Robotium を使った自動テスト

43

• ユニットテストではカバーしきれないUI 操作を伴うテストを記述

• Robotium はアプリケーション内部オブジェクトを参照できるため、柔軟なテストが記述できる

• DB のデータを参照して、 ListView に表示されているか

• SharedPreference の値が意図通りかの確認

• ただし、デバッグ版でしか動作しない(リリースバイナリでのテストは Appium を使う)

Page 44: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>テストコードの例

44

ログイン処理

メールアドレス入力欄を取得

パスワード入力欄を取得

メールアドレスを入力

パスワードを入力

ログインボタンを押す

テストライブラリをラップして可読性確保!

Page 45: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>デモ動画

45

• 2014/11 時点の動画です

• http://youtu.be/scY_RPgfxeY• 4 分ぐらいありますが、発表時間の都合上ちょっとだ

け…

Page 46: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テストの適用

46

• 前述のリグレッションテストには適用済み

• 主要画面の詳細なテストも記述中

• エラーメッセージ

• サインアップ時に送られるメールをパースして、サインアップ処理を行う( MailCatcher API を利用)

• Jacoco によるカバレッジ計測

• 2016/02時点で 59% をカバー

• ※テストでコードが実行されているからといって、安心ではない。

Page 47: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テスト導入してみて

47

• デグレードがないことを容易に確認できる

• メンテはそこまで大変じゃない

• テストでしっかりカバーしていれば、大規模なリファクタリングも安心!• これから、通信ライブラリ・カメラ API ・デザインパーツの差し替

え・ DB の置き換え?などが控えている

• モックを使わないので、サーバの動作確認にもなる

Page 48: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テストの詳細は

48

• DroidKaigi 2016 で!

https://droidkaigi.github.io/2016/

Page 49: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テストの詳細は

49

と、思ったのですが、CFP 通らなかったので…

Page 50: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テストの詳細は

50

• 2/20 DroidKaigi 2016 Reject Conf で!

http://connpass.com/event/24264/

Page 51: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>自動テストの詳細は

51

• 3/23 Android Testing Bootcamp #1 でも!?

http://connpass.com/event/26911/

※抽選がまだ

Page 52: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>調査中の Device Farm の内容ですが…

52

• 3/12 JAWS DAYS 2016 でも!

http://jawsdays2016.jaws-ug.jp/speaker/409http://jawsdays2016.jaws-ug.jp/

Page 53: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 53

効果

Page 54: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>効果

54

• iOS / Android とも、前任者のコードベースの事情を十分にカバーする品質担保ができている。

• 開発部内でサービスインシデントは 数十件 /年 あるが、アプリにおいては 0件 /年 と部内トップレベル

• 新しい OS や端末が出た場合のテストも容易

• テスト工数の削減

• コードレビュー時にこれらの観点でも見るので、チームメンバーの品質意識・対応の底上げになる

Page 55: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 55

まとめ

Page 56: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>まとめ

56

• 使えるツールは使おう!

• 色んな環境でテストしよう!

• テストの自動化に取り組もう!

Page 57: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved. 57

質疑応答

Page 58: アプリの不具合を少なくするために

Copyright © 2014 Sansan, Inc. All rights reserved.

>こちらもどうぞ

58

• Android アプリ品質ガイドライン【 Google Developers Japan 】• http://googledevjp.blogspot.jp/2013/01/core.html

• Robotium を使った UI テストとレイアウト確認の効率化• http://www.slideshare.net/kenichitatsuhama/robotium-ui

• Appium を使って iOS / Android の UI テストを共通化

• http://www.slideshare.net/kenichitatsuhama/appium-ios-android-ui

• UWSC を使った自動テスト( for Windows )• http://qiita.com/tatsuhama/items/d6595050a13c5ed2de48

• Robotium で書いた Android アプリのテストを AWS Device Farm で実行する• http://qiita.com/tatsuhama/items/27d5e3ef1056e740b085