独立 View 上的 iOS UI 测试

标签 ios swift xctest xcode-ui-testing

我正在尝试将 UI 测试合并到我的 iOS 项目中,但仍然困扰我的一件事是,您编写的所有测试似乎都必须从应用程序的开头开始,并逐步完成。例如,如果我想测试登录屏幕后面的 View ,我的测试必须首先在登录屏幕上运行,输入用户名/密码,单击登录,然后转到我要测试的 View 。理想情况下,登录 View 和下一个 View 的测试应该完全隔离。有没有办法做到这一点,或者我完全错过了 UI 测试背后的哲学?

最佳答案

绝对是!

您需要的是一个干净的应用程序环境,您可以在其中运行测试 - 一张白纸。

所有应用程序都有一个应用程序委托(delegate),它设置应用程序的初始状态并在启动时提供 Root View Controller 。出于测试的目的,您不希望发生这种情况 - 您需要能够单独进行测试,而不发生所有这些事情。理想情况下,您希望能够对屏幕进行测试,并且仅加载该屏幕,并且不会发生其他状态更改。

为此,您可以创建一个仅用于测试的实现 UIApplicationDelegate 的对象。您可以告诉应用程序在“测试模式”下运行,并使用启动参数来使用特定于测试的应用程序委托(delegate)。

objective-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]));
        }
    }
}

swift : 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 中设置方案的“测试”操作以提供启动参数:

Xcode Scheme editor

对于 UI 测试,您可以将启动参数设置为测试的一部分:

objective-C :

XCUIApplication *app = [[XCUIApplication alloc] init];
[app setLaunchArguments:@[@"org.quellish.UITestingEnabled"] ];
[app launch];

swift :

let app = XCUIApplication()
app.launchArguments = [ "org.quellish.UITestingEnabled" ]
app.launch()

这允许测试使用专门用于测试的应用程序委托(delegate)。这使您拥有很大的控制权——您现在有一个空白的石板可以用来进行测试。测试应用程序委托(delegate)可以加载特定的 Storyboard或放置一个空的 UIViewController 。作为 UI 测试的一部分,您可以实例化被测 View Controller 并将其设置为 keyWindow 的 Root View Controller 或以模态方式呈现它。添加或呈现后,您的测试就可以执行,完成后将其删除或关闭。

关于独立 View 上的 iOS UI 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34714593/

相关文章:

ios - 在 UIStackView 中调整包含图像的 subview

swift - jClouds Swift Bloblist NullPointerException

ios - 使用多个标签和开关处理 UITableViewCell 的可访问性

swift - 针对不同接口(interface)实现的共享 XCTest 单元测试

xcode - Swift - 使用 ObjectMapper 进行模型单元测试

ios - Xcode 6 storyboard unwin segue Action 未定义

ios - 如何进行代码后台下载?

xcode - 断言 UITest 中的按钮上存在图像

ios - 为什么在 performBatchUpdates 中对父 UIViewController 的强引用会泄漏事件?

ios - swift Appdelegate中的全局变量