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
280
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
82
App Clipについて
nivisunder7
1
56
Swift5.0 ABI安定化について
nivisunder7
0
230
SwiftUIの紹介
nivisunder7
0
27
Watch Kitのはまりどころ
nivisunder7
0
48
Docker in Docker Tips
nivisunder7
0
50
iOS11のここが素晴らしい
nivisunder7
0
76
iPhoneX時代のレイアウト
nivisunder7
0
86
SpriteKitでゲーム開発
nivisunder7
0
110
Other Decks in Technology
See All in Technology
Reducing Cross-Zone Egress at Spotify with Custom gRPC Load Balancing Recap
koh_naga
0
210
Postman v10リリース後を振り返る / Looking back at Postman v10 after release
yokawasa
1
160
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
4
16k
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
620
Google Cloud Next '24 Recap(Cloud Run/k8s)
mokocm
0
260
JSON攻略法.pdf
miyakemito
8
5.1k
オーナーシップを持つ領域を明確にする
konifar
13
3.2k
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
web-application-security
matsuihidetoshi
0
180
推しは推せるときに推せ! プロダクトにフィードバックしていこう
nakasho
0
410
ルーターでプレゼンする
puhitaku
0
1.3k
MixIT 2024 - Pulumi : Gérer son infra avec son langage de programmation préféré
ju_hnny5
0
110
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
422
63k
Rails Girls Zürich Keynote
gr2m
91
13k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
How to Ace a Technical Interview
jacobian
272
22k
Designing for humans not robots
tammielis
248
25k
Teambox: Starting and Learning
jrom
128
8.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
20
1.9k
Raft: Consensus for Rubyists
vanstee
132
6.3k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
Gamification - CAS2011
davidbonilla
76
4.6k
Facilitating Awesome Meetings
lara
42
5.6k
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さえ作れればこっちのもんでござる