Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
iOS版KyashにMock Frameworkを導入した話 / Introducing Ky...
Search
Hideaki Tamai
October 14, 2020
Programming
2.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
150
クロスグレードの実装とつらみの話
tamadon
3
1.2k
Optional(2018)年...その後
tamadon
3
1.2k
子育てエンジニアを支える技術
tamadon
3
6.5k
自作育児サポートアプリのその後
tamadon
1
2.3k
子育てエンジニアの家庭内生存戦略
tamadon
5
2.8k
ジモティー紹介
tamadon
0
1.4k
ジモティーのSEO
tamadon
0
1.6k
Other Decks in Programming
See All in Programming
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
370
Workers Cache を知る
syumai
0
320
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.3k
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
110
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
330
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
270
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.7k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.4k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
160
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
Featured
See All Featured
Design in an AI World
tapps
1
340
Visualization
eitanlees
153
17k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Designing for Performance
lara
611
70k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
330
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
How to build a perfect <img>
jonoalderson
1
6.1k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Deep Space Network (abreviated)
tonyrice
0
350
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
310
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