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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Suyeol Jeon
February 16, 2021
Programming
260
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
110
Hello, ReactorKit 👋
devxoul
0
120
Build Funnels with Google BigQuery
devxoul
0
61
RxSwift 시작하기
devxoul
1
370
ReactorKit으로 단방향 반응형 앱 만들기
devxoul
0
180
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
devxoul
10
3.3k
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
devxoul
0
130
Other Decks in Programming
See All in Programming
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
240
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
170
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
250
dRuby over BLE
makicamel
2
410
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
Vite+ Unified Toolchain for the Web
naokihaba
0
700
関数型プログラミングのメリットって何だろう?
wanko_it
0
150
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
290
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
My Coaching Mixtape
mlcsv
0
170
Faster Mobile Websites
deanohume
310
32k
Docker and Python
trallard
47
3.9k
Music & Morning Musume
bryan
47
7.3k
Being A Developer After 40
akosma
91
590k
Context Engineering - Making Every Token Count
addyosmani
9
1k
30 Presentation Tips
portentint
PRO
1
340
Ethics towards AI in product and experience design
skipperchong
2
320
WENDY [Excerpt]
tessaabrams
11
38k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
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 👏