iOSアプリ開発自動テストの教科書 〜XCTestによる単体テスト・UIテストから、CI/CD、デバッグ技術まで

「iOSアプリ開発自動テストの教科書」のカバー画像
著者
平田敏之ひらたとしゆき細沼祐介ほそぬまゆうすけ 著
定価
3,608円(本体3,280円+税10%)
発売日
2019.6.27
判型
A5
頁数
456ページ
ISBN
978-4-297-10629-4 978-4-297-10735-2

概要

「iPhone X、XR、iPad……端末が多すぎて、テストが手動じゃ追いつかない」
「競争が激しいアプリ開発現場で、スピードを落とさずテストしなければ」
「どうして、テストしたはずのアプリで、ユーザーからこんなにバグが報告されるんだ」

競争が激化し、複雑になるiOSアプリの開発において、こんな問題を解決できる手段が「自動テスト」です。

本書は、DeNAの開発生産性や品質を担うSWETグループのエンジニアたちが、iOSアプリ開発の自動テストにフォーカスしてまとめた、これまでにない“テストの入門書”です。自動テストの基本はもちろん、単体テスト・UIテスト、CI/CD、さらに効率的なデバッグのテクニックまでを網羅できます。

iOSアプリ開発でテストに関わるエンジニアはもちろん、開発の現場のすべてのエンジニアが持っておきたい、iOSテスト必携の1冊です。

こんな方にオススメ

  • iOSアプリ開発者
  • 自動テストに取り組みたいエンジニアの方

著者の一言

本書は、iOSアプリ開発における自動テストについて焦点をあてた1冊です。iOSアプリの開発が始まってから約10年が経ちました。昔に比べ開発は複雑さが増しており、対応するべき端末の種類も増えました。そのため、手作業によるテストだけでは、品質を保つことは難しくなってきています。
手作業によるテストのみに頼ると、検証にかかるコストがどうしても増えてしまいます。その結果として、リリースまでの速度が遅くなるという事態になりかねません。逆に、リリースを優先してリグレッションテスト(回帰テスト)を実施しなかった場合、リリース後にバグが発生してしまうという事態も起こりえます。
これらの問題に対する解決策の1つが自動テストです。しかし、自動テストは、かんたんに導入し、運用を続けられるものではありません。また、すべてを解決する“銀の弾丸”というわけでもありません。
ここ数年で、iOSアプリ開発において、自動テストでおこなえることが増えてきています。また、CI/CD(継続的インテグレーション・デリバリ)やデバイスファーム(クラウド上で実際のモバイル端末を利用できる環境)といった、自動テストに関係するサービスも増えてきています。
しかし、自動テストについて体系的にまとまった情報は少なく、もちろんそれらがまとめられた書籍もありません。こういった情報の少なさや、自動テストを始める際の学習コストの高さから、取り組もうとしたものの挫折した、あるいは失敗した経験がある人も多いのではないかと思います。
そのような背景から、本書の企画が立ち上がりました。本書は「iOSアプリ開発における自動テストのための地図」のようなものを目指しました。各トピックについて深くは取り上げていませんが、自動テストを挫折せずに導入・運用できるよう、自動テストおよびそれに関係する情報を幅広く解説しています。
本書では、おもに以下のような内容をまとめました。

  • 自動テストについての考え方
  • XCTestを利用した単体テストやUIテストの作成方法
  • 自動テストに役立つOSSの活用例
  • CI/CDサービスを利用した開発・リリースサイクルの自動化
  • アプリ配信やデバイスファームなどの関連サービスの活用例
  • fastlaneを利用したタスクの自動化
  • XcodeやLLDBなどを活用したデバッグ手法

このような幅広いトピックを扱いつつも、入門的な情報だけにとどまらず、実際のプロジェクトで活用できる実践的な内容となるように注意を払いました。本書が、自動テストの導入や活用につながれば、筆者らとしては幸いです。
(本書「はじめに」より)

目次

  • はじめに

第1章 自動テストをはじめる前に

  • 1-1 なぜ自動テストを実装するのか
  • 1-2 テストピラミッドを意識する
  • 1-3 どこまでのテストを自動化するか
  • 1-4 テストの目的を把握する

第2章 自動テストにおける落とし穴を避ける

  • 2-1 テストケースを独立させる
  • 2-2 テストの失敗原因をわかりやすくする
  • 2-3 自動テストをどこから追加していくか
  • 2-4 不安定なテスト結果に向き合う
  • 2-5 テストの実行時間を意識する

