UIテストsetUp()
で、XCUIApplication
インスタンスに属性を設定しようとしました
let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()
didFinishLaunch
でUITestを実行するときにこれらを画面に表示しようとしました
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if launchOptions != nil {
for (key, value) in launchOptions! {
let alertView = UIAlertView(title: key.description, message: value.description, delegate: nil, cancelButtonTitle: "ok")
alertView.show()
}
}
しかし、設定した引数と環境を見つけることができないようです。誰でもそれらを手に入れる方法を知っていますか?
UIテスト(Swift)でlaunchArguments
を設定した場合:
_let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
_
次に、以下を使用してアプリでそれらを読み取ります。
Swift 2.x:
_if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
// Do snapshot setup
}
_
Swift 3.
_if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
_
環境変数を設定するには、代わりにそれぞれlaunchEnvironment
とNSProcessInfo.processInfo().environment
を使用します。
Joey C.の答えに基づいて、アプリで生の文字列を使用しないようにするための小さな拡張機能を作成しました。これにより、タイプミスの問題を回避し、オートコンプリートを取得できます。
extension NSProcessInfo {
/**
Used to recognized that UITestings are running and modify the app behavior accordingly
Set with: XCUIApplication().launchArguments = [ "isUITesting" ]
*/
var isUITesting: Bool {
return arguments.contains("isUITesting")
}
/**
Used to recognized that UITestings are taking snapshots and modify the app behavior accordingly
Set with: XCUIApplication().launchArguments = [ "isTakingSnapshots" ]
*/
var isTakingSnapshots: Bool {
return arguments.contains("isTakingSnapshots")
}
}
この方法で使用できます
if NSProcessInfo.processInfo().isUITesting {
// UITesting specific behavior,
// like setting up CoreData with in memory store
}
さらに進むと、おそらくlaunchArgumentsを設定するときにUITestで再利用できる列挙にさまざまな引数を入れる必要があります。
LaunchArgumentsとObjective-Cの例を次に示します。
if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
//do snapshot;
}
迅速:
let arguments = ProcessInfo.processInfo.arguments
if arguments.contains("SNAPSHOT") {
//do snapshot
}
XCUIApplication.launchArguments
に渡される引数はUserDefaults
からも利用できることに注意することも興味深いです。
XCTestCaseで
let app = XCUIApplication()
app.launchArguments.append("-ToggleFeatureOne")
app.launchArguments.append("true")
app.launch()
テスト対象のターゲットで
UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true
ここから、UserDefaults
に拡張機能を作成して、実行時の便利な切り替えを提供できます。
これは、Xcodeスキームの「起動時に渡される引数」が使用するメカニズムと同じです。起動引数とUserDefaults
への影響は、 設定と設定プログラミングガイド で説明されています。
起動引数には、2つの別個の引数として渡します。
let app = XCUIApplication()
app.launchArguments.append("-arg")
app.launchArguments.append("val")
app.launch()
here から取得。
いくつかの詳細に留意してください。まず、XCUIApplictionはシングルトンではないため、XCUIApplication().arguments.append("myargument")
を呼び出してからXCUIApplication().launch()
を呼び出すと、引数は送信されません。 ここで確認してください 。
第二に、アプリを起動した後に引数を変更しても機能しない場合、新しい引数が次の実行に送信されます。
私はこれがObjective-Cでどのように機能するかを知っています
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
スキーマからXCUITesに環境変数を渡す必要がある場合、XCTestCase-> app.launchEnvironmentオブジェクトを、この方法の各テストクラスで変更します。
Swift
override func setUp(){
app.launchEnvironment = ProcessInfo.processInfo.environment
}