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
성장하는 iOS 개발자 되기
Search
Suyeol Jeon
February 16, 2021
Programming
2
240
성장하는 iOS 개발자 되기
미리 톺아보는 훌륭한 개발자의 역량
Suyeol Jeon
February 16, 2021
Tweet
Share
More Decks by Suyeol Jeon
See All by Suyeol Jeon
레거시 프로젝트에서 의존성 주입하기
devxoul
1
2.4k
Let's TDD
devxoul
0
73
Hello, ReactorKit 👋
devxoul
0
89
Build Funnels with Google BigQuery
devxoul
0
39
RxSwift 시작하기
devxoul
1
350
ReactorKit으로 단방향 반응형 앱 만들기
devxoul
0
160
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
devxoul
10
3.2k
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
devxoul
0
110
Other Decks in Programming
See All in Programming
おやつのお供はお決まりですか?@WWDC25 Recap -Japan-\(region).swift
shingangan
0
150
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
0
360
Git Sync を超える!OSS で実現する CDK Pull 型デプロイ / Deploying CDK with PipeCD in Pull-style
tkikuc
4
450
Yes, You Can Work on Rails & any other Gem
kaspth
0
110
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
9.3k
商品比較サービス「マイベスト」における パーソナライズレコメンドの第一歩
ucchiii43
0
190
AI コーディングエージェントの時代へ:JetBrains が描く開発の未来
masaruhr
1
210
AIのメモリー
watany
11
940
20250708_JAWS_opscdk
takuyay0ne
2
150
リッチエディターを安全に開発・運用するために
unachang113
1
240
Rails Frontend Evolution: It Was a Setup All Along
skryukov
0
320
効率的な開発手段として VRTを活用する
ishkawa
1
180
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Navigating Team Friction
lara
187
15k
Agile that works and the tools we love
rasmusluckow
329
21k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Building Adaptive Systems
keathley
43
2.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Facilitating Awesome Meetings
lara
54
6.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
108
19k
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 👏