본문 바로가기

728x90

난 iOS개발자/UnitTest

(6)
Stub, Mock, Dummy 최근 회사 프로젝트에 테스트코드를 넣기 시작했다. 연습으로 테스트 코드를 작성했던것과 달리 조금 더 신경써야 할 부분들이 생겨났고, 나중에 다른 개발자가 보더라도 이해하기 쉬워야할텐데, 아무튼 테스트 코드를 작성하다보니 조금 헷갈리는 부분이 있어서 정리하려한다. 테스트 코드를 작성하면서 의존성이 생기는 경우가 허다하다. A를 검증하기 위해서 B,C,D를 주입시켜줘야 하는 경우인데 B,C,D 가 실제로 동작하지 않아도 되거나 가짜 데이터를 즉시 반환하는 역할을 하기도 한다. 이렇게 검증에 필요한 거짓된 객체를 사용함에 있어서 어떤 경우에 Stub, Dummy, Mock같은 네이밍을 해줘야할지 정리한다. Stub Stub은 호출에 대해 정해진 응답을 하게 만든 객체이다. 아래는 팀원목록을 반환하는 레파지토리..
Code Coverage 확인하기 테스트코드가 앱의 실제 코드를 어느정도까지 테스트하고 있는지 그 진행도를 확인 할 수 있다. 1. Product -> Scheme -> Edit Scheme 2. Test -> Option Code Coverage 에 Gather coverage 체크 3. CodeCoverage 확인 Command + U 단축키를 눌러 테스트 코드 실행 후 ReportNavigation탭으로 이동하면 Coverage가 보인다.
Unit Test 작성해보기2 이전 내용(https://greate-future.tistory.com/86)에 이어서 로또 번호를 검증하는 기능에 대해 테스트를 해보자. LottoMachine은 아래와 같이 번호검증 메서드를 갖는다. struct LottoMachine { func isValidLottoNumbers(of numbers: [Int]) -> Bool { guard numbers.count == 6, Set(numbers).count == 6 else { //1 return false } for num in numbers { //2 guard 1...45 ~= num else { return false } } return true } } //1 isValidLottoNumbers로 전달된 numbers의 요소 갯수 검사를..
Unit Test 작성해보기1 @testable 테스트케이스를 작성하기에 앞서 UnitTest파일의 상단에 아래와 같은 형식으로 코드를 작성 해줘야 한다. @testable import "타겟 이름" @testable은 Unit Test가 실제 앱 타깃에 있는 코드에 접근 하도록 하는 키워드이다. 위 @testable 은 UnitTestSample 이라는 타겟에 접근하기 위한 것으로, 보통의 앱 코드는 기본적으로 Internal 접근제어를 갖게 되는데 testable 키워드를 통해 테스트 하는 동안 다른 타겟에서 접근을 허용하도록 해주는 것이다. 아래 구조체에 대한 테스트 케이스를 작성해보자. struct StrangeCalculator { func addNumbers(of numbers: [Int]) -> Int { return n..
Unit Test 파일 살펴보기 프로젝트 네비게이터에서 여섯번째 탭으로 이동하고 , 왼쪽 하단의. + 버튼을 눌러서 New Unit Test Target을 선택해준다. setUpWithError() setUpWithError는 각각의 테스트 케이스가 실행되기 전 마다 호출된다. 각 테스트 케이스를 모두 같은 같은 조건에서 실행될 수 있게 하는 메서드이다. 만약 테스트 케이스 A와 B가 같은 리소스를 사용하여 테스트를 하고 있을 때, 각 케이스가 다른 테스트 케이스로 인해 변경된 리소스를 사용해야 한다면 정상적인 테스트가 이뤄지지 않을 것이다. setUpWithError()는 이러한 현상을 방지하기 위해 초기화 코드등이 들어가는 부분이다. tearDownWithError() setUpWithError와 반대로 각각의 테스트 케이스 실행이..
FIRST 원칙 Fast 테스트는 빠르게 동작해야 한다. 프로젝트 규모에 따라 테스트 코드도 늘어나게 되고, 많은 테스트 코드는 시간을 소요하게 된다. 테스트 코드는 빠르게 확인하고, 수정할 수 있어야 의미가 있다. Independent/Isolated 각 각의 테스트는 독립적으로 동작하며, 서로 의존해선 안된다. 코드간 의존성이 높으면 테스트가 실패 했을 경우 원인을 찾는것에 어려움을 겪을 수 있으며 테스트 진행에 차질을 불러오기도 한다. Repeatable 테스트는 언제나 같은 결과를 내야한다. 매번 예상한 결과대로 테스트가 진행되게 해야한다. Self-Validating 테스트의 성공 여부는 테스트 코드 내부에서 스스로 검증 가능해야 한다. Timely 테스트 코드는 실제 코드를 구현 하기 직전 구현해야만 효율적이..

728x90