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
新規アプリの単体テスト戦略 / unit_tests_strategy_of_new_app
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
uhooi
October 28, 2022
Programming
1.1k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
新規アプリの単体テスト戦略 / unit_tests_strategy_of_new_app
iOS Test Online
https://testonline.connpass.com/event/261910/
uhooi
October 28, 2022
More Decks by uhooi
See All by uhooi
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
160
アウトプットはいいぞ / output_iizo
uhooi
0
200
snacks.nvim内のセットアップ不要なプラグインを紹介 / introduce_snacks_nvim
uhooi
3
2.1k
Develop iOS apps with Neovim / vimconf_2024
uhooi
2
920
暴走のウホーレン 〜想いってのはvimrcにしないと伝わらないんだぜ〜 / iosdc_japan_2024
uhooi
1
720
SwiftLintのカスタムルールを作るための正規表現入門 / swiftlint_regex
uhooi
1
290
最古の関数型言語「Lisp」ことはじめ / lisp_in_kamiyama
uhooi
1
440
会社PCでrm -rf ~した話 / rm_rf_choron
uhooi
18
24k
クソアプリを作ってみた💩 / kusojaku
uhooi
0
720
Other Decks in Programming
See All in Programming
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
5
3.2k
setup-vp GitLab対応の裏側
naokihaba
0
110
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
410
SREの越境 / SRE Collaboration
y0hgi
2
220
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
150
Building an Out-of-Order CPU
latte72
1
780
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
210
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
280
Jetpack Compose メカニズム
skydoves
0
440
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.8k
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
280
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
Skip the Path - Find Your Career Trail
mkilby
1
230
Paper Plane (Part 1)
katiecoart
PRO
2
11k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
510
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Rails Girls Zürich Keynote
gr2m
96
14k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Why Our Code Smells
bkeepers
PRO
340
58k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Transcript
新規アプリの 単体テスト戦略 2022.10.28(Fri) iOS Test Online @the_uhooi
iOS app developer @uhooi @uhooi @the_uhooi
入社前の会話 新規アプリ作って!
入社前の会話 新規アプリ作って! はい!
ウホーイ入社 ウホーイ 入社
・UI: フル SwiftUI ・リアクティブ: Combine ・非同期処理: Swift Concurrency (async/await) ・アーキテクチャ:
MVVM ・その他: SwiftPM によるマルチモジュール、KMM ※開発中なので変更される可能性が大いにあります。 新規アプリの技術選定
最初に考えた単体テストの戦略
できる限り にする 単体テストが不要な設計 最初に考えた単体テストの戦略
できる限り にする 単体テストが不要な設計 必要な にする 単体テストを書きやすい設計 最初に考えた単体テストの戦略
01 単体テストが な 設計にする 不要
アーキテクチャ(MVVM) View View Model UseCase KMM
単体テストを書く層を明文化する View View Model UseCase KMM : 単体テストを書かない : 必要に応じて単体テストを書く
: 単体テストを書く
View 層の単体テストを書かない理由 UI/UX を確認するため、 必ず から 手動でテストを行う
どうしたら View 層から単体テストをなくせる? View View Model UseCase KMM : 単体テストを書かない
: 必要に応じて単体テストを書く : 単体テストを書く
ロジックを減らせば単体テストも減らせる View View Model UseCase KMM 少なくしたい 多くする : 単体テストを書かない
: 必要に応じて単体テストを書く : 単体テストを書く View 層からロジックを なくすのが理想 ロジック
ロジックを減らすには? ロジックを減らすには?
分岐をなくせばロジックを減らせる ロジックを減らすには? 分岐 をなくす (if 文や switch 文)
View に分岐がある(Before) // Before // View 層 if viewModel.uiState.isLoading {
Text("ロード中です。") } else { Text("ロードが完了しました。") }
View から分岐をなくす(After) // After // View 層 Text(viewModel.uiState.loadingText) // ViewModel
層 var loadingText: String { isLoading ? "ロード中です。" : "ロードが完了しました。" }
View から分岐をなくす(After) // After // View 層 Text(viewModel.uiState.loadingText) // ViewModel
層 var loadingText: String { isLoading ? "ロード中です。" : "ロードが完了しました。" } View 層の分岐を ViewModel 層に寄せる
それでも View から分岐は完全にはなくせない // View 層 struct MonstersView: View {
var body: some View { if viewModel.uiState.monsters.isEmpty { EmptyMonsterListView() } else { MonsterListView(monsters: viewModel.uiState.monsters) } } }
それでも View から分岐は完全にはなくせない // View 層 struct MonstersView: View {
var body: some View { if viewModel.uiState.monsters.isEmpty { EmptyMonsterListView() } else { MonsterListView(monsters: viewModel.uiState.monsters) } } } View の出し分けなどの 分岐はなくせない
それでも View から分岐は完全にはなくせない // View 層 struct MonstersView: View {
var body: some View { if viewModel.uiState.monsters.isEmpty { EmptyMonsterListView() } else { MonsterListView(monsters: viewModel.uiState.monsters) } } } View の出し分けなどの 分岐はなくせない monsters が空のときの UI の確認が手間
そこでプレビュー そこでプレビュー
Xcode 上で SwiftUI の View を確認できる
「UI を確認するだけの手動テスト」をなくせる プレビューでは ・端末のサイズ ・ライト / ダークモード ・データの最小 / 最大値
・エラー時の View etc... 様々な状態をかんたんに作り出せる
02 単体テストを 設計にする 書きやすい
ViewModel 層以下の単体テストを書きやすくしたい View View Model UseCase KMM : 単体テストを書かない :
必要に応じて単体テストを書く : 単体テストを書く
UI フレームワークを View 層のみでインポートする View View Model UseCase KMM SwiftUI
Combine : 単体テストを書かない : 必要に応じて単体テストを書く : 単体テストを書く View 層のみで UI を完結させる
UI フレームワークを View 層のみでインポートする View View Model UseCase KMM SwiftUI
Combine : 単体テストを書かない : 必要に応じて単体テストを書く : 単体テストを書く ViewModel 層以下がロジックに集中でき、 単体テストが書きやすくなる
Task があると単体テストしにくい(Before) // Before // ViewModel 層 struct FooViewModel: ObservableObject
{ func didTapLoginButton() { Task { await login() } } }
Task があると単体テストしにくい(Before) // Before // ViewModel 層 struct FooViewModel: ObservableObject
{ func didTapLoginButton() { Task { await login() } } } ログイン処理を待たずに テストが終了してしまう
ViewModel 層のメソッドを非同期にする(After) // After // ViewModel 層 struct FooViewModel: ObservableObject
{ func didTapLoginButton() async { await login() } }
ViewModel 層のメソッドを非同期にする(After) // After // ViewModel 層 struct FooViewModel: ObservableObject
{ func didTapLoginButton() async { await login() } } 非同期にすると 並行処理もしやすくなる
Task を View 層に書く(After) // After // View 層 struct
FooView: View { // ... Task { await viewModel.didTapLoginButton() } // ... }
ちなみに…
ちなみに… まだ単体テストを書いていません これから書きます!
03 まとめ
まとめ 設計を工夫することで、 、 できる 不安定な単体テストを減らし 安定した単体テストを書きやすく
まとめ View View Model UseCase KMM UI ロジック Task 単体テストしにくい
単体テストしやすい
まとめ View View Model UseCase KMM 単体テストしにくい・しやすいものを 分離し、単体テストする層を明確にする UI ロジック
Task 単体テストしにくい 単体テストしやすい
まとめ View View Model UseCase KMM UI ロジック Task 単体テストを書かない層(View
層)は プレビューや手動テストで品質を担保する 単体テストしにくい 単体テストしやすい