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
250
2
Share
성장하는 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
100
Hello, ReactorKit 👋
devxoul
0
110
Build Funnels with Google BigQuery
devxoul
0
56
RxSwift 시작하기
devxoul
1
370
ReactorKit으로 단방향 반응형 앱 만들기
devxoul
0
180
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
devxoul
10
3.3k
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
devxoul
0
130
Other Decks in Programming
See All in Programming
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
360
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
1.1k
〜バイブコーディングを超えて〜 チームで実験し続けたAI駆動開発
tigertora7571
0
190
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
690
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
440
Surviving Black Friday: 329 billion requests with Falcon!
ioquatix
0
2.8k
Agent Skills を社内で育てる仕組み作り
jackchuka
1
1.3k
AgentCore Optimizationを始めよう!
licux
3
200
Firefoxにコントリビューションして得られた学び
ken7253
2
150
GoogleCloudとterraform完全に理解した
terisuke
1
190
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
3
2.7k
How We Benchmarked Quarkus: Patterns and anti-patterns
hollycummins
1
180
Featured
See All Featured
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
28
Discover your Explorer Soul
emna__ayadi
2
1.1k
GitHub's CSS Performance
jonrohan
1032
470k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
300
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
270
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.4k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
370
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 👏