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

なぜテストを書くのか

 なぜテストを書くのか

社内向けにテストの意義等を紹介する際に用いたスライドです。
「なぜテストを書くのか」というところからはじまり、
Androidにおけるテストの基礎知識や、TDDについて紹介しています。

Hodaka Suzuki

April 10, 2019
Tweet

More Decks by Hodaka Suzuki

Other Decks in Technology

Transcript

  1. Apr 10, 2019 鈴木 穂高 | Hodaka Suzuki システム本部品質統括部SWETグループ DeNA

    Co., Ltd. Androidテスト
 ハンズオン
 基礎編
 1
  2. 自己紹介 • 鈴木 穂高(すずき ほだか) Twitter: @hoddy3190 • 経歴 −

    2014年新卒入社 − 2014年8月〜 FFRK JP − サーバー、クライアント、マスター管理ツール、インフラ整備、マネジメントなど − 2018年10月〜 SWET − Androidテストチーム(テストの普及のための活動) − GTRチーム(仕様品質を向上させるための技術的なアプローチ研究) − https://speakerdeck.com/hoddy3190/xing-shi-shou-fa-nituitediao-betemita 2
  3. アジェンダ • 1章: なぜテストを書くのか − テストの目的 − テストの効能 − 各ロールへのメリット・デメリット

    − テストがないことによるリスク − テストをいつ書くのか − まとめ • 2章: Androidにおけるテストの紹介 − テストの分類 − 詳細 − まとめ • 3章: テスト駆動開発 − TDDとは − TDDの効能 − TDDチュートリアル 3
  4. 自動テストの目的 7 • 効率的かつ効果的な品質担保 & 向上 − その結果 − ユーザーからの信頼獲得につながる

    − QA工数や手戻りが減る • 生産性向上 − その結果 − 時間的、精神的余裕ができる • 開発への指標の導入 − その結果 − スケジュール調整やプロセス改善の根拠に説得力が増し、 コミュニケーションコストが下がる
  5. 効能一覧 • 自動テスト自体の効能 − 動作確認が自動化される − 動作確認手順がテストコードとして明文化される − 動作確認の結果をフォーマット化された形で出力できる −

    CIを有効に活用できる − 開発初期に不具合を発見することができ、 手戻り時間を減らすことができる • テストを書く過程で得られる効能 − より良質な設計に気付ける − 仕様への理解が深まる 9 品質向上 生産性向上 品質向上 指標 品質向上 生産性向上 品質向上 生産性向上 品質向上 生産性向上
  6. 効能詳細(動作確認自動化の例) 11 実装 実機確認 修正 実機確認 修正 実機確認 実装 テスト実行

    修正 テスト実行 修正 テスト実行 実機確認 普通の開発 テストを活用した開発 テスト実装
  7. 効能詳細(動作確認自動化の例) 12 実装 実機確認 修正 実機確認 修正 実機確認 実装 テスト実行

    修正 テスト 修正 テスト実行 実機確認 普通の開発 テストを活用した開発 テスト実装 実機での動作確認は、 アプリをビルドして、 UI操作をする必要があるので、 時間がかかる。 自動テストでの動作確認は、 対象の機能のみ素早く実行可能なため、 時間がかからない。
  8. 効能詳細(動作確認自動化の例) 13 実装 実機確認 修正 実機確認 修正 実機確認 実装 テスト

    修正 テスト 修正 テスト実行 実機確認 普通の開発 テストを活用した開発 テスト実装 動作確認を自動化することで、生産性UP!
  9. 効能詳細(良質な設計への気付き) 15 Presenter の Unit Test 書きたいんだけど、 Repository の挙動の影響を受けてて テスト書きにくいな...

    プロダクトコードを使用して テストを書こうとすることで、 設計の悪いところに気づける
  10. 効能詳細(仕様への理解) • 書いたテストコードは資産として残る − 他の人の仕様の理解を助けるかもしれない − 日本語仕様を見る − 曖昧 −

    ソースコードを見る − 長い − テストコードを見る − !! − PRレビューで読むコードの量が減る といった効果も...! − 必要なことが考慮されているのかを、テストコードを見て判断できる − レビューとは直接関係ないコードの理解への助けになる 20 ※最近のテストケースは日本語で書かれることも
  11. エンジニアへのメリット・デメリット • メリット − コードレビューにかかる時間を短縮できる − テストコードを読むことで仕様の理解を助長できる場合がある − 自身の設計の良し悪しをほかの人の力なしに批評しやすくなる −

    仕様の理解を実装する前に固められる − 動作確認を効率化できる − テストがないという引け目を感じなくて済む − ミスしているかもという心配がなくなる 22
  12. PMへのメリット・デメリット • メリット − 実装者自身の報告より客観的な進捗の指標を入手できる − 手戻りが減ることにより、スケジュールどおりに進行できる確率が上がる • デメリット −

    テストという活動に対する意図と性質への理解が必要になる(特にエンジニア 出身ではないPMの人にとってはハードルかもしれない) 24
  13. 自動テストがうまくいっている状態とは • テストが書きやすいプロダクトコードになっている − テストしづらくても、プロダクトコードの修正により解決ができる • テスト実行時間が短時間で終了する • テスト実行が自動で実行される(CI) •

    過不足なくテストケースを実装できている • テスト安定性に配慮できる − 擬似乱数や日時系の API にテストが影響されると、テストが非常に不安定に なる。テストコード側から指示できるような設計にすることでこれを回避できる。 28
  14. 手戻り工数の大きさ • 開発初期にバグ発見をした場合 − ステークホルダーも少なく、仕様も検討段階であることが多いため、 仕様調整の工数は比較的小さい • 開発後期にバグ発見をした場合 − 多くのステークホルダーと調整の上、仕様が成り立っているため、

    バグ FIX に伴う仕様調整の対応工数が大きい • QA中にバグ発見をした場合 − QAの起票コストや、バグ FIX に伴う仕様の調整のコストなど さらに対応工数がかかる 35 後になればなるほど手戻り工数は大きくなる
  15. テストをいつ書くのか • 開発期間のいつ書くか − PRを出すときに成果物としてテストもほしい − 前述したとおり、関わるステークホルダーが小さいうちにテストを 書いておくと効果が大きくなる − ※

    ATDD のような開発では開発初期にテストを書く場合もある • プロダクトコードを書く前か後か − テストのメリット・デメリットを考えたうえでいつ書くのかを決める。 − 例: 良い設計が思いつかない場合 − プロダクトコードの前にテストを書くと、良い設計に気づけるかもしれない − 例: プロト開発期間など、スピードを求められている場合 − スクラップ&ビルドが落ち着いたあとでテストを書くと、スピードを落とさずにある程度の 品質を得られる(テストを書かないという選択もありえる)。 36
  16. テストの分類 • 対象の結合度による分類 − unit test(単体テスト) − 1つのクラス/コンポーネントに閉じる − integration

    test(結合テスト) − 複数のクラス/コンポーネントにまたがる − UI test − 画面情報も含める 42
  17. Android テストの実行環境 • テスト実行環境 − local unit test − JVM上で実行する

    − instrumented test − 実機やエミュレータ上で実行する 43
  18. さらに詳しく • local unit tests − local test + unit

    test = JVM 上で実行される単体テスト • instrumented unit tests − instrumented test + unit test = 端末上で実行される単体テスト 44 Android 公式ドキュメント内におけるテストの呼び方例 https://developer.android.com/training/testing/unit-testing/local-unit-tests より • Test apps on Android − https://developer.android.com/training/testing/index.html
  19. integration test • 複数のモジュールを組み合わせたときに正しく動作することを 検証するために行うテスト − Service や ContentProvider のようにユーザーが直接触れることが出来ず、

    かつ複数の画面にまたがって強調して動作するようなコンポーネントのテスト − サーバーに接続し REST API をクライアント側から検証するテスト 47
  20. local unit test • jvm 上で実行するテストの手法 • 開発環境で直接高速に実行できる • Androidフレームワークに依存したテストが書きにくい

    テストを格納する場所は、app/src/test 配下 49 Robolectric を使うと、local unit test でも Androidフレームワーク依存のテストを実行することができるようにな ります。ただし、あくまで JVM上でMockしているだけなのでテストとしての信頼性は落ちます。
  21. 2章まとめ 53 • Android でのテストには主に以下の分類がある − local unit test と

    instrumented test − unit test と integration test − ※Androidに限った話ではなく一般的な話 − それぞれの特徴に応じて使い分ける必要がある
  22. • プロダクトにテストを残すことにつながる − 自動テストの効能については、「なぜテストを書くのか」を参照 • 実装のゴールを明確にした上で、細かく確認しながら 進めるため、実装の手戻りが小さくなる − 不安の払拭にもつながる •

    テストを書く機会が増えることで、 様々な場面でテストをうまく使いこなせるようになる − 動かしたら遅いかも → テストする − デグレ起きないかな → テストする TDDの効能 68
  23. • リファクタを行い続けていくことで、 内部品質(保守性、可読性、テスト容易性 etc...)を 向上させやすくなる • テスト対象(関数など)の最初のユーザーに なることで、外部品質(可用性、利便性 etc...)を 向上させやすくなる

    − テストコードから初めてその関数を使用する = 試用ができるので、 その関数の使いにくさ等に気付けるし、使いにくいままプロダクト コードにリリースしてしまうということも防げる TDDの効能 69
  24. • Androidテスト全書 − 著者:白山 文彦 外山 純生 平田 敏之 菊池 紘 堀江 亮介 −

    https://peaks.cc/books/android_testing • 50分でわかるテスト駆動開発 − 著者:和田卓人 − https://www.slideshare.net/decode2017/do03-50 − CC BY 4.0 に基づいて使用しています リファレンス 72