日経電子版×Sansanのアプリ開発勉強会シリーズ第3弾。最終回となる今回は「アプリ開発時のテスト自動化」「開発効率改善」がメインテーマ。辰濱健一氏 (Sansan エンジニア)、赤間夏樹氏 (株日経電子版 エンジニア)、岸川克己氏(アプリ開発テクニカルアドバイザー)がアプリ開発効率化を伝授する。

アプリ開発に自動化は必須か

「勢いよくアプリを開発したものの、デバイスごとにUIに不具合が……」

「テストを自動化したいけれど、やり方が分からない」

上記の方は、ぜひアプリ開発時のテスト自動化を図ってみてはいかがだろうか。

日経電子版×Sansanのアプリ開発勉強会、シリーズ第3弾。最終回のテーマは「アプリ開発時のテスト自動化」、「開発効率改善」。登壇者である辰濱健一氏、赤間夏樹氏、岸川克己氏の3名が経験した失敗、そして効率化への道を指南した。

【登壇者】

・辰濱健一氏 （Sansan株式会社 エンジニア） 「アプリ開発作業の効率改善」

・赤間夏樹氏（株式会社 日本経済新聞社 エンジニア）「CircleCI を導入してみた」

・岸川克己氏 （アプリ開発テクニカルアドバイザー）

人数が少ないからこそ、作業の効率化が必要だった

最初のトークセッションはSansan株式会社エンジニアの辰濱健一氏。Sansan株式会社のモバイルアプリエンジニアは「Sansan」と「Eight」、この2つの事業部で合計6人のメンバー構成だという。

普段は徳島県神山町にあるSansan株式会社のサテライトオフィス、「神山ラボ」で働いている辰濱氏。業務の中で必要なコミュニケーションは「Github、Skype、Slack等のツールで意外となんとでもなる」とのことだ。

普段は徳島で働いておりまして、そこでAndroidアプリリーダーをしています。辰濱です。アプリテストを自動化することになった理由ですが、SansanではWeb版があるものの、アプリの利用促進を重視しています。

海外展開もありますし、開発のスピード感が求められている環境で、毎年新しいOSや新しいスマートフォン機種が出てくる。展開に応じて動作確認が必要なのにそれを行うQAチームは弊社になくてですね、品質面でも性能面でもデグレードが許されない中で、「じゃあスマホアプリでもUIの自動化テストを導入しよう」となりました。

調べていただければ、スマホアプリの自動テストライブラリって意外と多くあるんです。大きく分けるとAndroid専用、iOS専用、両方に使えるハイブリッド型の3つですね。

Sansanで選定したのはAndroid版では「Robotium」、iOS版では「KIF」というライブラリです。「Robotium」はAndroidにおける実装と同じJava言語で記述ができ、アプリケーション内部のオブジェクトを参照できることがメリットです。UI に見えない内部の値のチェックもできます。DB にもアクセスできるのでテストケースを動的生成でき、サーバ DB状態の変更にも強いんです。いろいろな環境のUIのテストも可能になります。

ただし、リリースビルドでは使えないので、リリース前であればリリースビルドでも使えるappium などのライブラリもあるのでこちらもおすすめです。

また、iOS版では「KIF」を使っています。これは社内他チームで先行調査をしており、ノウハウ共有のためにライブラリを合わせました。

テスト項目の基本は「広く浅く」で。「この機能をがっつりやる！」ではなく一画面一機能を簡単に触るだけというリグレッションテストを自動化しました。

例えば、ログイン機能だったら「ログインできることだけ」をテストします。このときは、パスワードが空の時にエラーが表示されることのテストなどは省いてしまうんです。

「ユーザ一覧画面」であれば、「タップで名刺一覧画面に遷移すること」の機能1つをテストします。

こちらはログイン画面のテストコード例です。参考になるので動画もあわせてご覧ください。

自動テスト導入の効果ですが、主に2つの効果がありました。1つはデグレードの早期発見・防止につながったこと、2つ目は「作業効率の向上」です。

実際に開発中のミスを検出し、デグレードを未然に防いだり、大きな修正があったときもスムーズに対応できました。何度でもテストを簡単に実行できる点もデグレードの早期発見・防止につながりましたね。

また、離席中やランチの時間、ミーティング中でも自動テストができるので、テストに割く時間を開発に充てることができました。新しい OS が出てもテスト工数を割かなくて良いので、作業効率が向上するんです。

あと、UIテストは仕様変更に弱いので「書きすぎない」がコツ。UIはコロコロ変わりますから。「通信が終わったら」「ぐるぐるが消えたら」など、SLEEP じゃなくて WAIT で。操作の限界はあるので、適度にあきらめること。「スモークテスト」は広く浅く最低限の確認、「機能テスト」は機能自体の本格的な確認、スクリーンショットの収集など、目的別で分割するといいと思います。

