我有3个屏幕,可以说,
默认情况下,启动应用程序时将打开“登录”屏幕。单击“忘记密码”按钮时,将显示“忘记密码”屏幕,并且在单击“帮助”链接时将打开“帮助”屏幕。
我可以通过某种方式直接打开“忘记密码”屏幕,而无需执行使用 XCUITest 单击按钮的过程吗?
我建议与通过adb直接打开View的意图相同的内容。
据我所知,您不能使用XCUITest Framework直接进入第二个屏幕。无论如何,文档指出:
UI测试的执行方式与用户无需访问应用程序的内部方法,函数和变量的方式相同。这使您的测试可以以与用户相同的方式查看应用程序,从而暴露出用户遇到的UI问题。
这意味着如果您的应用程序用户无法直接到达第二个屏幕,为什么您的UI会进行测试。
我知道在运行测试时等待进入第二个屏幕很耗时,但是您可以跳过为每个测试编写它的过程。要只编写一次,请在XCTestCase类中编写一个函数,在其中实现调用第二个屏幕并在setUp()方法中调用该函数。然后,每次运行测试时都会调用跳过第一个屏幕的过程,因为setUp()在每次测试运行之前都会调用方法。
setUp()
编辑
阅读您的评论后,我可以想到一种解决方案。您可以使用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()方法中,您可以具有以下内容:
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) } }
注意 :这是一个非常肮脏的技巧,不建议您编写UI测试的方法。