如何在每次测试后使用Xcode 7 UI测试重置应用程序数据?

Tom*_*art 23 xcode ui-testing ios xcode7 xcode-ui-testing

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

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

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

Mat*_*ats 21

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

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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

另外-[XCTestCase setUp]:

XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
Run Code Online (Sandbox Code Playgroud)

  • 我如何在Swift中使用它? (3认同)

man*_*sar 6

如果为你的UITests准备应用程序application:didFinishLaunchingWithOptions:是好的,那么你可以做以下事情:

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

let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
Run Code Online (Sandbox Code Playgroud)

然后,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
}
Run Code Online (Sandbox Code Playgroud)

当然,如果这是你的选择.

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

注2:我建议将处理标志的代码包装成#if DEBUG块.


odm*_*odm 5

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

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

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

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