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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
t.goda
April 22, 2022
Technology
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
XCTestでAPIのテストコードを書く
MockingJayを利用してXCTestでのAPIテスト
t.goda
April 22, 2022
More Decks by t.goda
See All by t.goda
Distribute Binary Framework with Swift Package Manager
nivisunder7
0
130
App Clipについて
nivisunder7
1
81
Swift5.0 ABI安定化について
nivisunder7
0
390
SwiftUIの紹介
nivisunder7
0
42
Watch Kitのはまりどころ
nivisunder7
0
62
Docker in Docker Tips
nivisunder7
0
62
iOS11のここが素晴らしい
nivisunder7
0
86
iPhoneX時代のレイアウト
nivisunder7
0
100
SpriteKitでゲーム開発
nivisunder7
0
120
Other Decks in Technology
See All in Technology
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
11
4.1k
AI時代のPlaywright活用(システムテストを自動化する ー 実行エンジンにPla ywrightを選んだ理由)
ynisqa1988
1
830
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
0
550
穢れた技術選定について
watany
18
5.8k
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
500
ゴールデンパスは敷いただけでは道にならない ─ 企画部門のエンジニアが技術標準を事業価値に変えるまで
mhrtech
1
240
マルチアカウント環境でSecurity Hubの運用、その後どうなった? / SRE NEXT 2026 miniLT会
genda
0
110
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
120
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
270
Type-safe IaC for Dart
coborinai
0
170
「早く出す」より「事業に効く」 ── 顧客の業務サイクルから逆算するAI時代の二重ループ開発と「変化の設計者」 / devsumi2026
rakus_dev
1
510
複数プロダクトで進めるAI機能実装 ── 実践から得たリアルな学びとロードマップ実現への挑戦 / AICon2026_yanari
rakus_dev
0
230
Featured
See All Featured
Everyday Curiosity
cassininazir
0
260
Into the Great Unknown - MozCon
thekraken
41
2.6k
BBQ
matthewcrist
89
10k
Practical Orchestrator
shlominoach
191
11k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
360
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Scaling GitHub
holman
464
140k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Facilitating Awesome Meetings
lara
57
7k
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さえ作れればこっちのもんでござる