Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

テストコードの観点から見たSansanのアーキテクチャ変遷

 テストコードの観点から見たSansanのアーキテクチャ変遷

■ イベント
モバイルアプリ開発における良いテストコードの考え方
https://trident-qa.connpass.com/event/320151/

■ 発表者
Mobile Applicationグループ
原田 拓眞

■ Android エンジニア採用情報
https://media.sansan-engineering.com/android-engineer

■ iOS エンジニア採用情報
https://media.sansan-engineering.com/ios-engineer

SansanTech

June 26, 2024
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 Sansan株式会社 技術本部 Mobile Applicationグループ 原⽥拓眞 - 2014年Sansan株式会社新卒⼊社 - 当初はC#/.NET

    FrameworkのWebエンジニア (WinFormsやWPFも触った) - 2018年末頃からAndroidに転向 - 当時kotlin書いた経験無し - 最近⽝を飼い始めました。
  2. 『単体テストの考え⽅/使い⽅(Vladimir Khorikov著)』によれば、 単体テストの⽬的は「ソフトウェア開発プロジェクトの成⻑を持続可能なものにする」で ある。 具体的には以下の4柱が満たられていることとされる。 - 退⾏(regression)に対する保護 - コードを変更した時のバグの発⾒しやすさ -

    コードの複雑さやビジネスとしての重要度も変数になる - リファクタリングへの耐性 - テストが失敗せずリファクタできる / コードが正しいのにテストが失敗することがない - 迅速なフィードバック - テストにかかる時間が短い - 保守のしやすさ - テストの読みやすさ / テストの実⾏のしやすさ 良いテストコード(ユニットテスト)
  3. - MVPアーキテクチャ - Viewは、UI表⽰とUIの⼊出⼒ - Presenterは、画⾯ロジック - Modelは、ビジネスロジックやAPI, DBのデータ取得 -

    2017年のアプリリニューアル時のアーキテクチャ Sansan Androidアプリのアーキテクチャ(⼀代⽬) Model View Presenter User event Request Update UI Result
  4. - PresenterのテストにStub的なMockが多くて⾟い - Model-View間を繋いでいるので関わるクラスが多い - MockしているクラスのIFや実装を変えたとき、Mock側も対 応しなければならないのでMockが多いと⾟い - 状態管理の定義が曖昧 -

    Presenterで持つことも、Viewで持つことも - どこのテストに書かれているのか⾒つけにくい - PresenterやModelのクラスが⼤きくなりやすい - テストクラスも⼤きくなるので可読性が下がる MVP時代の課題(テストコード観点)
  5. - 退⾏(regression)に対する保護 - そもそもバグを起こしやすい構造になっていた - リファクタリングへの耐性 - 低い - 迅速なフィードバック

    - 特筆すべきものはない - 保守のしやすさ - 可読性が低いため良くない 良いテストコードから考えると
  6. - クラスの責務がMVPより明確になった - ActionCreator: Stateを変更するためのActionを作る。 Actionの作成に必要なRepositoryの関数も呼び出す。 - Store: Stateの保持。また、Actionの通知を受けてStateを更新 する。

    - View: Storeの保持しているStateを購読し、画⾯表⽰する。 - 責務が明確なので、どんなテストがどこに書かれているかも想像 しやすい - それぞれのクラスが⼩さくなった Fluxになったことで解決した課題(テストコード観点)
  7. - 責務が明確になり - 退⾏(regression)に対する保護 > 重要なロジックにテストを集中しやすくなった - リファクタリングへの耐性 > 余計なStubが減ったためリファクタしても壊れにくくなった

    - 迅速なフィードバック > テストを書くべきコードに焦点を当てやすく、余計なテス トがない = 全体の実⾏速度は早い - 保守のしやすさ > プロダクションコードもテストコードも書きやすくなった 良いテストコードから考えると
  8. - クラスの責務がさらに明確になり、よりテストしやすくなっ た - 各クラスの責務 - Store: Actionの通知を受け取る、Stateを保持する - StateMachine:

    現在のStateと、Stateの更新に必要な情報 を受け取り新しいStateを返す - ViewPropertyFactory: Stateを元に、画⾯上で扱いやすい 形のオブジェクトを作る(ビューロジック) Flux(⼆代⽬改)で解決した課題(テストコード観点)
  9. - ユニットテスト - 各クラス‧関数をテストするコード - 基本的には書く⽅針 - PRを作るとCIで実⾏もされる(通らないとマージできない) - 結合テスト

    - 開発案件の終了間際、QAチームにより要件‧仕様を満たしている かどうかを⼿動テストする - リグレッションテスト - リリース前に既存機能にデグレが発⽣していないかをテストする - QAチームによる⼿動 + MagicPod Sansanモバイルアプリの「テスト」
  10. - テストのカバレッジは明確には追ってない① - PRに2⼈のレビュアーからApproveを貰う必要がある > テストコードを全く書いてないと指摘される > StateMachineやViewPropertyFactoryのテストはまず 書かれる -

    リリース不具合が少ない > 前Qでリリースしたものでは⼤きな不具合なし > QAチームでの結合テストやリグレッションテストもある > 不具合検知率⾃体もテストケースに対して0.5%程度 (ケース数1803件に対して) Sansanモバイルアプリの「テスト」
  11. After Kotlin Fest 2024 LT Night @Sansan(LT登壇枠あり) - テーマ -

    Kotlinの内容であればなんでもOKのLT会 ▪ Kotlin 2.0の話も予定 - ⽇時 - 2024/07/08 19:00 - - 形式 - オンライン/オフライン併催
  12. - テーマ - モバイルアプリ、モバイルアプリ開発関連ならなんでも ▪ iOS / Android問わず - ⽇時

    - 2024/07/10 19:30 - - 形式 - オンライン/オフライン併催 Sansanモバイル勉強会 vol.1