Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS版KyashにMock Frameworkを導入した話 / Introducing Ky...
Search
Hideaki Tamai
October 14, 2020
Programming
1
2.1k
iOS版KyashにMock Frameworkを導入した話 / Introducing Kyash iOS Test Cases 2020
Hideaki Tamai
October 14, 2020
Tweet
Share
More Decks by Hideaki Tamai
See All by Hideaki Tamai
クロスグレードの実装とつらみの話
tamadon
3
1.1k
Optional(2018)年...その後
tamadon
3
1k
子育てエンジニアを支える技術
tamadon
3
6k
自作育児サポートアプリのその後
tamadon
1
2.1k
子育てエンジニアの家庭内生存戦略
tamadon
5
2.6k
ジモティー紹介
tamadon
0
1.2k
ジモティーのSEO
tamadon
0
1.4k
Other Decks in Programming
See All in Programming
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
4
640
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
120
みんなでプロポーザルを書いてみた
yuriko1211
0
260
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
as(型アサーション)を書く前にできること
marokanatani
10
2.6k
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
イベント駆動で成長して委員会
happymana
1
320
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.3k
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
290
Macとオーディオ再生 2024/11/02
yusukeito
0
370
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
The Cult of Friendly URLs
andyhume
78
6k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Writing Fast Ruby
sferik
627
61k
Unsuck your backbone
ammeep
668
57k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
RailsConf 2023
tenderlove
29
900
Site-Speed That Sticks
csswizardry
0
23
Typedesign – Prime Four
hannesfritz
40
2.4k
Transcript
玉井秀明 @tamadon 2020/10/14(水) iOS Test Tea Time #1 iOS版 Kyashに
Mock Frameworkを 導入した話
@tamadon @tamadon3776 ・2020/01 Kyash入社。iOSチームのテックリードをしています ・マジック:ザ・ギャザリングというカードゲームをかれこれ 20年以上プレイしています
Kyashの説明
• Visaブランドで発行されるプリペイドカードを簡単に作れる • チャージ元として以下が利用可能 ◦ 銀行口座 ◦ クレジットカード ◦ セブン銀行ATM
◦ など
Kyashのアーキテクチャについて
MVVM+Router Presentation Layer Domain Layer Data Layer API Repository UseCase
ViewModel Router ViewController UserDefaults KeyChain 画面遷移を管理
テスト方針について
ViewModelを優先的に ・ビジネスロジックがViewModelに集中している ・ロジックが肥大化しやすい→バグが起きやすい
何をテストするか?① • Observable、BehaviorRelay、Driverに期待するイベントが流れ てくるか ◦ Binding ◦ 通信状態の監視 ◦ フォーム入力時のバリデーション
◦ etc...
何をテストするか?② • 期待するmethodが呼ばれるか ◦ UseCaseの呼び出し • レスポンスは期待通りか ◦ TableView/CollectionViewのDataSource ▪
DataSourceの実装をViewModelで行っているため
func testFoo() { /// Given StubとViewModelのセットアップ /// When ViewModelのメソッド呼び出し ///
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アノテーションを付けてプロトコルを定義 /// @mockable public 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 = 0 var underlyingNum: Int = 0 ・・・
mockoloの使い方③ GenerateされたMockクラスを呼んでXCTAsertで評価する func testMock() { let mock = FooMock(num: 5)
XCTAssertEqual(mock.numSetCallCount, 1) mock.barHandler = { arg in return String(arg) } XCTAssertEqual(mock.barCallCount, 1) }
詳しくは公式のリポジトリを参照ください https://github.com/uber/mockolo
今後の展望 • カバレッジの拡充 ◦ 導入していくつかのViewModelのテストを書いた状態 • ノウハウの共有 ◦ 試行錯誤中なので知見が溜まったらまた発表したい
Thank you 25