我有3个屏幕,让我们说,
默认情况下,应用程序启动时会打开“登录”屏幕。单击“忘记密码”按钮时会显示“忘记密码”屏幕,单击“帮助”链接时会打开“帮助”屏幕。
我可以以某种方式直接打开忘记密码屏幕而无需使用 XCUITest 单击按钮的程序吗?
我建议使用与直接打开View的adb意图相同的行。
答案 0 :(得分:4)
据我所知,您无法使用XCUITest Framework直接进入第二个屏幕。无论如何,documentation表示:
用户界面测试以与用户无法访问应用内部方法,功能和变量相同的方式运行您应用的用户界面。这使您的测试能够以与用户相同的方式查看应用程序,从而暴露用户遇到的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)
}
}
注意:这是一个非常脏的黑客,不推荐编写UI测试的方法。