【问题标题】:How do I reset the application data after each test with Xcode 7 UI Testing?每次使用 Xcode 7 UI 测试进行测试后,如何重置应用程序数据?
【发布时间】:2015-11-27 20:14:28
【问题描述】:

Apple 在 Xcode 7 中引入了新的 UI 测试,但每当测试启动应用程序时,我都会遇到困难,它从应用程序以前拥有的数据开始。这意味着测试不能独立,并且可以受到其他测试的影响。

无法访问用户默认值和其他数据,因为正在运行测试的应用程序无法访问被测试应用程序的捆绑包。脚本也是毫无疑问的,因为它们可以在测试之前或之后运行。并且没有办法在 iOS 上执行 NSTask 来在每个测试套件之前运行一个脚本。

有没有办法在每个测试套件之前重置应用程序数据?

【问题讨论】:

    标签: ios xcode xcode7 ui-testing xcode-ui-testing


    【解决方案1】:

    不是直接的方式。但是有一些解决方法。

    XCUIApplication 可以设置可以改变应用程序行为的命令行参数和环境变量。

    main.m 文件的简单示例:

    int main(int argc, char * argv[]) {
    #if DEBUG
        // Reset all data for UI Testing
        @autoreleasepool {
            for (int i = 1; i < argc; ++i) {
                if (0 == strcmp("--reset-container", argv[i])) {
                    NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
                    NSFileManager *fm = [[NSFileManager alloc] init];
                    for (NSString *path in folders) {
                        [fm removeItemAtPath:path error:nil];
                    }
                    // Also remove documents folder if necessary...
                }
            }
        }
    #endif
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil,
                                     NSStringFromClass([AppDelegate class]));
        }
    }
    

    并在-[XCTestCase setUp] 中添加:

    XCUIApplication *app = [[XCUIApplication alloc] init];
    app.launchArguments = @[@"--reset-container"];
    [app launch];
    

    【讨论】:

    • 是的,我也在考虑这个,但我希望有更好的解决方案。最后,我决定扩展您的解决方案,以包括其他地方和用户默认值。
    • @TomášLinhart:你能分享你的解决方案吗?
    • 如何在 Swift 中使用它?
    【解决方案2】:

    如果在您的情况下为 application:didFinishLaunchingWithOptions: 内的 UITests 准备应用程序是可以的,那么您可以执行以下操作:

    在扩展XCTestCase 的测试类的setUp() 方法中添加以下代码:

    let application = XCUIApplication()
    application.launchEnvironment = ["UITESTS":"1"]
    application.launch()
    

    然后,在application:didFinishLaunchingWithOptions: 中,您可以使用以下代码检查标志:

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    
        let env = ProcessInfo.processInfo.environment
        if let uiTests = env["UITESTS"], uiTests == "1" {
            // do anything you want
        }
        // further set up code
    }
    

    当然,如果这是您的选择。

    注意:不要将"1" 设置为"UITESTS" 标志的参数,您可以为不同的测试用例甚至测试方法指定不同的值(但在这种情况下,您应该从测试方法启动应用程序,而不是@ 987654329@)

    注意 2:我建议将处理标志的代码包装到 #if DEBUG 块中。

    【讨论】:

      【解决方案3】:

      我必须使用一些私有标头重置应用程序数据以访问跳板和设置应用程序。

      首先我添加了一个运行脚本阶段以在测试开始时将其删除:

      /usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId

      之后,我使用我编写的解决方案 here 删除它,使用运行在 tearDown 调用上的测试脚本在每次测试后重置它。

      【讨论】:

        【解决方案4】:

        就我而言,我还需要重置权限。并且有一个选项可以删除您的应用程序并重置系统权限,只需让测试删除应用程序并导航到设置。

        已在此 S.O. 中回答。线程:Is there a way to reset the app between tests in Swift XCTest UI in Xcode 7?

        【讨论】:

          猜你喜欢
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          • 2016-05-06
          • 1970-01-01
          • 2015-12-10
          • 2019-01-01
          • 2015-12-07
          • 1970-01-01
          相关资源
          最近更新 更多