またSansanでは、開発者＆デザイナーを参加対象に各種ガイドラインの「読み合わせ会」を社内で実施しています。Androidは「マテリアルデザインガイドライン」、iOSは「ヒューマンインターフェイスガイドライン」をテーマにただ読み合わすだけではなく、実機を持って参加しています。

「このデバイスでこの動きがちょっと……」、「このアプリのこの動きはガイドラインに反してるかも？」など開発者とデザイナーでライトに話をしながら進める会です。話の中で「これはデザイナーの作業の中で自動化できるよね」と業務の効率化が進んだり、サポートし合う環境作りが重要です。

実機は会社の中で使うのではなく、個人が「日常用」に使ってもらうことで、細かいUIや動きを開発やデザイナーが気づけるような体制を作っています。

iOSとAndroidで同じ仕様のアプリを効率良く作るための工夫にもつながりますが、これは可能なら、機能担当制にするとスムーズですね。「この機能はAさん担当、iOSもAndroidも作る」など、一括最適化することです。ただこれは、iOSとAndroidの両方の知識が必要ですね。

技術者が少ない環境で開発をしている人たちにお伝えしたいのですが、少人数で頑張るからこそ作業効率化が大切なんです。Sansanもそうでした。でも、逆に人数が少なかったからこそ、開発作業の効率化についても積極的になれた。もしご興味があれば、関連資料もあるのでこちらもご覧ください。

▼関連資料スライド

・「Robotiumを使ったUIテストとレイアウト確認の効率化」

http://www.slideshare.net/kenichitatsuhama/robotium-ui

・「Rubyを使ったスマホアプリのUIテスト」

http://www.slideshare.net/kenichitatsuhama/rubyui

※当日のスライドは下記からご覧いただけます。

http://www.slideshare.net/kenichitatsuhama/ss-50345466

楽をするのではない、リリースへの道が短くなるという努力

続いてのトークセッションは、日経電子版エンジニアの赤間夏樹氏。第一回の「モダンな開発環境×技術顧問×内製化」Sansan×日経電子版 アプリ開発の最前線を語る夜でも登壇した赤間氏。今回はiOSアプリ開発を自動化して、開発プロセスを改善したトークが行われた。

日経電子版のサービス開発を行っている部署でエンジニアやっている赤間です。なぜアプリ開発において自動化が必要だったのかお話したいと思います。

まず、アプリのテストって大変ですよね？

OSバージョン、デバイスがそれぞれ複数ある中、「1度リリースすると元に戻せない」だったり、弊社の場合クラッシュするバグがあると、素早いニュース報道が困難になってしまう。結果、日経電子版では大量のテストケースを実施することになっていたんです。

あと、日経電子版は有料なので。有料だからこそ素早い対応が必要でした。記事APIというのがあるのですがこれは、それぞれのデバイスで出し分けています。

iOSにおける日経電子版のテストケースが2396件あったので、これにOSとデバイスをかけるとお分かりの通り、2396件より桁が一個違うような膨大な量になっていましたね(笑)

自分でビルドできないデザイナーさんやデータテスターさん、特に記者さんなどはずっとWindows使っている方も多いので、手動デリバリーも大変でした。ずっと「端末借りて、Lightningケーブルさして、Xcodeでビルドして～」という状態で。

また、「アプリ落ちるんだけど」「あっ、そのバグはもう最新版でなおってます」みたいなコミュニケーションコストもかかる状況で。「もうこれは自動化しましょう！」となりました。

元々はユニットテストは「Kiwi」でModelのみテストしていました。でも、ガバレッジは計測していなくて。まずはユニットテストを自動化しようということで、「CircleCI」を使うことになりました。

CircleCIを使って自動化したメリットですが、「ビルドスクリプトが自由に書ける」、「サポートが早い」という点ですね。また、チャットで簡単に質問できて、まぁまぁ費用対効果もいいんじゃないかと。

GithubにPushしたタイミングでテストすることで、Pushする毎に各ブランチでテストを自動実行、次にCircleCIでユニットテストを実行、xcodebuildし、チャットに通知します。弊社ではSlackを使っており、全体の情報を集約することが重要です。あとはbotのアイコンを変更したりなんかして、モチベーションをちょっとアップさせるような心遣いもしてたりしています。

自動化に必要なのは、費用対効果の高いものから始めること、全体の情報を集約することの2つです。変更に対する不安が簡単に取り除けますし、何より開発の「見える化」につながります。

