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
XCTestでAPIのテストコードを書く
Search
t.goda
April 22, 2022
Technology
0
380
XCTestでAPIのテストコードを書く
MockingJayを利用してXCTestでのAPIテスト
t.goda
April 22, 2022
Tweet
Share
More Decks by t.goda
See All by t.goda
Distribute Binary Framework with Swift Package Manager
nivisunder7
0
120
App Clipについて
nivisunder7
1
68
Swift5.0 ABI安定化について
nivisunder7
0
330
SwiftUIの紹介
nivisunder7
0
32
Watch Kitのはまりどころ
nivisunder7
0
55
Docker in Docker Tips
nivisunder7
0
57
iOS11のここが素晴らしい
nivisunder7
0
80
iPhoneX時代のレイアウト
nivisunder7
0
92
SpriteKitでゲーム開発
nivisunder7
0
110
Other Decks in Technology
See All in Technology
OSSのSNSツール「Misskey」をさわってみよう(右下ワイプで私のOSCの20年を振り返ります) / 20250705-osc2025-do
akkiesoft
0
160
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
190
面倒な作業はAIにおまかせ。Flutter開発をスマートに効率化
ruideengineer
0
260
CRE Camp #1 エンジニアリングを民主化するCREチームでありたい話
mntsq
1
120
AI時代の開発生産性を加速させるアーキテクチャ設計
plaidtech
PRO
3
160
american airlines®️ USA Contact Numbers: Complete 2025 Support Guide
supportflight
1
110
united airlines ™®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedhelp
1
320
Tokyo_reInforce_2025_recap_iam_access_analyzer
hiashisan
0
190
AI専用のリンターを作る #yumemi_patch
bengo4com
5
4.3k
AWS認定を取る中で感じたこと
siromi
1
190
Lakebaseを使ったAIエージェントを実装してみる
kameitomohiro
0
120
事業成長の裏側:エンジニア組織と開発生産性の進化 / 20250703 Rinto Ikenoue
shift_evolve
PRO
2
21k
Featured
See All Featured
Designing for Performance
lara
610
69k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Six Lessons from altMBA
skipperchong
28
3.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Practical Orchestrator
shlominoach
189
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Transcript
XCTestでAPIをテストする 2022/04/22
長年やれと言われていた • 某アプリケーションの単体テスト • 重要な機能の単体テストはコーディングしていた • APIに関連するテストは行っていなかった • 何故? •
どうやるのか考えたことなかった • スタブ作んなきゃいけない • Response Handlingの処理が某アプリではめんどくさい実装になってる • Delegate使って処理を委譲してるため • >ライブラリいれて実装したりする必要がある • それらによってなんか怖い、めんどくさいという思い
APIのテストコードを書かなければ • 次回から単体テストの強化が必須事項 • あと自分の心理的な安全性を保つため • 技術的な関心 •時間があった
どう実装するのか • XcodeのプロジェクトにはデフォルトでXCTestがある • XCTest • Swift、Objective-Cで利用できるテストフレーム • Create and
run unit tests, performance tests, and UI tests for your Xcode project. • らしい • 今回はXCTestを利用する
ライブラリの選定 • Mockingjay • Swift向けHTTPリクエストのスタブを作成してくれるライブラリ • NSURLConnectionを利用していること前提 • AlamoFireというライブラリを利用しているが、こいつはNSURLConnection使ってる ので問題ない
• https://github.com/kylef/Mockingjay
罠その1 • Swift5だとビルドとおんない • は???? • コードの書き換えが必要 • 修正PRはマージされているが、そのバージョンがreleaseされてない •
なんでやねん!!!!
実装する stub(http(.get, uri: https://~~, json(profile)) と wait(for: [exp!], timeout: 10)
が今回のキモ
スタブを作成する • stub(_ matcher: @escaping Matcher, delay: TimeInterval? = nil,
_ builder: @escaping Builder) -> Stub • メソッド名からわかるように、スタブ生成メソッド • MatcherにマッチしたHTTP/HTTPS通信をハンドリングして、builderを返却する •すごい!!!!!こいつがほしかっ た!!!
罠その2 • このままだと非同期処理(通信処理)が終わる前にテストがおわるので ウェイトをかける • wait(for expectations: [XCTestExpectation], timeout seconds:
TimeInterval) • timeoutまでウェイトをかけるメソッド • expectationsは、このパラメーターがfulfillされるのを待つ
実装する2 • レスポンスを受ける側 キモ: exp!.fulfill()とlatestVersionの中身
罠その3 • XCTtestにこの辺を入れたあと通常ビルドすると起動時にクラッシュする • 原因 • MockingJayを通常の方のビルド環境にいれると死ぬ • テスト用ライブラリだかららしい •
Rx系のテストツールでそういうことがあるというのを見つけたので試したら動いた
まとめ • 自力でAPI周りの単体テストはめんどくさい • でもXCTestを利用してAPIのテストをすることはできる • ライブラリを利用してよりより単体テストライフを • Stubさえ作れればこっちのもんでござる