玉井秀明 @tamadon2020/10/14(水)iOS Test Tea Time #1iOS版 KyashにMock Frameworkを導入した話
View Slide
@tamadon@tamadon3776・2020/01 Kyash入社。iOSチームのテックリードをしています・マジック:ザ・ギャザリングというカードゲームをかれこれ20年以上プレイしています
Kyashの説明
● Visaブランドで発行されるプリペイドカードを簡単に作れる● チャージ元として以下が利用可能○ 銀行口座○ クレジットカード○ セブン銀行ATM○ など
Kyashのアーキテクチャについて
MVVM+RouterPresentation Layer Domain Layer Data LayerAPIRepositoryUseCaseViewModelRouterViewControllerUserDefaultsKeyChain画面遷移を管理
テスト方針について
ViewModelを優先的に・ビジネスロジックがViewModelに集中している・ロジックが肥大化しやすい→バグが起きやすい
何をテストするか?①● Observable、BehaviorRelay、Driverに期待するイベントが流れてくるか○ Binding○ 通信状態の監視○ フォーム入力時のバリデーション○ etc...
何をテストするか?②● 期待するmethodが呼ばれるか○ UseCaseの呼び出し● レスポンスは期待通りか○ TableView/CollectionViewのDataSource■ DataSourceの実装をViewModelで行っているため
func testFoo() {/// GivenStubとViewModelのセットアップ/// WhenViewModelのメソッド呼び出し/// Then値の評価}実装イメージ
Mock Frameworkについて
下記理由から必要と判断● UseCaseが100以上あるので1つずつMockを書くのも大変● UseCaseの実装が変わるたびにMockを修正するのも大変○ 自動でGenerateされるようにしたい
iOS Mock Frameworkの比較※2020.08 時点● 条件○ Swiftで書かれている○ ドキュメント等の情報が豊富
GitHub上の情報Name Size Star 開発時期 メンテナンスmockolo 716KB 242 2019.01~ それなりに活発Cuckoo 2.28MB 1.3K 2016.10~ それなりに活発Mockit 230KB 107 2016.05~ あまり活発ではないSwiftyMocky 17.59MB 694 2017.05~ それなりに活発
mockoloを採用することにした● 生成されたMockは最低限必要なものだけなのでシンプルで見やすい○ それぞれのMethod用にHandlerが追加されるだけ● 軽量で高パフォーマンス● Class mockはできないがiOS版Kyashは全てProtocol化しているので問題ない
他Frameworkの検討結果①※個人の感想です● Cuckoo/Mockit○ DSLなので学習コストが高い○ テストの書き方がFramework依存
他Frameworkの検討結果②※個人の感想です● SwiftMocky○ あまり良く見ていないのですが、Given, Verify, Performという大文字始まりのメソッドに違和感があり見送り
mockoloの使い方
mockoloの使い方①@mockableアノテーションを付けてプロトコルを定義/// @mockablepublic protocol Foo {var num: Int { get set }func bar(arg: Float) -> String}mockoloコマンドを実行
mockoloの使い方②こんな感じのファイルが Generateされるpublic class FooMock: Foo {init() {}init(num: Int = 0) {self.num = num}var numSetCallCount = 0var underlyingNum: Int = 0・・・
mockoloの使い方③GenerateされたMockクラスを呼んでXCTAsertで評価するfunc testMock() {let mock = FooMock(num: 5)XCTAssertEqual(mock.numSetCallCount, 1)mock.barHandler = { arg inreturn String(arg)}XCTAssertEqual(mock.barCallCount, 1)}
詳しくは公式のリポジトリを参照くださいhttps://github.com/uber/mockolo
今後の展望● カバレッジの拡充○ 導入していくつかのViewModelのテストを書いた状態● ノウハウの共有○ 試行錯誤中なので知見が溜まったらまた発表したい
Thank you25