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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hideaki Tamai
October 14, 2020
Programming
2.4k
1
Share
iOS版KyashにMock Frameworkを導入した話 / Introducing Kyash iOS Test Cases 2020
Hideaki Tamai
October 14, 2020
More Decks by Hideaki Tamai
See All by Hideaki Tamai
スタブを活用したデバッグメニュー / Debug Menu Using Stubs
tamadon
0
130
クロスグレードの実装とつらみの話
tamadon
3
1.2k
Optional(2018)年...その後
tamadon
3
1.1k
子育てエンジニアを支える技術
tamadon
3
6.5k
自作育児サポートアプリのその後
tamadon
1
2.3k
子育てエンジニアの家庭内生存戦略
tamadon
5
2.7k
ジモティー紹介
tamadon
0
1.3k
ジモティーのSEO
tamadon
0
1.5k
Other Decks in Programming
See All in Programming
Rethinking API Platform Filters
vinceamstoutz
0
4.2k
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
130
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
160
Ruby and LLM Ecosystem 2nd
koic
1
1.4k
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
180
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
110
The free-lunch guide to idea circularity
hollycummins
0
390
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.7k
2026-03-27 #terminalnight 変数展開とコマンド展開でターミナル作業をスマートにする方法
masasuzu
0
260
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
220
存在論的プログラミング: 時間と存在を記述する
koriym
5
690
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
160
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
160
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.4k
Thoughts on Productivity
jonyablonski
75
5.1k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
330
Testing 201, or: Great Expectations
jmmastey
46
8.1k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Odyssey Design
rkendrick25
PRO
2
560
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
230
Joys of Absence: A Defence of Solitary Play
codingconduct
1
330
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
460
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
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