textfield.rx.text가 당연히 textfield의 text가 변할 때만 이벤트가 방출되는 줄 알았는데, 아니라는 것을 알게 되어서 정리합니다..! UILabel은 빼고 사용자 입력에 따라 텍스트가 변하는 UI 삼인방(?) UITextField, UISearchBar, UITextView 를 살펴봅니다 이렇게 실험을 준비해줍니다 1. textField.rx.text UITextField+Rx.swift 파일에 들어가줍니다 controlPropertyWithDefaultsEvents에 들어가봅니다 😱😱 놀랍게도 valueChanged뿐만 아니라 allEditingEvents에도 트리거 된다는 것을 확인할 수 있습니다...!!! 😱😱 allEditingEvents는 텍스트 필드에 editing 하려..
WWDC 2017 - Engineering For Testability 의 내용이 좋아서 기록해둡니다 이 발표에서는 이렇게 두가지 세션이 있습니다 그 중, 첫번째 세션이라고 할 수 있는 Testable App Code에 관한 기록입니다...!! 이 세션에서는 'Testable한 코드의 특징이 무엇인지와 그런 코드를 만들기 위한 스킬' 에 대해 알려줍니다. 결론부터 말하자면, 1) Testable한 Code는 다음과 같은 특징을 가집니다 2) Testable한 Code를 만들기위해 두가지 스킬을 쓸 수 있습니다 이제 본격적으로 Testable한 코드로 리팩토링해봅시다....!! 그 전에 Unit Test의 구조부터 봅시다 input을 준비합니다. 테스트되어야하는 코드(보통 함수를 말함)에 input을 넣습..
WWDC 2017 - Engineering For Testability 의 두번째 세션인 "Scalable Test Code" 에서 보여주셨던 UI Test 리팩토링 예시가 좋아서 기록해둡니다 첫번째 예제 이런 코드를 이렇게 리팩토링하여 확장가능하게 만들자 두번째 예제 난이도를 beginner로, 사운드를 off로 한 상태에서 어떤 것을 테스트하는 코드 입니다 // test code 뒤에는 아마 Assert문이 들어가겠죠?! 이렇게 난이도 설정과 사운드 설정을 분리해서 확장가능성을 높여줍시다 더 나아가 설정가능한 값이 제한되어있는 난이도와 사운드이니 enum을 활용하면 더 좋을 것입니다~= 짠! 이렇게 훨씬 깔끔하고 읽기 좋은 UI Test 코드가 되었습니다 더 확장가능하게 만들어봅시다!!!!!!! 이렇..
collectionView의 이 세가지 메소드에 들어가보면 모두 다음과 같은 설명이 있습니다..!! 여러 개의 변경을 동시에 animate하고 싶을 때, performBatchUpdates(_:completion:) 를 사용하는 것을 권장하고 있네요 performBatchUpdates는 collectionView의 메소드 입니다. 설명을 보면 많은 insert, delete, reload, move 연산을 그룹으로 묶어서 animate한다 라고 나와있습니다 그럼 performBatchUpdates를 테스트해보기 위해 간단히 사전 세팅을 해줍시다 그리고 insert&delete 메소드를 구현해줍시다 index 1에 100이라는 Cell을 추가해주고 다시 지워주는 시나리오를 만들어봅시다 먼저, perform..
어제 테스트 관련 세미나를 듣고 왔는데, 스피커분들이 경험담을 말씀해주시면서 테스트 코드를 작성하고 나서 무엇이 좋았고 달라졌는지, 그래서 테스트는 왜 필요한지에 대해 나눠주셨습니다. 그 중에서 "불안 요소를 제거하는 것이 잘하는 개발이다. 그래서 테스트가 필요하다…!" 라고 하셨던 것이 가장 기억에 남네요 그럼 구체적으로 테스트의 필요성에 대해 살펴봅시다 1. 리팩토링에 대한 확신 테스트는 이전의 동작이 변경되지 않았음을 담보할 수 있는 장치 입니다. 예를들어 Calculator의 add함수를 테스트하는 코드가 있다면, 이렇게 위 함수에서 아래 함수로 add함수를 리팩토링해도 동작이 잘되는구나!! 라는 확신을 가질 수 있겠죠. 리팩토링 한 후 테스트를 돌려서 기존 동작이 잘 돌아가는 지 쉽게 확인할 수..
테스트 피라미드라는 개념은 애플에서 제시한 아이디어 인 줄 알았는데, 안드로이드 테스트 세미나(이름: 안드로이드 탐구영역)를 듣고 와서 두루 쓰이는 개념이라는 것을 알게 되었습니다 그래서 덧붙여서 다시 정리...!! 테스트 피라미드는 이렇게 생긴 것 입니다 세미나에서 우섭님(뱅.샐)이 테스트 피라미드를 이런 그림으로 정리해주셨는데요, y축부터 봅시다..! 위로 올라갈 수록 실제로 돌아가는, 유저가 쓰는 영역이라 믿을 만한 영역입니다. 하지만 실행시간이 오래 걸리고 유지보수, 디버깅 하기 더욱 어려운 영역입니다. 그 다음 x축을 봐봅시다..! 밑으로 내려 올 수록 더 많은 테스트 코드를 작성하게 됩니다 이런 피라미드 접근법은 어떤 유익이 있을 까요?! 애플에 의하면, 피라미드 모델 접근법은 철저성(thor..
나는 아직 입장정리 안함. 테스트 코드에 대한 다양한 의견들을 모아두고 이러저러 써보고 결정할 것임. [1] 테스트 함수 네이밍 좋은 테스트 이름들 : 무엇을 테스트하고 있는지 명확합니다. 어떤 때 테스트가 통과하거나 실패하는지 명확합니다. 라고 생각하고 엄청 자세하게 테스트 이름을 짓는 파(?)가 있다. test2Add5WillBe7() 이런식으로...?! 또 이런 파 중에 스네이크케이스로 짓는 분들도 계시다 애플 WWDC 2019 Testing in Xcode 세션 데모에서는 그냥 이렇게 간단하게 테스트 함수 이름을 정했다. 간단 네이밍 파(?)가 있다 [2] 네트워크 Request를 테스트하느냐 안하느냐 오로지 더미데이터랑 Mock 객체들만 가지고 테스트하는 파(?)가 있다. 이런식으로 reques..
https://github.com/Quick/Quick/blob/master/Documentation/ko-kr/QuickExamplesAndGroups.md Quick/Quick The Swift (and Objective-C) testing framework. Contribute to Quick/Quick development by creating an account on GitHub. github.com 여기서 너무 잘 설명해서 덧붙일 것도 없는 듯 하네용... Quick 감사합니다👏 한글번역 감사합니다👏 개인적으로는 테스트 메소드 이름이 엄청 구체적이여야한다고 해서 하나씩 만들때 마다 너무 긴데 잘 읽히나...? 이런 생각도 들고 약간의 귀찮음도 있었는데 Quick을 사용하면 긴 테스트 메소드 이..
Unit test 라이브러리로 많이 쓰이는 Quick과 Nimble..! 왜 유명한 것인지 Nimble부터 살펴보자 ☺️ [1] XCTAssert 와는 달리 매번 사용자 임의 실패 메시지를 지정할 필요가 없다 XCTAssert에서 실패 메세지를 작성해주지 않으면, XCTAssertTrue(contains(sillyMonkeys, kiki)) 테스트가 실패했을 때 달랑 "XCTAssertTrue failed" 이라는 실패메세지를 받게 된다 그래서 보통 이렇게 실패 메시지를 함께 작성한다 XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") 테스트가 실패했을 때 "Expected sillyMonkeys to..
[1] debounce - 타이머를 지정해두고 타이머가 끝난 시점에 가장 최근의 값을 방출해준다. - 이벤트가 방출될때마다 타이머가 초기화된다. - 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누르다가 더이상 버튼을 안누르고 2초가 지날때 가장 마지막 클릭 이벤트를 준다. [2] throttle - 타이머를 지정해두고 이벤트가 처음 방출되면 타이머 동안 어떤 이벤트도 방출되지 않는다. - 이벤트가 방출될때마다 타이머가 초기화되지 않는다. - 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누를때 처음 클릭 이벤트만 주고 2초동안 어떠한 클릭이벤트도 주지 않는다. (다만 latest를 어떻게 설정해주냐에 따라 조금 다른데 밑에서 확인!_!) [2.1] throttle lates..
- Total
- Today
- Yesterday
- Sketch 누끼
- 장고 Custom Management Command
- SerializerMethodField
- ribs
- Python Type Hint
- ipad multitasking
- Django Firebase Cloud Messaging
- Dart Factory
- PencilKit
- cocoapod
- flutter 앱 출시
- flutter dynamic link
- Watch App for iOS App vs Watch App
- Flutter Text Gradient
- 구글 Geocoding API
- flutter deep link
- Flutter 로딩
- Flutter Clipboard
- 플러터 얼럿
- 장고 URL querystring
- Django FCM
- Django Heroku Scheduler
- 플러터 싱글톤
- flutter build mode
- Flutter Spacer
- Flutter getter setter
- drf custom error
- github actions
- DRF APIException
- METAL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |