마틴 파울러 > Mocks Aren't Stubs 글 내용이 좋아서 기록합니다. 제가 편한 말(?) 로 바꾼 부분이 많아서 원글을 읽어보시길 추천드려요! # Regular Tests 아래는 일반적인 JUnit 테스트입니다. 스펙은 아래와 같습니다. 주문을 처리할 만큼의 상품이 창고에 있으면 주문이 완료되고 창고의 상품 수량은 해당 수량만큼 감소합니다. 반면 창고에 제품이 충분하지 않으면 주문이 채워지지 않고 창고에 아무 일도 일어나지 않습니다. public class OrderStateTester extends TestCase { private static String TALISKER = "Talisker"; private static String HIGHLAND_PARK = "Highland Park"..
WWDC 2018 - What's New in Testing 의 Parallel Testing 내용을 기록 ✏️ [1] Parallel Testing이란 XCODE9 부터 Parallel Destination Testing을 지원한다. 예전에는 테스트를 디바이스별로 나눠서 돌리는게 아니라 디바이스1에서 모든 테스트 다 돌고, 디바이스2에서 모든 테스트 다 돌고 했었는데 이제는 진짜 parallel하게 테스트를 나눠서 돌아서 테스트 시간이 훨씬 줄었다. 자세히 살펴보자!엑스코드는 각 uitest도는 앱(Runner라고 표현)에게 테스트를 나눠준다. 정확히 말하면 XCode는 각 Runner에게 테스트 클래스를 나눠준다.(각각의 테스트 메소드를 나눠주는게 아님) 그래서 꿀팁을 주셨는데 코드가 많은 클래스를 ..
[1] XCode에서 보기 Edit Scheme에 들어가서 code coverage를 체크해주고 테스트를 돌리면 XCODE에서 여기 말풍선 눌러서 테스트 결과를 볼 수 있잖아요,,,! Xcode말고 파일로도 볼 수 있습니다..! Xcode는 Code coverage reports를 derived data directory(~/Library/Developer/Xcode/DerivedData)에 생성합니다. 정확히 말하면 DerivedData -> GithubActionTest -> Logs -> Test 디렉토리에 만들어줍니다. 저 파일을 누르면 XCODE가 열리고 이런 리포트화면을 보여주더라구요 [2] 터미널에 출력해보기 medium.com/xcblog/xccov-xcode-code-coverage-re..
옵져버블이 completed되고 난 후, 마지막 값을 테스트로 확인해보고 싶은 경우가 있다고 해보겠습니다. 이런 테스트 코드가 있습니다. 당연히 테스트가 실패하겠죠..?! RxBlocking을 쓰면 이 테스트는 성공합니다..!! toBlocking함수를 쓰면 Observable -> BlockingObservable로 바뀌고 BlockingObservable의 last함수는 시퀀스가 종료될때 까지 블러킹해주는 역할을 하기 때문이죠....!! (Blocks current thread until sequence terminates.) 그럼 BlockingObservable의 함수 몇가지를 더 알아보겠습니다. [1] first() 시퀀스의 첫번째 이벤트가 방출될때 까지 블러킹해줍니다. (Blocks curre..
'iOS Test Driven Development by Tutorials' 라는 책으로 스터디를 진행하면서, 샘플프로젝트에 있는 참고할 만한 코드와 테스트 코드를 저의 SPM으로 옮겨오려고 합니다. 개인프로젝트할때 SPM을 써서 더 효율적이고 편하게 개발하기 위함입니다. 이 포스팅은 그 중, extension 관련 코드를 다루고 있습니다. 폴더 구조, 파일 이름, 코드의 출처는 모두 🍑raywenderlich🍑 님이심을 밝힙니다 (저는 테스트코드만 조금씩 바꿨을뿐...!) [1] UITableViewCell + Identifier 첫 extension의 주인공은 UITableviewCell의 identifier입니다...! 1.1 코드작성 Extensions > Identifiers 밑에 다음과 같은 ..
XCTUnwrap 은 말그대로 테스트에서 언래핑을 해야하는 상황에서 쓰는 언래핑함수이다. 나는 테스트에서는 그냥 느낌표로 강제 언래핑을 해주는데, TDD 스터디하는 책에서는 이 함수를 이용하여 언래핑을 해주는 것을 보았다. 그래서 두 방식이 무엇이 다른지 기록한다. 값이 nil이 상황에서 강제언래핑을 하면 Fatal error가 난다. => 테스트 실패로 표시안됨. XCTUnwrap으로 언래핑을 해주면 해당 라인에서 테스트 실패가 난다. => 테스트 실패로 표시됨.
XCTAssert에는 line 파라미터가 있습니다. (XCTAssert의 친구들인 XCTAssertEqual과 XCTAssertTrue 등등 에도 있습니다.) failure이 일어난 라인을 넘겨주면, 해당 라인에서 실패했다는 표시를 띄워줍니다. 이게 언제 쓰이냐면....!!!! Assert문을 하나의 함수로 빼서 여러 테스트 함수에서 사용할때 유용하게 쓰입니다 [1] line을 넘겨주지 않았을때 이 상태에서 testSecondText를 돌려보면 딱 Assert함수에서 실패메세지가 뜹니다 그리고 testFirstText를 돌려보면 딱 Assert함수에서 실패메세지가 뜹니다 [2] line을 넘겨줄 때 testSecondText를 돌려보면 실패한 해당 테스트안에서 실패메세지가 표시됩니다 testFirstTe..
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 코드가 되었습니다 더 확장가능하게 만들어봅시다!!!!!!! 이렇..
어제 테스트 관련 세미나를 듣고 왔는데, 스피커분들이 경험담을 말씀해주시면서 테스트 코드를 작성하고 나서 무엇이 좋았고 달라졌는지, 그래서 테스트는 왜 필요한지에 대해 나눠주셨습니다. 그 중에서 "불안 요소를 제거하는 것이 잘하는 개발이다. 그래서 테스트가 필요하다…!" 라고 하셨던 것이 가장 기억에 남네요 그럼 구체적으로 테스트의 필요성에 대해 살펴봅시다 1. 리팩토링에 대한 확신 테스트는 이전의 동작이 변경되지 않았음을 담보할 수 있는 장치 입니다. 예를들어 Calculator의 add함수를 테스트하는 코드가 있다면, 이렇게 위 함수에서 아래 함수로 add함수를 리팩토링해도 동작이 잘되는구나!! 라는 확신을 가질 수 있겠죠. 리팩토링 한 후 테스트를 돌려서 기존 동작이 잘 돌아가는 지 쉽게 확인할 수..
- Total
- Today
- Yesterday
- 플러터 싱글톤
- Sketch 누끼
- ipad multitasking
- SerializerMethodField
- github actions
- Dart Factory
- 플러터 얼럿
- DRF APIException
- 장고 URL querystring
- flutter 앱 출시
- flutter build mode
- Flutter Spacer
- PencilKit
- Flutter Clipboard
- METAL
- ribs
- Flutter Text Gradient
- flutter dynamic link
- Python Type Hint
- Django Heroku Scheduler
- Flutter 로딩
- Flutter getter setter
- 장고 Custom Management Command
- Django FCM
- 구글 Geocoding API
- cocoapod
- flutter deep link
- drf custom error
- Django Firebase Cloud Messaging
- Watch App for iOS App vs Watch App
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |