首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Xcode 7 UI测试在每次测试后重置应用程序数据?

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

Stack Overflow用户
提问于 2015-09-02 10:49:57
回答 4查看 9K关注 0票数 24

苹果公司在Xcode 7中引入了新的UI测试,但每当测试启动应用程序时,我都会遇到麻烦,它从应用程序之前的数据开始。这意味着测试不能是独立的,而且可以受到其他测试的影响。

无法访问用户缺省值和其他数据,因为正在运行测试的应用程序无法访问测试应用程序的包。脚本也是没有问题的,因为它们可以在测试之前或之后运行。在每个测试套件之前,不可能在NSTask上执行iOS来运行脚本。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-02 13:25:36

不是直截了当的。但也有一些解决办法。

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

main.m文件的一个简单示例:

代码语言:javascript
复制
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]中添加:

代码语言:javascript
复制
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
票数 22
EN

Stack Overflow用户

发布于 2016-01-30 21:13:44

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

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

代码语言:javascript
复制
let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()

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

代码语言:javascript
复制
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块中。

票数 8
EN

Stack Overflow用户

发布于 2016-08-23 05:06:57

我需要重新设置应用程序数据,使用一些专用的头来访问跳板和设置应用程序。

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32351149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档