绝对!
您需要的是一个干净的应用程序环境,您可以在其中运行您的测试 - 一张白纸。
所有应用程序都有一个应用程序委托,它设置应用程序的初始状态并在启动时提供一个根视图控制器。出于测试的目的,您不希望这种情况发生 - 您需要能够独立测试,而不会发生所有这些事情。理想情况下,您希望能够对屏幕进行欠测,并且只加载该屏幕,而不会发生其他状态更改。
为此,您可以创建一个仅用于实现UIApplicationDelegate 的测试对象。您可以告诉应用程序在“测试模式”下运行,并使用启动参数使用特定于测试的应用程序委托。
目标-C:
main.m:
int main(int argc, char * argv[]) {
NSString * const kUITestingLaunchArgument = @"org.quellish.UITestingEnabled";
@autoreleasepool {
if ([[NSUserDefaults standardUserDefaults] valueForKey:kUITestingLaunchArgument] != nil){
return UIApplicationMain(argc, argv, nil, NSStringFromClass([TestingApplicationDelegate class]));
} else {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([ProductionApplicationDelegate class]));
}
}
}
斯威夫特:
main.swift:
let kUITestingLaunchArgument = "org.quellish.UITestingEnabled"
if (NSUserDefaults.standardUserDefaults().valueForKey(kUITestingLaunchArgument) != nil){
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(TestingApplicationDelegate))
} else {
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))
}
您必须从您的 Swift 类中删除任何 @UIApplicationMain 注释。
对于“应用程序测试”,请务必在 Xcode 中设置方案的“测试”操作以提供启动参数:
对于 UI 测试,您可以将启动参数设置为测试的一部分:
目标-C:
XCUIApplication *app = [[XCUIApplication alloc] init];
[app setLaunchArguments:@[@"org.quellish.UITestingEnabled"] ];
[app launch];
斯威夫特:
let app = XCUIApplication()
app.launchArguments = [ "org.quellish.UITestingEnabled" ]
app.launch()
这允许测试使用专门用于测试的应用程序委托。这为您提供了很多控制权——您现在可以使用一张白纸进行测试。测试应用程序委托可以加载特定的故事板或放置一个空的UIViewController。作为 UI 测试的一部分,您可以实例化被测视图控制器并将其设置为keyWindow 的根视图控制器或以模态方式呈现它。一旦它被添加或呈现,您的测试就可以执行,完成后删除或关闭它。