Successfully reported this slideshow.
Your SlideShare is downloading. ×

テストがあればなんとかなる〜効率化までの道程〜

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Wantedlyのテスト事情
Wantedlyのテスト事情
Loading in …3
×

Check these out next

1 of 34 Ad
Advertisement

More Related Content

Slideshows for you (20)

Advertisement

Similar to テストがあればなんとかなる〜効率化までの道程〜 (20)

More from Takao Sumitomo (20)

Advertisement

Recently uploaded (20)

テストがあればなんとかなる〜効率化までの道程〜

  1. 1. テストがあればなんとかなる 〜効率化までの道程〜 Takao Sumitomo @cattaka_net
  2. 2. 自己紹介 ● 住友 孝郎(Takao Sumitomo) ● Androidアプリ開発者 ● 開発経歴 ● Androidアプリケーション(4年) ● iOS(3ヶ月) ● 業務系Webアプリケーション ● Enterprise Windows app ● その他 – 電子工作 – OpenCV ● ウォンテッドリー株式会社所属
  3. 3. プロの力が身につく Androidプログラミングの教科書
  4. 4. 駄目コードについて、C87で書きました 技術サークル TechBooster
  5. 5. 開発途中から テストを導入する話をします
  6. 6. ベストアプリに選ばれました
  7. 7. 開発体制 ● 実装 ● 自分 ● テスト ● 自分 ● QA ● 自分 ● リリース担当 ● 自分
  8. 8. Wantedlyのアプリ ● WebやiOSに遅れて開発 ● まだまだ成長途中です ● これからがんばる
  9. 9. これまでとこれから ● まずはリリース(2014年5月〜) ● 本格的に改修開始(12月〜) ←ここで参戦 ● 海外展開へ(2015年3月〜)
  10. 10. 参戦時の状態 ● 試験的に作ったアプリだったため ● あるのはコードのみ ● テストコードは存在せず ● 何が正しいのかわからない ● 触ると何処か崩れそう、、
  11. 11. やったこと ● 最小限のリファクタリング ● 外部依存やストレージ周りにオレオレDIを入れる – 通信処理 – データベース – プリファレンス ● その他 (個人的に過去に関わったアプリの事例) ● 不要なグローバル変数を取る – シングルトンという名のグローバル変数も取る ● 投げっぱなしのスレッドを止める ● Process.killProcessなどを止める ● ひたすらテストを書く
  12. 12. ひたすらテストを書く
  13. 13. 具体的な修正1 ● 修正前 アプリケーション 通信処理データベース SharedPreferences
  14. 14. 具体的な修正2 ● 修正後 アプリケーション 通信処理データベース SharedPreferences
  15. 15. 具体的な修正3 ● テスト時の構成 アプリケーション 通信処理のモックデータベースのモック SharedPreferencesのモック
  16. 16. 具体的な修正3 ● テスト時の構成 アプリケーション 通信処理のモックデータベースのモック SharedPreferencesのモック 要はこれらをモックに 差し替えられれば テストが書ける
  17. 17. オレオレDIでも無いより良い! プロダクションコード public class SharedPreferencesFactory { static SharedPreferencesFactory INSTANCE = new SharedPreferencesFactory(); public static SharedPreferencesFactory getInstance() { return INSTANCE; } public SharedPreferences newInstance(Context context, String name) { return context.getSharedPreferences(name, Context.MODE_PRIVATE); } } テスト用のダミー public class DummySharedPreferencesFactory extends SharedPreferencesFactory { public SharedPreferences newInstance(Context context, String name) { return context.getSharedPreferences("test_" + name, Context.MODE_PRIVATE); } } テストのときは ここをダミーに差し替える
  18. 18. データベースの差し替え ● RenamingDelegatingContextを使えば 一時的に別のDBファイルにできる ● SQLiteOpenHelperにcontext=nullを渡すと オンメモリのデータベースが作れる どっちでもテストは書ける
  19. 19. 通信処理の差し替え ● 予め通信処理は1つにまとめておく ● オレオレDIで通信処理を差し替える ● 偽の通信データを返すようにする ● 偽の通信データは androidTest下のassetsに入れる
  20. 20. ひたすらテストを書く ● ブラックボックステスト ● ウォークスルー ● コンバージョンに繋がるところを重点的に ● ログイン周り ● 応援 ● 応募 ● ユーザーのプロフィール入力
  21. 21. ひたすらテストを書く
  22. 22. 悲しいこともあるけど、、
  23. 23. ツールやライブラリ
  24. 24. 基本的に一般的なものを使用 ● JUnit4 ● ./gradlew connectedAndroidTest ● ./gradlew createCoverageReport ● Espresso (android-test-kit) ● UI周りのテストが簡潔に書ける ● Mockito ● モックが簡単に作れる ● Crashlytics
  25. 25. connectedAndroidTestのレポート
  26. 26. createCoverageReportのレポート
  27. 27. 標準でも十分強力
  28. 28. 今後の予定 ● CIで自動化 ● Jenkins? Travis CI? Circle CI? 検討中 ● 実はまだテストは手でgraldewを叩いてる
  29. 29. まとめ
  30. 30. いきなり効率化は無理
  31. 31. テストがあればなんとかなる
  32. 32. まずはテストを書こう
  33. 33. ご清聴ありがとうございました Takao Sumitomo @cattaka_net

×