2016-08-25 1 views
2

먼저 문제를 설명해 드리겠습니다.XC UI 테스트 용 스텁 데이터

내 웹 서버 데이터를 중계하고 싶지 않습니다. 내 XCUITests에 대한 데이터를 스텁하고 싶습니다. 그래서 정확한 데이터를 100 % 반환하고 때로는 특정 오류 (예 : 오류 또는 빈 상태)를 테스트해야 할 때도 있습니다. 웹 서버가 그 순간 정확하게 반환하지 않을 수 있습니다. 그래서, 내가 뭘 시도했는지, 내 XCUITest에서 로컬 server을 실행 한 다음 일부 요청을 스터핑하는 것이지만 XC UI 테스트가 별도의 개별 번들 (심지어는 별도의 프로세스)에서 실행되고 로컬 서버를 localhost에 바인드 할 수 없으므로 내 메인 앱 번들을이 서버에 연결할 수 없습니다.

내가 시도한 또 다른 솔루션은 XCUIApplication(). launchArguments를 통해 일부 매개 변수를 전달하고 기본 app의 params-run 스텁을 기반으로하지만 다음과 같은 문제가 있습니다. "문제가 있습니다. -proxy server in main app ", UI 테스트에만 필요합니다.

나는 스텁 서버를 만들어 웹에 노출 할 수 있기 때문에 UI 테스팅을위한 개발 환경을 만들 수 있지만 극단적 인 것으로 보인다. 이 경우 프로젝트의 UI 테스트 만 유지하는 것이 큰 노력입니다.

내 질문은 누구든지 더 나은 해결책이 있습니까? 주 앱을 수정하거나 외부 웹 서버를 실행하지 않고이 문제를 해결할 수있는 방법이 있습니까?

+0

소수의 클래스와 확장을 사용하여 쉽게 수행 할 수있는 방법에 대한 블로그 게시물을 작성했습니다. https://developer.soundcloud.com/blog/automatic-stubbing-of-network-requests-to-de-flakify-automation-testing – Remover

답변

1

SBTUITestTunnel을 사용할 수 있습니다. 이 라이브러리는 네트워크 요구 (다른 것들 중에서도)를 간단한 방식으로 동적으로 스터핑 할 수있게합니다.

라이브러리를 추가하는 가장 쉬운 방법은 다음 AppDelegate에의 초기화 메소드를 오버라이드 (override), cocoapods을 사용하는 것입니다 : 당신은 갈 준비가 있음을 추가하면

import UIKit 
import SBTUITestTunnel 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 

    override class func initialize() { 
     SBTUITestTunnelServer.takeOff() 
     super.initialize() 
    } 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     return true 
    } 
} 

. 아래 예와 같이 UI 요청에 네트워크 요청에 스텁을 추가/제거 할 수 있습니다.

func testThatSomethingStubbedWorks() { 
    let app = SBTUITunneledApplication() 
    app.launch() 

    let stubId = app.stubRequestsMatching:SBTRequestMatch(SBTRequestMatch.URL("google.com"), returnJsonDictionary: ["key": "value"], returnCode: 200, responseTime: SBTUITunnelStubsDownloadSpeed3G) 

    // from here on network request containing 'google.com' will return a JSON {"request" : "stubbed" } 
    ... 

    app.stubRequestsRemoveWithId(stubId) // To remove the stub either use the identifier 
    app.stubRequestsRemoveAll() // or remove all active stubs 
}