24

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

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

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

4

4 回答 4

22

不是直截了当的方式。但是有一些解决方法。

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];
于 2015-09-02T13:25:36.120 回答
7

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

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

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"setUp()

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

于 2016-01-30T21:13:44.663 回答
5

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

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

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

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

于 2016-08-23T05:06:57.167 回答
0

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

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

于 2017-06-20T13:04:48.100 回答