苹果公司在Xcode 7中引入了新的UI测试,但每当测试启动应用程序时,我都会遇到麻烦,它从应用程序之前的数据开始。这意味着测试不能是独立的,而且可以受到其他测试的影响。
无法访问用户缺省值和其他数据,因为正在运行测试的应用程序无法访问测试应用程序的包。脚本也是没有问题的,因为它们可以在测试之前或之后运行。在每个测试套件之前,不可能在NSTask上执行iOS来运行脚本。
是否有办法在每个测试套件之前重置应用程序数据?
发布于 2015-09-02 13:25:36
不是直截了当的。但也有一些解决办法。
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];发布于 2016-01-30 21:13:44
如果在您的情况下为UITests在application:didFinishLaunchingWithOptions:中准备应用程序是可以的,那么您可以执行以下操作:
在扩展setUp()类的测试类的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"标志的参数,还可以为不同的测试用例指定不同的值--甚至是测试方法(但在这种情况下,您应该从测试方法而不是setUp()启动应用程序)。
注2:我建议将处理标志的代码包装到#if DEBUG块中。
发布于 2016-08-23 05:06:57
我需要重新设置应用程序数据,使用一些专用的头来访问跳板和设置应用程序。
首先,我添加了一个运行脚本阶段,以便在测试开始时删除它:
/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId
在此之后,我使用解决方案编写了here来删除它,使用运行在tearDown调用上的测试脚本来在每次测试后重置它。
https://stackoverflow.com/questions/32351149
复制相似问题