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.2k
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
1.1k
子育てエンジニアを支える技術
tamadon
3
6.2k
自作育児サポートアプリのその後
tamadon
1
2.2k
子育てエンジニアの家庭内生存戦略
tamadon
5
2.6k
ジモティー紹介
tamadon
0
1.2k
ジモティーのSEO
tamadon
0
1.4k
Other Decks in Programming
See All in Programming
Live Coding: Migrating an Application to Signals
manfredsteyer
PRO
0
130
マイコンでもRustのtestがしたい/KernelVM Kansai 11
tnishinaga
1
960
Rubyの!メソッドをちゃんと理解する
alstrocrack
2
380
バイラテラルアップサンプリング
fadis
3
650
Serving TUIs over SSH with Go
caarlos0
0
810
generative-ai-use-cases(GenU)の推しポイント ~2025年4月版~
hideg
1
440
クラシルリワードにおける iOSアプリ開発の取り組み
funzin
1
420
CursorとDevinが仲間!?AI駆動で新規プロダクト開発に挑んだ3ヶ月を振り返る / A Story of New Product Development with Cursor and Devin
rkaga
5
1.4k
技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt
yoshiyoshifujii
0
120
Cloudflare Workersで進めるリモートMCP活用
syumai
12
1.7k
AI Coding Agents Enablement in TypeScript
yukukotani
12
2.4k
リアーキテクチャの現場で向き合う 既存サービスの読み解きと設計判断
ymiyamu
0
150
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1370
200k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.7k
Gamification - CAS2011
davidbonilla
81
5.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
14
860
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
810
A better future with KSS
kneath
239
17k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Six Lessons from altMBA
skipperchong
28
3.8k
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