Swift3.0에서 UT 쓰기 ~ Manual Mocking ~

UT 작성 준비



Objective-C 클래스를 Swift로 테스트 코드를 만들 때



  • AppTests 파일에 새롭게 「Unit Test Case Class」파일을 추가한다.
  • 서브 클래스 : XCTestCase가 되어 있는지 확인
  • Language: Swift로 설정
    Target은 AppTests에만 체크를 한다 (여기서 불필요한 파일에 체크하면 「Cannot load underlying module for ‘XCTest’」의 컴파일 에러가 일어난다...)


  • Objective-C Bridging Header를 작성합니다. 이하의 다이얼로그가 나오면 「YES」를 선택하면 자동으로 만들어 준다.
    (AppTests BuildSetting의 Swift Compiler - General의 Objective-C Generated Interface Header Name에도 자동으로 등록됨)

       

  • Bridging Header 파일에 Swift의 UT 클래스에서 이용하고 싶은 Objective-C 클래스의 import를 기술한다.
    (이번에는 AppTests-Bridging-Header.h라는 이름으로 작성)

    AppTests-Bridging-Header.h
    #ifndef App_Bridging_Header_h
    #define App_Bridging_Header_h
    
    // Swiftのテストクラスで使いたいObj-CクラスのHeaderを記述する
    #import "App.h"
    #import "AppSetting.h"
    #endif
    

  • 작성한 UT 클래스에 "import XCTest"가 있는지 확인하십시오.

  • Swift 클래스를 Swift로 테스트 코드를 만들 때


  • 프로젝트 파일 .xcodeproj의 "Defines Module"을 YES로 설정. → Xcode에서 대상 프로젝트를 열고 Build Settings의 Defines Modules를 "YES"로 만듭니다
  • 각 테스트 클래스에 @testable import YourAppModuleName 을 추가한다.

  • Manual Mocking



    Manual Mocking이란...


  • Swift로 테스트 코드를 작성할 때 스텁 모형을 만들 수 있습니다 (Obj-C 클래스 테스트를 Swift로 작성할 때도 사용할 수 있음).
  • Xcode에 표준 장비
  • XCTest를 가져 오면 사용할 수 있습니다 (라이브러리 설치 등 필요 없음).
  • 특정 클래스의 특정 메소드를 모형화하고 반환 값 등을 임의로 변경할 수 있습니다.
  • 테스트를위한 함수 내에서 스텁을 만들려는 클래스의 하위 클래스를 만들고 메서드를 재정의하여 모형 클래스의 범위를 함수 내에서 사용할 수 있습니다.

    Manual Mocking을 이용한 UT



    AppSettingTest.swift
        /// Bridging-Header.hを作成しているのでXCTest以外のimportは無し
        /// Swiftクラスをテストする場合もXCTestのimportは必要
        import XCTest 
    
        @testable import App /// Swiftクラスのテストコードを作成するときに記述する. Obj-Cのみの場合は必要ない
    
        class AppSettingTest: XCTestCase {
    
            /// Appをテストクラス内で使い回すためにプロパティとして準備する(テストメソッドごとに作成してもOK)
            var app: App? = nil
    
            override func setUp() {
    
                super.setUp()
    
                /// Manual Mocking:Mock用インスタンスの中身を変更する
                class AppMock: App {
                    override func isApp() -> Bool { ///AppクラスのisApp()メソッドをモック化して戻り値を指定
                        return true
                    }
                }
    
                /// Mock化したメソッドを含んだクラスを空のインスタンスに入れる
                self.app = AppMock()
            }
    
            func testAppVersion() { /// このメソッドはAssertの例を示すために架空のメソッドを追加している
                /// AssertはXCTestの書き方
                XCTAssertTrue(app?.isApp())
                XCTAssertFalse(app?.isApp())
            }
        }
    
  • 좋은 웹페이지 즐겨찾기