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
410
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
130
App Clipについて
nivisunder7
1
72
Swift5.0 ABI安定化について
nivisunder7
0
380
SwiftUIの紹介
nivisunder7
0
36
Watch Kitのはまりどころ
nivisunder7
0
57
Docker in Docker Tips
nivisunder7
0
58
iOS11のここが素晴らしい
nivisunder7
0
80
iPhoneX時代のレイアウト
nivisunder7
0
97
SpriteKitでゲーム開発
nivisunder7
0
110
Other Decks in Technology
See All in Technology
AIエージェント、 社内展開の前に知っておきたいこと
oracle4engineer
PRO
2
150
1GB RAMのラズピッピで何ができるのか試してみよう / 20260319-rpijam-1gb-rpi-whats-possible
akkiesoft
0
190
The_Evolution_of_Bits_AI_SRE.pdf
nulabinc
PRO
0
240
プラットフォームエンジニアリングはAI時代の開発者をどう救うのか
jacopen
7
3.8k
システム標準化PMOから ガバメントクラウドCoEへ
techniczna
1
120
S3はフラットである –AWS公式SDKにも存在した、 署名付きURLにおけるパストラバーサル脆弱性– / JAWS DAYS 2026
flatt_security
0
1.8k
バクラク最古参プロダクトで重ねた技術投資を振り返る
ypresto
0
170
AWS CDK「読めるけど書けない」を脱却するファーストステップ
smt7174
3
160
Sansanでの認証基盤内製化と移行
sansantech
PRO
0
550
情シスのための生成AI実践ガイド2026 / Generative AI Practical Guide for Business Technology 2026
glidenote
0
280
Cortex Code CLI と一緒に進めるAgentic Data Engineering
__allllllllez__
0
410
ReactのdangerouslySetInnerHTMLは“dangerously”だから危険 / Security.any #09 卒業したいセキュリティLT
flatt_security
0
300
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
WCS-LA-2024
lcolladotor
0
480
Why Our Code Smells
bkeepers
PRO
340
58k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
190
Designing for Performance
lara
611
70k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
460
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
470
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
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さえ作れればこっちのもんでござる