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
성장하는 iOS 개발자 되기
Search
Suyeol Jeon
February 16, 2021
Programming
270
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
성장하는 iOS 개발자 되기
미리 톺아보는 훌륭한 개발자의 역량
Suyeol Jeon
February 16, 2021
More Decks by Suyeol Jeon
See All by Suyeol Jeon
레거시 프로젝트에서 의존성 주입하기
devxoul
1
2.6k
Let's TDD
devxoul
0
120
Hello, ReactorKit 👋
devxoul
0
130
Build Funnels with Google BigQuery
devxoul
0
80
RxSwift 시작하기
devxoul
1
380
ReactorKit으로 단방향 반응형 앱 만들기
devxoul
0
200
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
devxoul
10
3.3k
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
devxoul
0
140
Other Decks in Programming
See All in Programming
Agents on Rails - Rails at Scale 2026
irinanazarova
0
570
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.6k
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
630
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
830
Jetpack Compose Mechanisms
skydoves
3
830
R8 の設定見直しでアプリサイズ削減
andpad
0
220
Railsバージョンを4倍にした話
optim
0
490
パスワード再設定メールのURLについて知っておこう
uyuki234
0
170
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
sbt 2.0: takeoff
eed3si9n
0
160
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
990
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
340
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
440
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
New Earth Scene 8
popppiees
4
2.7k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
270
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Transcript
ࢿೞח iOS ѐߊ غӝ 🚀 ࣻৌ https://github.com/devxoul
ࣻৌ 2020- Pocket Lesson 2014- StyleShare devxoul
ࢿೞח iOS ѐߊ غӝ 🚀 ܻ ిইࠁח ഴܯೠ ѐߊ
1. పझ 2. CI/CD ۄੋ 3. ೣԋ ࢿೞӝ
1. పझ
1. పझ ݽفо ਃೞҊ ೞ݅ ݽفо ೞҊ ח ঋח Ѫ
ޖਸ పझೡ Ѫੋо
ޖਸ పझೡ Ѫੋо Unit Integration End-to-End
ޖਸ పझೡ Ѫੋо Unit Integration End-to-End ҳݒ җ
ޖਸ పझೡ Ѫੋо Unit Integration End-to-End ࢚ಿ ࢚ࣁ ചݶ
ҳݒ җ
ޖਸ పझೡ Ѫੋо Unit Integration End-to-End ࢚ಿ оѺ ࠭ ࢚ಿ
࢚ࣁ ചݶ ҳݒ җ
ޖਸ పझೡ Ѫੋо Unit Integration End-to-End ࢚ಿ оѺ ࠭ ࢚ಿ
࢚ࣁ ചݶ ҳݒ җ ৈӝࢲࠗఠ ѱ द
పझ ೞӝ ए Ѫࠗఠ
оѺ ನݘఠ զ ನݘఠ Codable ߸ജ String झబ࣌ ... పझ
ೞӝ ए Ѫࠗఠ
оѺ ನݘఠ զ ನݘఠ Codable ߸ജ String झబ࣌ ... పझ
ೞӝ ए Ѫࠗఠ ੑ۱ эਵݶ ۱ э ࢎ٘ ಖо হ
۠ Ѫب Ҷ పझܳ ࢿ೧ঠ ೡө?
۠ Ѫب Ҷ పझܳ ࢿ೧ঠ ೡө? ֎
۠ Ѫب Ҷ పझܳ ࢿ೧ঠ ೡө? ֎ (ࣼ۲ೡ दр ݶ)
۠ Ѫب Ҷ పझܳ ࢿ೧ঠ ೡө? ֎ (ࣼ۲ೡ दр ݶ)
ࣼ೧ח Ѫ ਃ ध ইפۄ ࣼ׳
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView( ) }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView(costPrice: 10000 ) }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView(costPrice: 10000, price: 6000) }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView(costPrice: 10000, price: 6000) XCTAssertEqual( ) }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, ) }
పझܳ ࢿೞ ࠁݶ ਃҳࢎ೦ ݺഛ೧ func testPriceView() { let view
= PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
݅ড ਗоо о৬ эݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =
PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "3,000ਗ") }
݅ড ೡੋਯী ࣗं ࢤӟݶ?
݅ড ೡੋਯী ࣗं ࢤӟݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =
PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
݅ড ೡੋਯী ࣗं ࢤӟݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =
PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
݅ড ೡੋਯী ࣗं ࢤӟݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =
PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
݅ড ೡੋਯী ࣗं ࢤӟݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =
PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
݅ড оо 0ਗۄݶ?
݅ড оо 0ਗۄݶ? func testPriceView_whenPriceIsZero_displaysFree() { let view = PriceView(costPrice:
10000, price: 0) XCTAssertEqual(view.priceLabel.text, "ޖܐ") }
݅ড оо 0ਗۄݶ? func testPriceView_whenPriceIsZero_displaysFree() { let view = PriceView(costPrice:
10000, price: 0) XCTAssertEqual(view.priceLabel.text, "ޖܐ") }
݅ড оо 0ਗۄݶ? func testPriceView_whenPriceIsZero_displaysFree() { let view = PriceView(costPrice:
10000, price: 0) XCTAssertEqual(view.priceLabel.text, "ޖܐ") }
Ӓ۞ ࠁݶ పझ झಖ ҍ ӝמ ݺࣁо ػ
Ӓ۞ ࠁݶ పझ झಖ ҍ ӝמ ݺࣁо ػ func testPriceView_whenNotDiscounted_displaysPriceOnly()
func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
झಖਸ ؊ ݺഛೞѱ ࢿೞҊ रݶ ೠӖ۽ ॳӝ func testPriceView_whenNotDiscounted_displaysPriceOnly() func
testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
झಖਸ ؊ ݺഛೞѱ ࢿೞҊ रݶ ೠӖ۽ ॳӝ func testPriceView__ೡੋغ_ঋ_҃__оѺ݅_दפ() func
testPriceView__ೡੋػ_҃__ೡੋਯҗ_оѺਸ_दפ() func testPriceView__ೡੋػ_҃__߈ৢܿػ_ೡੋਯҗ_оѺਸ_दפ() func testPriceView__оѺ_0ੋ_҃__ޖܐ۽_दפ() func testPriceView_whenNotDiscounted_displaysPriceOnly() func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
оѺ ನݘఠ զ ನݘఠ Codable ߸ജ String झబ࣌ ... పझ
ೞӝ ए Ѫࠗఠ ੑ۱ эਵݶ ۱ э ࢎ٘ ಖо হ
оѺ ನݘఠ զ ನݘఠ Codable ߸ജ String झబ࣌ ... పझ
ೞӝ ए Ѫࠗఠ ੑ۱ эਵݶ ۱ э ࢎ٘ ಖо হ ✅
పझ ೞӝ ए Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эਵݶ
۱ э ࢎ٘ ಖо হ оѺ ನݘఠ զ ನݘఠ Codable ߸ജ String झబ࣌ ... ✅
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эਵݶ ۱ э ࢎ٘ ಖо হ ✅
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эইب ۱ ܰ ࢎ٘ ಖо ࢤӟ ✅
పझ (Test double)
పझ (Test double) http://www.kickvick.com/celebrities-stunt-doubles/
పझ (Test double) https://www.insider.com/movie-tv-superheroes-stunt-doubles-2018-5
పझ (Test double) https://www.reddit.com/r/pics/comments/fqkaq8/tom_cruise_and_his_stunt_double/?utm_source=ifttt
పझ (Test double) Dummy Fake Stub Spy Mock
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock e.g.
۽ ࠭ܳ పझೡ ٸ ֈӝח User ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock e.g.
۽ ࠭ܳ పझೡ ٸ ֈӝח User ѐ e.g. पઁ ఃੋী ೞ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ఃੋ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock e.g.
۽ ࠭ܳ పझೡ ٸ ֈӝח User ѐ e.g. पઁ ఃੋী ೞ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ఃੋ e.g. ܻ ೠ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock e.g.
۽ ࠭ܳ పझೡ ٸ ֈӝח User ѐ e.g. पઁ ఃੋী ೞ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ఃੋ e.g. ܻ ೠ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub e.g. ഐػ ݫࢲ٘ܳ ӝ۾ೞח MFMailComposeViewControllerSpy ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock e.g.
۽ ࠭ܳ పझೡ ٸ ֈӝח User ѐ e.g. पઁ ఃੋী ೞ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ఃੋ e.g. ܻ ೠ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub e.g. ഐػ ݫࢲ٘ܳ ӝ۾ೞח MFMailComposeViewControllerSpy e.g. بೠ ݫࢲ٘о ഐغ ঋਵݶ पಁदఃח ޖо
ઓࢿ ੑ (Dependency Injection)
@KxCafe ☕ ઓࢿ ੑ (Dependency Injection)
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxBar 🍺 ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxBar 🍺 🚫 🚫 ☕ 🍺 !=
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эইب ۱ ܰ ࢎ٘ ಖо ࢤӟ ✅
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эইب ۱ ܰ ࢎ٘ ಖо ࢤӟ ✅
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эইب ۱ ܰ ࢎ٘ ಖо ࢤӟ ✅
֎ਕ ਃ दझమ ۨਕ ࢲ٘౭ ۄ࠳۞ܻ ... పझ ೞӝ ए
Ѫࠗఠ 👉 ؊ ࠂ೧ݶ? ੑ۱ эইب ۱ ܰ ࢎ٘ ಖо ࢤӟ ✅
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() let viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") } ✅
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
ઓࢿ ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let
locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
పझ (Test double) Dummy Fake Stub Spy Mock ۄఠܳ
ӝ ਤ೧ ਃೠ ѐ زೞӟ ೞ݅ పझ݅ਸ ਤ೧ࢲ ٜ݅য ҳഅ ܻ ೠ Ѿҗܳ ߈ജೡ ࣻ ח ҳഅ Stubী ؊೧ࢲ ೣࣻ ഐਸ ӝ۾ೡ ࣻ ח ҳഅ ਗೞח ݫࢲ٘о بೠ ۽ ੜ ഐغחܳ Ѩૐೡ ࣻ ח ҳഅ
TDD (Test Driven Development)
REFACTOR GREEN RED TDD (Test Driven Development)
REFACTOR GREEN RED TDD (Test Driven Development) पಁೞח పझࠗఠ ࢿ
REFACTOR GREEN RED TDD (Test Driven Development) पಁೞח పझࠗఠ ࢿ
పझܳ ాҗೞח ୭ࣗೠ ҳഅ ࢿ
REFACTOR GREEN RED TDD (Test Driven Development) पಁೞח పझࠗఠ ࢿ
పझܳ ాҗೞח ୭ࣗೠ ҳഅ ࢿ ࠙ೠ ҳഅ ѐࢶ
REFACTOR GREEN RED TDD (Test Driven Development) पಁೞח పझࠗఠ ࢿ
పझܳ ాҗೞח
ܻಂష݂ 1. पಁೞח పझо ઓ 2. పझܳ ాҗೞח ୭ࣗೠ ҳഅ
ઓ REFACTOR 👉 ࠙ೠ ҳഅ ѐࢶ
ܻಂష݂ 1. पಁೞח పझо ઓ 2. పझܳ ాҗೞח ୭ࣗೠ ҳഅ
ઓ REFACTOR 👉 ࠙ೠ ҳഅ ѐࢶ ӒܻҊ աࢲ
ܻಂష݂
ܻಂష݂ द ࢿೞח Ѫ
ܻಂష݂ द ࢿೞח Ѫ ❌
ܻಂష݂ द ࢿೞח Ѫ ❌ 👉 ࢿ
ܻಂష݂ द ࢿೞח Ѫ ❌ 👉 ࢿ ࢸ҅
߸҃ হ ҳഅ݅ ѐࢶೞח Ѫ ✅
2. CI/CD ۄੋ
పझ ࢿب ਃೞ݅ పझо ҅ࣘ प೯غҊ Ѩૐغח Ѫ ਃೞ 2.
CI/CD ۄੋ
CI/CD
🧑💻 ѐߊ CI/CD
🧑💻 ѐߊ 📤 ಹद CI/CD
ࣘ ా (Continuous Integration) CI/CD 🧑💻 ѐߊ 📤 ಹद
🧑💻 ѐߊ 📤 ಹद 🕵 ܽ ࣘ ా (Continuous Integration)
CI/CD
🧑💻 ѐߊ 📤 ಹद 🕵 ܽ ࣘ ా (Continuous Integration)
CI/CD 🏗 ࠽٘
🧑💻 ѐߊ 📤 ಹद 🕵 ܽ 🧑🔬 పझ 🏗 ࠽٘
ࣘ ా (Continuous Integration) CI/CD
🧑💻 ѐߊ 📤 ಹद 🕵 ܽ 🧑🔬 పझ 🏗 ࠽٘
ࣘ ా (Continuous Integration) CI/CD ✅ 🚫
ࣘ ా (Continuous Integration) CI/CD
ࣘ ా (Continuous Integration) CI/CD
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD 🏗
࠽٘
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD 🏗
࠽٘ 📦 ߓನ
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD 🏗
࠽٘ 📦 ߓನ
ࣘ ߓನ (Continuous Delivery) CI/CD 🛶 झప 🚢 ۽؋࣌
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD 🏗
࠽٘ 📦 ߓನ 🛶 झప 🚢 ۽؋࣌
🧑💻 ѐߊ 📤 ಹद ࣘ ߓನ (Continuous Delivery) CI/CD 🏗
࠽٘ 📦 ߓನ 🧑💻 ѐߊ 📤 ಹद 🏗 ࠽٘ 📦 ߓನ 🛶 झప 🚢 ۽؋࣌
ࣘ ߓನ (Continuous Delivery) CI/CD
ࣘ ా (Continuous Integration) ࣘ ߓನ (Continuous Delivery) CI/CD
ࣘ ా (Continuous Integration) ࣘ ߓನ (Continuous Delivery) CI/CD ࢎۈ
ೡ ੌਸ ӝ҅о न
ࣘ ా (Continuous Integration) ࣘ ߓನ (Continuous Delivery) CI/CD ࢎۈ
ೡ ੌਸ ӝ҅о न ࢎۈ ؊ ਃೠ ੌী
ࣘ ా (Continuous Integration) ࣘ ߓನ (Continuous Delivery) CI/CD ࢎۈ
ೡ ੌਸ ӝ҅о न ࢎۈ ؊ ਃೠ ੌী
3. ೣԋ ࢿೞӝ
3. ೣԋ ࢿೞӝ ೖ٘ߔ ܖ ٜ݅ӝ
ೖ٘ߔ ܖ 🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ
ೖ٘ߔ ܖ 🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ
ೖ٘ߔ ܖ ӝਵ۽ ਬബೠ ೖ٘ߔਸ زܐٜҗ աׂ ࣻ ח ജ҃
🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ
ೖ٘ߔ ܖ ӝਵ۽ ਬബೠ ೖ٘ߔਸ زܐٜҗ աׂ ࣻ ח ജ҃
🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ ۽Ӓې߁ ٘ ܻ࠭ ഥҊ
ೖ٘ߔ ܖ ӝਵ۽ ਬബೠ ೖ٘ߔਸ زܐٜҗ աׂ ࣻ ח ജ҃
🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ ۽Ӓې߁ (पदр) ٘ ܻ࠭ (স ױਤ) ഥҊ (ఠۨ࣌ ױਤ)
۽Ӓې߁ (पदр ೖ٘ߔ)
۽Ӓې߁ (पदр ೖ٘ߔ) https://medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389
https://medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389 Driver Navigator ۽Ӓې߁ (पदр ೖ٘ߔ)
https://medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389 Driver Navigator ۽Ӓې߁ (पदр ೖ٘ߔ) ೡ ߄Բӝ
https://medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389 Driver Navigator ۽Ӓې߁ (पदр ೖ٘ߔ) ೡ ߄Բӝ
ࢲ۽ ঐޗ ԁղӝ
https://medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389 Driver Navigator ۽Ӓې߁ (पदр ೖ٘ߔ) ೡ ߄Բӝ
ࢲ۽ ঐޗ ԁղӝ ֬ଢ଼ݶ ߄۽ ޙೞӝ
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator ޙઁо হח Ѩૐೞח Ѫ
ӝࠄ
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator ޙઁо হח Ѩૐೞח Ѫ
ӝࠄ ߓ҃ա ࢎѾ ١ ݓۅ ׳
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator ޙઁо হח Ѩૐೞח Ѫ
ӝࠄ ߓ҃ա ࢎѾ ١ ݓۅ ׳ PR ࠄޙب ܻ࠭ ࢚
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator ޙઁо হח Ѩૐೞח Ѫ
ӝࠄ ߓ҃ա ࢎѾ ١ ݓۅ ׳ PR ࠄޙب ܻ࠭ ࢚ જ PR ܻ࠭যо ܻ࠭ೞӝ જ PR
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator ޙઁо হח Ѩૐೞח Ѫ
ӝࠄ ߓ҃ա ࢎѾ ١ ݓۅ ׳ PR ࠄޙب ܻ࠭ ࢚ જ PR ܻ࠭যо ܻ࠭ೞӝ જ PR ٬ झఋੌ ਟ݅ೞݶ ӝ҅о ೞب۾
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) Navigator
٘ ܻ࠭ (স ױਤ ೖ٘ߔ) ನۨट पઁ PR ࠁӝ
ഥҊ (ఠۨ࣌ ױਤ ೖ٘ߔ) Navigator
Navigator ഥҊ (ఠۨ࣌ ױਤ ೖ٘ߔ) ఒೞח җ ইפۄ ؊ աইӝ
ਤೠ җ
Navigator ഥҊ (ఠۨ࣌ ױਤ ೖ٘ߔ) ఒೞח җ ইפۄ ؊ աইӝ
ਤೠ җ хী ؊ ࣛ೧Ҋ х ࢚కܳ ؊ ݆ ҕਬೞӝ
Navigator ഥҊ (ఠۨ࣌ ױਤ ೖ٘ߔ) ఒೞח җ ইפۄ ؊ աইӝ
ਤೠ җ хী ؊ ࣛ೧Ҋ х ࢚కܳ ؊ ݆ ҕਬೞӝ ৵ Ӓ۠ хਸ וԕחী ೧ࢲ ਵ۽ ഥҊ೧ࠁӝ
ഥҊ
ഥҊ ݅: ߣীب Ӓ۽ ೡ Ѫٜ ߈ࢿ: ߣীח ܰѱ
ೡ Ѫٜ ѐࢶ: ѐࢶೡ ࣻ ਸ Ѫٜ
ѐੋ ഥҊ
ѐੋ ഥҊ Fact ޖਸ ೮Ҋ Feeling ޖਸ וԕҊ Finding যڃ
Үള
ѐੋ ഥҊ Fact ޖਸ ೮Ҋ Feeling ޖਸ וԕҊ Finding যڃ
Үള + Future Action ۠ Ѫٜਸ दب೧ ࠊঠѷ
1. పझ 2. CI/CD ۄੋ 3. ೣԋ ࢿೞӝ
Thanks 👏