アプリ自動化に取り組んで手作業の繰り返しはなくなりましたが、完全に手作業はゼロになりません。開発とQAの高速イテレーションこそが重要で。

まとめてテストするのではなく、コミット毎に自動テストする。「じゃあ自動テストが失敗した原因は直前のコード変更にあるよね」「欠陥コードの特定とバグ修正、もうやっちゃいました！」と修正がすぐ終わっちゃう。

QAチームに渡す前に、最低限の品質をチェックことでサイクルを早く、クオリティ良くできるようになりました。

自動化はメリットですし、ツールの導入は1人でもできます。ボトムアップで「これ導入しましょう！」って提案しても私は良いと思います。でも、気をつけたいことは、導入よりも運用のほうが大変なんです。CIのメンテナンスだったり、先ほどお伝えしたように手作業がなくなることはないので。

でも、開発ユニットとQAユニットで確認し合うサイクルが短くなって、結果サービスを出すことが早くなることが重要で。

「チームで楽をしよう」っていうスタンスよりも、「サービスのリリースが短くなる。これって会社にとってすごい良いことだよね！」って考え方で、チームでよりよく運用する意識が大切です。ありがとうございました。

※当日のスライドは下記からご覧いただけます。

https://speakerdeck.com/natsuz/ri-jing-nicircleciwodao-ru-sitemita

きちんとエラーを直していくことがより良いアプリに繋がる

最後は今回のゲストスピーカー、岸川克己氏だ。大手IT企業をはじめとした様々な企業にてアプリ開発のテクニカルアドバイザーをしている岸川氏。テストを効率化させるためのツールについて、主に「Infer」「Fastlane snapshot」を紹介。エンジニアとして知っておきたい知識を披露した。

岸川です。今回はアプリ開発において役立つツールを紹介したいと思います。

まず、「Infer」ですね。これは、静的解析ツールで、Xcodeの静的解析で警告されない問題も見つけてくれることがあります。

これはiOSの場合なのですが、インストールさえできれば使い方は簡単で、inferとダブルダッシュのあとにビルドコマンドをそのまま繋げるだけ。とても簡単。

これを実行すると、通常と同じようにビルドが動いて、解析フェーズが始まる。解析し終わったら下にエラーの内容が出てきます。

この時点で既にビルドシステムに「Infer」が回遊してくれているので、実は時間がかかります。

どれくらい時間がかかるのか、私が関わっているプロジェクトのコードにかけてみたのですが、だいたいフルビュードして5分～10分とかで終わるプロジェクトが「Infer」だとだいたい30分～1時間くらいかかるプロジェクトもありました。

気軽にCIなどでコミットごとにリリーステストを実行している人にとっては、ちょっとストレスが溜まることになるかもしれません。

逆に「Infer」のいいところは警告だらけになるということがない、意外な見落とし穴的なエラーを見つけてくれるので、Daily（1日に1回）やWeekly（週に1回）で実行するのがオススメです。きちんとエラーを直していくことは、きちんとしたアプリケーションに繋がりますので、多少時間をかけてもやってみる価値はあると思います。

続いて「snapshot」ですが、テストに必要なスクリーンショット収集を自動化してくれるツールです。

自動的に組み合わせてスクリーンショットを撮ってくれて、自動化するためにツールに組み込まれているんですね。UIオートメーションを利用しています。

また、「snapshot」はコマンドやると指定したタイミングでスクリーンショット撮ってくれる点がとても良いですね。面倒なスクリーンショット収集も自動化できる。

また、HTMLであれば一覧でスクリーンショット画像を出してくれるのですごく便利ですね。iPhoneにおける例を紹介します。

この図のようにiPhone5、iPhone6のスクリーンショットを一覧で見ることが可能なんです。

1つの画面かつ1枚ですべての画像比較を見られるので、デバイスやOSによるUIの違いが一目瞭然です。ぜひ使っていただきたいです。

snapshotのメリットはセットアップと使い方が非常に簡単であること。つまり、UIテストを自動化しやすい。解像度の異なるレイアウトの確認に長けています。

結果、正常に動かなくてはいけない機能が「正しく動いているかどうか」を一覧で確認できるんですね。

アプリでは、「サインアップ画面」などから導入して、UIテストに役立てることがおすすめです。こちらもDaily、Weeklyで行うテストで役立ててみてください。ありがとうございました。

アプリの開発には、ユーザーの手に届く前のテストが欠かせない……。サービスを滞りなく広めるには細部に気を使わなければならないだろう。

「テストを効率化したい」「アプリを開発しているけれど、効率化のために何をやったらいいのか分からない……」など、少人数で開発を行っている技術者にとって、今回のイベントは大いなるヒントが得られたのではないだろうか。

文 ＝ 鈴木美雪

