8

我有 3 个屏幕,可以说,

  1. 登录
  2. 忘记密码
  3. 帮助屏幕

默认情况下,应用程序启动时会打开登录屏幕。单击忘记密码按钮时会显示忘记密码屏幕,单击帮助链接时会打开帮助屏幕。

我可以以某种方式直接打开忘记密码屏幕而不通过使用XCUITest单击按钮的过程吗?

我建议的内容与传递 adb 意图以直接打开视图相同。

4

1 回答 1

12

据我所知,您不能使用 XCUITest Framework 直接进入第二个屏幕。无论如何,文档指出:

UI 测试以与用户在不访问应用程序的内部方法、函数和变量的情况下执行相同的方式来测试应用程序的 UI。这使您的测试能够以与用户相同的方式查看应用程序,从而暴露用户遇到的 UI 问题。

这意味着如果您的应用程序的用户不能直接到达第二个屏幕,为什么您的 UI 可以测试。

我知道在运行测试时等待进入第二个屏幕非常耗时,但您可以绕过为每个测试编写它。要只编写一次,请在 XCTestCase 类中编写一个函数,在其中实现调用第二个屏幕并在setUp()方法中调用该函数。然后,每次运行测试时都会调用跳过第一个屏幕的过程,因为setUp()在每次测试运行之前都会调用方法。

编辑

阅读您的评论后,我可以想到一个 hacky 解决方案。您可以使用Launch Environment和/或Launch Arguments从测试中与您的应用程序进行通信。因此,在您的 XCTestCase 类中,设置参数和环境:

class ForgotPasswordUITest: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        app.launchArguments += ["UI-TESTING"]
        app.launchEnvironment["pageToGo"] = "forgotPassword"
        app.launch()
    }
}

然后,在您的 ViewController 中,编写这些计算属性:

var isUiTestingEnabled: Bool {
    get {
        return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
    }
}

var shouldShowForgotPassword: Bool {
    get {
        return ProcessInfo.processInfo.environment["pageToGo"] == "forgotPassword"
    }
}

var shouldShowHelpScreen: Bool {
    get {
        return ProcessInfo.processInfo.environment["pageToGo"] == "helpScreen"
    }
}

viewDidLoad()方法中,你可以有这样的东西:

    if isUiTestingEnabled {
        if shouldShowForgotPassword {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let secondViewController = storyboard.instantiateViewController(withIdentifier: "ForgotPasswordViewController")
            self.present(secondViewController, animated: true, completion: nil)
        } else if shouldShowHelpScreen {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let secondViewController = storyboard.instantiateViewController(withIdentifier: "HelpScreenViewController")
            self.present(secondViewController, animated: true, completion: nil)
        }
    }

注意:这是一个非常肮脏的 hack,不推荐使用这种方式编写 UI 测试。

于 2018-03-01T07:14:28.813 回答