迅速な猿の猿がXCTestテストフレームワークに基づいたテストのiOS側、迅速書き言葉に使用され、プライベートAPIを呼び出す XCEventGeneratorを、イベントのイベントを生成し続け、しかし、あなたがしたいので、もしXcode10.1 XCTestFrameworkは、このAPIを削除されているよりも多くの10.1上記で使用した単語に二次開発のために必要。
、ツールのフレームワークネイティブ二次開発のための基本的な必要性が異なるテストのニーズを異なる満たすためにされているサルのテストのための発見された別のアプリの需要の猿Androidの終わりを使用している場合、Androidは、その後、いくつかのカスタマイズシナリオの基本的なニーズを満たすfastmonkeyしかし、iOSのは、ここでは十分ではありませんので、我々は自分たちのニーズ二次開発によると、次のswiftmonkeyソースを参照してください。
詳細には触れないよう具体的な手順の使用は、多くのオンラインリソースがありますが、それはgithubのアドレスバーを記録しました
実際に、私はまた、いくつかの時間のために更新されていないこのツールを見つけます。
フレームワークを構成します
簡単なファイルは、全体のツールを構成します。
モンキー:プログラムエントリは主に構成された猿、サルなどを実行
MonkeyXCTest:その後、猿を展開し、コメントを参照してくださいは、イベントを生成するために、共通XCTestのAPIを使用するようになっていたが、書いていません。。。
MonkeyXCTestPrivate:これは様々なイベント用のコードを生成するための独自のAPIを使用することです
MonkeyUIAutomation:これは、様々なイベントを実行するためにUIautomationフレームワークを使用することであるが、唯一のシミュレータをサポートしています
ランダム:これは、様々な乱数生成の関数であり、
ソースコード分析の主要部分
monkeyAround
、循環することにより生成されたランダムイベント(実行回数、実行時間に応じて)方法を実行します
publicfuncmonkeyAround(反復:INT){ for_in1 ...反復{ actRandomly() actRegularly() } }
actRandomlyは()の実行を追加するためのランダムなイベントです
actRegular()は一定間隔の入射に実行されます
/// 1のランダムなイベントを生成します。 publicfuncactRandomly(){ letx = r.randomDouble()*全重量 foraction inrandomActions { IFX <action.accumulatedWeight { action.action() リターン } } } ///保留中の固定間隔イベントを生成します。 publicfuncactRegularly(){ actionCounter + = 1 foraction inregularActions { ifactionCounter%action.interval == 0 { action.action() } } }
必要がイベントの割合を追加するときに、割合はイベントイベント実行に応じて実行するようになります、イベントを追加し、ランダムイベントのランダムな配列から削除することを参照して、アクションを実行することができます。
だからここでのイベントは、ランダムにそれから生成されていますか?
サルを使用するときは、ランダムなイベントを追加する必要があります。
例えば:
monkey.addDefaultXCTestPrivateActions()
詳細な方法を表示し、デフォルトXCTestプライベートなイベントを追加し、あなたは追加のランダムな事象の割合を見ることができます
publicfuncaddDefaultXCTestPrivateActions(){
addXCTestTapAction(重量:25)
addXCTestLongPressAction(重量:1)
addXCTestDragAction(重量:0)
addXCTestPinchCloseAction(重量:0)
addXCTestPinchOpenAction(重量:0)
addXCTestRotateAction(重量:0)
// addXCTestOrientationAction(重量:1)// TODO:これが動作しない理由を調査します。
}
私たちは、それはいくつかのイベントを追加するために、デフォルト見て、体重を設定することができます
DIRそのイベントを見て、tapAction追加する方法です
addXCTestTapAction方法では、関数はXCEventGeneratorが機能しなくなっペースト、行っ呼び出し、閉鎖、生成されたランダムなポイントを追加します。
注目に値する点は、実行されたときaddXCTestTapAction addAction法をランダムアレイにイベントを追加し、反復処理するために呼び出され、あります
addAction法では、ネストされた関数は、現在のアプリケーションの閉鎖を監視するために使用されている点がありますコールサインやイベントがアプリを終了するには、主要なので、常に私たちはあなたには、いくつかのシステムを見つけた場合、アプリをテストしたいです、再び引き戻すます。
funcactInForeground(_action:@escapingActionClosure) - > ActionClosure { リターン{ ガード#利用可能(iOS9.0、*)他に{ アクション() の戻り } letclosure:ActionClosure = { //状態来判断当前アプリ执行状态 。ifXCUIApplication()状態! = .runningForeground { 。XCUIApplication()活性化() } アクション() } ifThread.isMainThread { クロージャ() }他{ DispatchQueue.main.async(実行:閉鎖) } } }
この時点では、実装プロセスのswiftmonkeyを整理することができます
1.初期化猿
2.体重を設定し、ランダムなイベントを追加
3.猿の実行
二次開発のアイデア
どのように二次開発?
一例として、アプリケーションにコードをインストルメント問題swiftmonkeyを解決します。
従来の方法は、実行するために、私たち自身のプロジェクトに追加するサルを使用することですが、私たちは理解したときにその原則は少し低い変換することができます。
swiftmonkeyベースのアプリケーションであるため、xcuiapplicationによってプロジェクトに必要なすべての最初の実行xcuitestテストを持ち上げ、次にランダムに実行されます。あなたが理解している場合しかし、あなたは限り、着信アプリなど、他のアプリを持ち上げるXCTest XCTestのサポートを知っているbundleIdentifierができるので、私たちは簡単にXcodeのプロジェクトをビルドしてからswiftmonkeyファイルをインポート、uitestファイルを作成しますが、私たちは猿を開始する前に指定する必要がありますすることができますbundleidその上でアプリをテストします。
例えば:
letapp2 = XCUIApplication(bundleIdentifier: "com.myapp.app")
app2.launch()
しかし、発見を実行するか、この偽アプリに戻って引っ張ってくる後に作成した、そしてなぜ、ソースを解析するときにイベントを実行するたびにポイントが、決定されると言われていたものをフォアグラウンドでアクティブに開始するかどうかを現在のアプリケーション(ここで、プロジェクトのサル)、そうでない場合、それはそれでテストするために、我々は彼らの実際のアプリに入れたアプリケーションの方がずっといい判断を引き上げます
例えば:
actInForeground方法では、アプリケーションは、実際の試験を変更します
それはあることが判明しました:
もしXCUIApplication()状態!= .runningForeground { XCUIApplicationは()。活性化() }
読みます:
XCUIApplication(bundleIdentifier: "com.myapp.app")場合。!状態= .runningForeground { XCUIApplication(bundleIdentifier: "com.myapp.appは")。)(アクティブ }
だから、それぞれが、それが自動的にプルアップされますされていない場合、実際のアプリがフォアグラウンドで実行されているかを決定するためにテストされます。
もし上記の変換swiftmonkey後に杭を挿入する必要はありません。
別の例は、実際にそこだけ10.1以前XCTestFrameworkの使用を交換しない場合は良いAPIは、使用することはできませんが、XCTestれる前に情報を確認し、我々はこのAPIを置き換えることはできませんことを、XCEventGenerator上Xcode10.1がサポートされていません。更新、開発しやすくなり上向きではなく下向きに互換性があります。
あなたが公共のAPIを使用している場合、だから私は、テストをしたたくさん遅くありません。
たとえば、50回を実行するtapAction
公開API速度:約3~4秒アクションあたり約14秒
約5秒、約10秒のアクションあたり:プライベートAPI速度を用いて
ギャップに比べてスピードがまだ比較的大きいですが、個人的にテストは、非常にストレステストを追求する上で、する必要はなく、携帯電話のテストよりもアプリがない場合、ユーザーのアクションあたり3-4はアプリの通常の動作周波数を超えていることを感じて
変更することによってaddXCTestTapActionの方法を
それはあることが判明しました:
せセマフォ= DispatchSemaphore(値:0) !//自己.sharedXCEventGenerator.tapAtTouchLocations(位置、numberOfTaps:numberOfTaps、オリエンテーション:orientationValue){ // semaphore.signal() //} // semaphore.wait()
読みます:
#available IF(iOS9.0、*){ letapp = XCUIApplication() letcoordinate = app.coordinate(withNormalizedOffset:CGVector(DX:位置[0]・X /(app.frame.maxX / 2)、DY:位置[0 ] .Y /(app.frame.maxY / 2))) coordinate.tap() }他{ //フォールバック以前のバージョンに }
もちろん、単なるアイデアやテストの変化よりも、私たちは、プロジェクトに応じて改善を最適化する必要があるかもしれません。