Android Test Online #1の発表資料です
2年半ぶりのプロダクト開発であらためて感じた自動テストの大切さNozomi TakumaAndroid Test Online#1
View Slide
自己紹介● Nozomi Takuma● DeNA SWETグループ○ 兼務: Pococha事業部システム部● Androidとテストが好き
自己紹介● Nozomi Takuma● DeNA SWETグループ○ 兼務: Pococha事業部システム部● Androidとテストが好き自動テスト導入サポート等(50%)
自己紹介● Nozomi Takuma● DeNA SWETグループ○ 兼務: Pococha事業部システム部● Androidとテストが好きプロダクトの開発(50%)
今日話したいこと
今日話したいこと● 2年半ぶりにプロダクト開発をしたら、自動テストに助けられる場面がありました● 改めて自動テストの大切さを実感することができたので、その体験を共有したいと思います
● 2年半ぶりにプロダクト開発をしたら、自動テストに助けられる場面がありました● 改めて自動テストの大切さを実感することができたので、その体験を共有したいと思います今日話したいことまずはこの期間の話をします主にSWETで事業部への自動テスト導入を行っていました
プロダクト開発から離れていた2年半
プロダクト開発から離れていた2年半2018/3〜SWETにjoin.2019/2〜自動テスト導入サポートの取り組みを開始2020/7〜Pococha事業部システム部兼務開始メトリクス収集ツールの開発2020/12〜Pocochaのプロダクト開発
プロダクト開発から離れていた2年半2018/3〜SWETにjoin.2019/2〜自動テスト導入サポートの取り組みを開始2020/7〜Pococha事業部システム部兼務開始メトリクス収集ツールの開発2020/13〜Pocochaのプロダクト開発
自動テスト導入サポートの取り組み● 自動テストのないプロダクトに自動テストを導入する● 自動テストを導入することで、不具合の早期発見や開発効率の向上を目指す
Androidプロダクトへの取り組み● 開発者テストの整備をスコープ● ユニットテストとインテグレーションテストの導入○ UIのテストもAPIとの連携はスタブ化している● E2Eテストには手を出していない
自動テストによる不具合の早期発見● 開発段階で問題を発見できるように● とはいっても、自動テスト導入がすぐにQAフェーズであがってくる不具合の減少につながるとは限らない
プロダクトで発生する様々な不具合● 実際にAPIや外部サービスと結合しないと発見が難しい● 問題を再現するのにある程度UI操作が必要○ 自動テストやっても費用対効果が見合わない● 仕様の認識ずれ
自分の心境● 現在スコープとしているテストでは発見が難しい不具合も多い● 自動テストの導入が開発チームの利益にきちんと繋がるか不安を感じていた
Pocochaでのプロダクト開発
改修を担当した機能● アイテム機能○ 視聴者はコインを消費することでライブ中にアイテムを送信できる○ アイテムを送信することで画面にエフェクトを表示しライブを視覚的に盛り上げる
改修内容アイテム素材はアプリ起動時に一括でDLされるライブの中では基本的にはDLが完了している状態旧仕様新仕様ライブ中にアイテムが利用されたタイミングでアイテム素材をDLする
自分がやったこと1. 既存実装のリファクタリング2. アイテム機能の不具合修正3. 新仕様への改修
自分がやったこと1. 既存実装のリファクタリング2. アイテム機能の不具合修正3. 新仕様への改修3つのタイミング全てで自動テストに助けられた
既存実装のリファクタリング● アイテム利用の実装がほとんどActivityに書かれていた○ 自動テストはない● 新仕様に改修する前にユニットテストを書けるようにするためリファクタリング
既存実装のリファクタリングActivityから処理の切り出しユニットテスト整備繰り返し
既存実装のリファクタリング既存実装の振る舞いが細かくわかっていなくてもある程度できるActivityから処理の切り出しユニットテスト整備
既存実装のリファクタリングテストパターンを作成するために既存実装の振る舞いを把握する必要があるActivityから処理の切り出しユニットテスト整備
ユニットテストで振る舞いを理解する● 内部処理がシンプルとは言い難いかつコメントやドキュメントもほとんどなく、自分の理解があっているか不安● 想定する挙動をテストケースにして、認識があっているか検証する
ユニットテストで振る舞いを理解する● 内部処理がシンプルとは言い難いかつコメントやドキュメントもほとんどなく、自分の理解があっているか不安● 想定する挙動をテストケースにして、認識があっているか検証する仕様化テスト
自動テストに何を助けられた?● 既存実装の振る舞いを理解するのを助けてもらった○ ユニットテストを動かしてみて、ああ〜そういうことなのか!となることもしばしば
アイテム機能の不具合● アイテムが押せなくなるというお問い合わせが複数件あった● 一度発生するといったんライブを出ないと解消されない● 通信エラー起因で発生している可能性
既存実装の不具合調査でやったこと● 実装を読んでもパッと原因はわからない● リファクタリングでユニットテストを実装できるようになっていたので、各APIリクエストでエラーが発生するパターンを追加
既存実装の不具合調査でやったこと● 実装を読んでもパッと原因はわからない● リファクタリングでユニットテストを実装できるようになっていたので、各APIリクエストでエラーが発生するパターンを追加結果がおかしいやつがある! 原因を特定して修正
既存実装の不具合調査でやったこと● 実装を読んでもパッと原因はわからない● リファクタリングでユニットテストを実装できるようになっていたので、各APIリクエストでエラーが発生するパターンを追加不具合の再現テスト
自動テストに何を助けられた?● 不具合の原因特定を助けてもらった○ あやしいケースのテストを書いてOK/NGを確認● もう1つ別の要因でアイテムが利用できなくなる不具合の問い合わせもあったが、そちらもユニットテストで再現 → 修正
機能改修時に実装した自動テスト● 動作するか不安を感じる部分● 手動で動作確認をするのが面倒な部分
動作するか不安を感じる部分● 処理がそこそこ複雑なところ● RxJavaであれこれやっているところ● 自分は初歩的なミスをしやすいので、そこまで複雑でなくても条件分岐が複数あるところ
手動で動作確認をするのが面倒な部分● 様々なデータパターンで確認したいところ● 連続する処理の中でピンポイントに動作をみたいところ● 時間経過によって処理が変わるところ● 状況を作り出すのが面倒なところ
実装したテストを具体的に● 例:アイテムのダウンロード処理○ ファイルの解凍と保存○ 素材がDL済みの場合のスキップ処理○ 素材が変更された場合のファイル更新処理○ ダウンロードが並列で走るときの排他制御○ 一定期間使用されなかった素材の削除処理
自動テストに何を助けられた?● 動作するか不安な気持ちを払拭できた● 手動で動作確認するコストを減らせた● 機能改修の中で再度修正を入れることがあっても安心感を持って修正できた
自動テストに何を助けられた?● 動作するか不安な気持ちを払拭できた● 手動で動作確認するコストを減らせた● 機能改修の中で再度修正を入れることがあっても安心感を持って修正できた精神的な治安を維持できた
自動テストに何を助けられた?● 動作するか不安な気持ちを払拭できた● 手動で動作確認するコストを減らせた● 機能改修の中で再度修正を入れることがあっても安心感を持って修正できた良い開発体験を得られた自分にとっては一番大きなモチベーション精神的な治安を維持できた
自動テストに助けられたこと まとめ1. 既存実装のリファクタリング⇢ 振る舞いの理解を助けてもらった2. アイテム機能の不具合修正⇢ 不具合の原因特定を助けてもらった3. 新仕様への改修⇢ 精神的な治安を維持しながら開発ができた
いくつかの観点で自問自答
Q.自動テストで発見できなかった不具合はあった?
A.あった
自動テストで見つけられなかった不具合● 認識ずれ● 観点の見落とし● スレッドの設定ミス● リファクタリングがやりきれなくて、自動テスト書けるはずなのに書けていない箇所
自動テストで見つけられなかった不具合● 認識ずれ● 観点の見落とし● スレッドの設定ミス● リファクタリングがやりきれなくて、自動テスト書けるはずなのに書けていない箇所もっと自動テストが活用できた部分
Q.開発していて不安に感じることが少ない場合は?
A.そういうときもあるチームですり合わせはしたほうがよさそう
開発していて不安に感じない問題● 不安に感じるレベルは人それぞれ○ ズレを感じる場面はしばしばある● PRレビューでも不安を感じたら提案して不安感のすり合わせをするのがよさそう○ 動作する自動テストがあるとレビュアーも安心できる
Q.QAでも不安は払拭できるのでは?
A.できるただ、自分が不安なパスを通るとは限らない
QAと自動テスト● E2Eかつ手動の検証だと特定のケースを発生させるのが難しい場合がある● 内部の処理がどうなっているかをよく知っている人による動作確認も重要
Q.自動テストを実装するのは時間がかかる?
A.かかった
自動テストの実装に時間がかかる問題● テストコード上での設定ミスに気が付かず時間を浪費してしまい断念しそうになった● 自動テストをあきらめた場合の正常系〜異常系の動作確認のコストを鑑みてテストコードのデバッグを続けた
自動テストの実装に時間がかかる問題● テストコード上での設定ミスに気が付かず時間を浪費してしまい断念しそうになった● 自動テストをあきらめた場合の正常系〜異常系の動作確認のコストを鑑みてテストコードのデバッグを続けた一時的に時間がかかるけど、短期的に見てもその分のコストがペイすると踏んだ
まとめ
まとめ● 自動テストで見つけられない不具合はあるが、それでも自動テストはいいものだった● 自動テストはいいものと感じられたのは、マイナスの気持ちを自動テストを通じて払拭できたのが大きい
宣伝
Androidエンジニアの採用始まりました● PocochaではAndroidエンジニアを募集中○ ライブ配信サービスや技術に興味あるかたよかったら是非に○ https://career.dena.jp/job.phtml?job_code=1573
ご清聴ありがとうございました!