品質やテストの話は往々にして提供するサービスやアプリのコンテキストに依存します。クックパッドのiOSアプリを題材にして、私たちが機能的な品質を保つためにどのようなテストを行ってきたかをお話します。特に、自動化されたテストに関してお話します。UIのリニューアルや様々な取り組みと変化だけではなく、Objective-CからSwiftへの書き換えなど、iOSを取り巻く環境は短い間に大きく変化しています。その中で、どのような取り組みにより最低限の不具合を防ぎ、iOSアプリをリリースし続けてきたのか。また、これにより得られた学びや、これからの取り組みに関してもお話しいたします。
クックパッドアプリのテストを味わう
私はテストエンジニアなのでテストの話をします。
テスト自動化やプロセス改善、組織改善に関わっています。
Swift, Ruby, Java, Elixerなどを使っています。
テストと言ってもたくさんの意味やテーマが有ります。
テストレベルとオートメーション、UIテスト、テストがどのように開発をサポートしているかをお話します。
私たちのプロダクトでのケーススタディをお話します。
テストの対象についてまず説明します
テスト対象の知識は、テスト戦略やケーススタディ理解を手助けしてくれます
クックパッドはレシピ共有サイトです。
日本向けとそれ以外でアプリケーションが有ります。サービスレベルが違うので二つは統合されていません。
日本向けのアプリの話をします。
5年成長を続けています。
スクリーンショットで変化を示しています。UIは複数回大きく変え、実装も大きく変えています。
プロダクションコードは10万行ぐらい。
この間何度もリリースしています。最近のサイクルは1ヶ月ぐらいのサイクル。以前は2週間でした。ソースコードは5千から1万行に変わっています。
内部のロジックも書き換えたりしています。
MustBeはクラッシュしないこと
どれぐらい長い間開発されてきたか、日本市場・モバイルでのクオリティについて話しました。
ではどのようにエンジニアリングしているか
継続的に開発してきてこれからも変化します。
モバイルアプリについてはリエンジニアリングをしました。
テストターゲットを変えて継続的開発を可能にし開発速度を維持師でグレードを起こさない。
ユニットテストをリファクタリング前に書くことは不可能なこともある(??)
機能はテストをせずにリファクタすると問題が起きる。
リエンジニアリングのアプローチは2つ
内部と外部。
コードの話しとユーザーからみたのUI
もしバグがあったらリリース前に修正をかけます
自動化テストだけでなく、UnitTestが完全に自動化されると言えば、殆どの開発者に合意してもらえると思うが、
他のテスト、たとえば結合などであればこのレベルは下がります。
ただ最も自動化が必要なのはUIです。
多くの場合時間があまりにかかってしまいます。モバイルテスト自動化は難しいからです。
これは理想のテストのピラミッドです。
UnitTestが一番多く、UIが一番少ない
モバイルは容易に逆になる
これを逆にしたい
人を介すること無くチェックできるように
Itunes Connectのクラッシュ件数
どんどん下がっています。
2015年以前はもっと高い数値でした。
この間ずっとリリースをして活発化しています。 この結果を見ていただくとクラッシュレート減少を達成
今はスクリーンの遷移の8割を自動化されたUIテストしています。
これがアーキテクチャです。
エンドユーザー間の独立性を担保
シナリオは"ターニップ"で定義しています
味付けということで幾つかヒントを
内部ロジックに依存せずにテストすること
UIテスト拡張にさらに取り組み
内容のテストだけでなくレポートもする
相違をデザイナが簡単に確認できる。
ネットワークトラフィックもチェックしている
なにか変更で壊れるとUIテストでエラーが発見される。
数ヶ月前にSwiftを導入し3割近くがSwiftで書かれている。
UI、リクエストレベルで怖がること無くコードを書くことが出来る。
プロダクションコードと責任を分けて
開発者の空き時間で出来ることではありません。普段のコーディングとは異なったスキルが必要になります。
Q&A
いぜんAppiumを使っていて、起動とテストに時間が掛かる。UITestingではなくAppiumを選択した理由は
シミュレーターの状態をクリーンにしてシステムアラートを出すことが出来る形になっているのでシナリオの再現性という点でAppiumを採用しました。
遅さはあるが、CI上でコミット毎にUIテストを回すことはしていない。どのタイミングでテストするかという戦略を考えなければいけない。
バンダリーをチェックすべきでないとおっしゃっていたが別のテストはどのようなものを導入しましたか?
20文字しか入力できないところを19文字入力したり21文字入力したり、と言ったバリデーションに関わるところは、UIでやってもいいが、バリデーションに合致するかどうかはUIで全てケースを揃えると底に至るまでのステップが重くなるので、なるべくUnitTestでやったほうが良いというのは、そうした文字入力の部分になります。