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
72
Hello, ReactorKit 👋
devxoul
0
88
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
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
2
220
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
390
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
320
Is Xcode slowly dying out in 2025?
uetyo
1
210
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
220
ニーリーにおけるプロダクトエンジニア
nealle
0
570
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
580
Node-RED を(HTTP で)つなげる MCP サーバーを作ってみた
highu
0
100
WindowInsetsだってテストしたい
ryunen344
1
200
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
280
VS Code Update for GitHub Copilot
74th
1
410
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
980
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Unsuck your backbone
ammeep
671
58k
Docker and Python
trallard
44
3.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Speed Design
sergeychernyshev
32
1k
The Cult of Friendly URLs
andyhume
79
6.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Raft: Consensus for Rubyists
vanstee
140
7k
Become a Pro
speakerdeck
PRO
28
5.4k
A better future with KSS
kneath
239
17k
For a Future-Friendly Web
brad_frost
179
9.8k
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 👏