2016-12-22 11 views
3

をアプリ基本的な問題は、この1と同じである:XCTestCase: Wait for app to idleiOS版のUIテストで、アイドル状態を待って無効にすると、

私は私の意見では永久に繰り返し「背景アニメーション」を使用しています。 !@#$#$ & @ Xcode/iOSのUIテストでは、すべてのUIViewアニメーションが終了するのを待っていますが、アイドル状態のアプリがアイドル状態であるとみなされ、タッピングボタンなどの操作が行われます。アプリをデザインしました。 (具体的には、我々はそれが決して停止しないようにします。、UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverseオプションでアニメーション化され、ボタンを持っている)

しかし、私は状態は「待ちますををオフにし、および/または短縮するいくつかの方法があるかもしれないと思っていますアプリをアイドル状態にする。ある?どうやって?これの周りに他の方法はありますか?

答えて

3

残念なことに、AppleのUIテストを使用すると、「アプリケーションがアイドルになるのを待つ」または他のネットワークアクティビティをポーリングすることはできませんが、環境変数を使用してアプリ内のアニメーションを無効にして、テスト前の設定方法で、このような環境変数を設定してください。あなただけそれがその特定のビューまたは全体のアニメーションを無効にするには、デリゲートのファイルにアニメーションを無効にしたい場合は、特定のビューにそのチェックを配置することができます

if (ProcessInfo.processInfo.environment["UITEST_DISABLE_ANIMATIONS"] == "YES") { 
    UIView.setAnimationsEnabled(false) 
} 

:あなたのソースコードで今すぐ

override func setUp() { 
    super.setUp() 
    continueAfterFailure = false 
    let app = XCUIApplication() 
    app.launchEnvironment = ["UITEST_DISABLE_ANIMATIONS" : "YES"] 
    app.launch() 
} 

アプリ。

+0

おかげで、これは私が今のところやってしまったものです。完璧ではありませんが、今のところ唯一の方法かもしれません。 app.launch() ' – Jonny

+0

を一回の反復を実行するだけに語ったことができ、それが 'てみましょうアプリは= XCUIApplication() app.launchEnvironment = [ "YES" "UITEST_DISABLE_ANIMATIONS"]でなければなりません魔法のように!さらに、速度のために、このためいくつかのケースでは 'waitForExistence'関数を使用する必要があることに言及することもできます)。 – Jeremy

5

実際にはwait for app to idleを無効にすることができます。これはハックであり、安定していない可能性があります。アニメーションを無効にしてこのハックを有効にすると、アニメーションを無効にすることによるパフォーマンス向上の上に、約20%のパフォーマンス向上が見られます。

あなたがしなければならないことは、アプリケーションをアイドル状態にして、それをノーオペレーションするために呼び出されるメソッドをすっきりさせるだけです。その方法はXCUIApplicationProcess waitForQuiescenceIncludingAnimationsIdle:

です。これは私の迅速な解決策3です - より良い方法がありますが、これは概念の証明のために機能します。

XCTestCaseクラスを拡張します。病気コール鉱山MyTestCase

static var swizzledOutIdle = false 

override func setUp() { 
    if !MyTestCase.swizzledOutIdle { // ensure the swizzle only happens once 
     let original = class_getInstanceMethod(objc_getClass("XCUIApplicationProcess") as! AnyClass, Selector(("waitForQuiescenceIncludingAnimationsIdle:"))) 
     let replaced = class_getInstanceMethod(type(of: self), #selector(MyTestCase.replace)) 
     method_exchangeImplementations(original, replaced) 
     MyTestCase.swizzledOutIdle = true 
    } 
    super.setUp() 
} 

@objc func replace() { 
    return 
} 

wait for app to idleは、もはやログに表示されなくなります。誰もがそれを必要とする場合には、私はObjective-Cでgh123man答えを使用

+0

作品:アニメーションちょうど明確にするなど – inf1783

0

- (void)disableWaitForIdle { 

    SEL originalSelector = NSSelectorFromString(@"waitForQuiescenceIncludingAnimationsIdle:"); 
    SEL swizzledSelector = @selector(doNothing); 

    Method originalMethod = class_getInstanceMethod(objc_getClass("XCUIApplicationProcess"), originalSelector); 
    Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector); 

    method_exchangeImplementations(originalMethod, swizzledMethod); 
} 


- (void)doNothing { 
    // no-op 
} 
関連する問題