第3章 XCTestを利用した単体テスト

  • 3-1 XCTest frameworkとは
  • 3-2 XCTestを使った最初の単体テスト
  • 3-3 アサーション
  • 3-4 失敗時のエラーメッセージを指定する
  • 3-5 独自のアサーションを作成する
  • 3-6 XCTestのライフサイクル(setUp / tearDown)
  • 3-7 テストを階層化する - XCTContext
  • 3-8 非同期なAPIのテスト - XCTestExpectation
  • 3-9 単体テストが書きづらいケースに対処する
  • 3-10 APIを利用するModelクラスをテストする
  • 3-11 ランダムな順序で実行させる
  • 3-12 コードカバレッジを考える

第4章 単体テストに役立つOSSを活用する

  • 4-1 Quick/Nimble - BDDフレームワーク
  • 4-2 Mockingjay - HTTP通信のモック
  • 4-3 Cuckoo - モック用のコードの自動生成
  • 4-4 SwiftCheck - Property-based Testing

第5章 XCTestを利用したUIテストの基本

  • 5-1 XCUITestとはなにか
  • 5-2 UIテストを実装するための最初のステップ
  • 5-3 Xcodeのレコーディング機能を利用する
  • 5-4 UI要素に設定されている情報を調べる
  • 5-5 テストコードを実装する

第6章 XCUITestのAPIを理解する

  • 6-1 UI要素を特定する
  • 6-2 UI要素を操作する
  • 6-3 UI要素の状態を確認する
  • 6-4 UI要素の情報を取得する - debugDescription
  • 6-5 対象のアプリを決める - XCUIApplication
  • 6-6 端末を操作する - XCUIDevice
  • 6-7 テスト実行時の成果物を保存する - XCTAttachment

第7章 UIテストの一歩進んだテクニック

  • 7-1 ユニークなAccessibility Identifierを設定する
  • 7-2 UI要素に対する複数の操作をまとめる
  • 7-3 アプリのUI変更に対応する - Page Object Pattern
  • 7-4 UIテストの実行時間を短縮させる

第8章 CI/CDの基本を押さえる

  • 8-1 CI/CDとはなにか
  • 8-2 iOSアプリ開発で利用できるCI/CDサービスを選ぶ
  • 8-3 CI/CDの結果をフィードバックする
  • 8-4 CI/CDサービスと連携するサービス
  • 8-5 CI/CDパイプラインを決めて自動化する

第9章 fastlaneを利用したタスクの自動化

  • 9-1 fastlaneとは
  • 9-2 fastlaneを導入する
  • 9-3 最初のレーンを定義して実行する
  • 9-4 アクションの基本
  • 9-5 Fastfileのライフサイクル
  • 9-6 Rubyで定数や関数を定義する
  • 9-7 プラグインの利用
  • 9-8 fastlaneに用意されたアクションを利用する

第10章 アプリ配信サービスとデバイスファームの活用

  • 10-1 アプリ配信サービス - TestFlightを利用する
  • 10-2 アプリ配信サービス - DeployGateを利用する
  • 10-3 デバイスファーム - Firebase Test Labを利用する
  • 10-4 デバイスファーム - AWS Device Farmを利用する

第11章 BitriseとCircleCIによるパイプラインの自動化

  • 11-1 Bitriseでワークフローを設定する
  • 11-2 CircleCIを使ってワークフローを設定する

第12章 デバッグのテクニック

  • 12-1 ブレークポイントをもっと効果的に活用する
  • 12-2 変数の値を監視する
  • 12-3 Xcodeに用意されたデバッグツールを使いこなす
  • 12-4 LLDBを使ったデバッグ
  • 12-5 シミュレータのデバッグ機能を使う
  • 12-6 実機のデバッグ機能を使いこなす
  • 12-7 アプリ上でデザインを確認する - Hyperion

Appendix

  • A-1 XCTestを導入する
  • A-2 XCTestを実行する
  • A-3 Bundlerによるツールバージョンの固定
  • 索引
  • 参考文献
  • 著者略歴

プロフィール

平田敏之ひらたとしゆき

DeNAのSWET(Software Engineer in Test)グループ所属。グループウェアの開発、女性向けWebサービスやiOSアプリ開発を経て現職のSWETにたどり着く。現職では、iOSやCI/CDに関する領域を主に担当。テストに関する勉強会である「Test Night」を立ち上げ、SWETメンバーと共に定期開催している。

細沼祐介ほそぬまゆうすけ

DeNAのSWET(Software Engineer in Test)グループ所属。JavaのテスティングフレームワークであるJUnitや、XP開発におけるテスト駆動開発について、黎明期で触れ、自動テストに興味を持つ。Web、Windows、iOSなど様々なプラットフォームでのアプリケーション開発を経て、自動テストの専門部署であるSWETにたどり着く。現在はiOS/Go言語の自動テスト領域を担当。SwiftやHaskellなどの関数型プログラミングを好む。