如何在使用Xcode 7 UItesting进行每次testing后重置应用程序数据?

Apple在Xcode 7中引入了新的UItesting,但每当testing启动应用程序时,我都会感到困惑,因为它开始于应用程序之前的数据。 这意味着testing不能独立,可能受到其他testing的影响。

由于运行testing的应用程序无法访问testing应用程序的包,因此无法访问用户默认值和其他数据。 脚本也没有问题,因为它们可以在testing之前或之后运行。 而且如何在iOS上执行NSTask以在每个testing套件之前运行脚本是没有办法的。

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

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

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

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]; 

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

在扩展XCTestCase的testing类的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 } 

当然,如果这是你的select。

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

注2:我build议将处理该标志的代码封装到#if DEBUG块中。

我需要使用一些专用标题来重置应用程序数据以访问跳板和设置应用程序。

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

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

之后,我使用我在这里写的解决scheme,使用在tearDown调用上运行的testing脚本在每次testing后重置它。

在我的情况下,我还需要重置权限。 还有一个选项可以删除你的应用程序,并重置系统权限,只是让testing删除应用程序并导航到设置。

已经在这个SO线程中回答: 有没有办法在Xcode 7中的Swift XCTest UI中的testing之间重置应用程序?