Xcode UI 使用登录系统测试
Xcode UI tests with login system
我有一个带有登录系统的应用程序,所以一旦用户登录该应用程序,我就会将他们的会话存储在本地数据库中,这样可以防止用户每次使用该应用程序时都必须登录。显然,如果用户尚未登录,应用程序会显示 LoginViewController
,但如果应用程序检测到用户的当前会话,则会显示 HomeViewController
。
我已经为我的 HomeViewController
创建了一些测试,它们都运行良好。但是,我意识到它们工作正常,因为该应用程序当前存储了一个会话。如果我进入应用程序并注销当前用户,当我 运行 和 UI 测试时,它们将失败。这是有道理的,因为测试期望显示 HomeViewController
,而不是显示 LoginViewController
。
考虑到我还想为 LoginViewController
创建 UI 测试,创建一个解决方案似乎是合理的,在每个测试中,我设置用户是否登录.我该怎么做?
经过一些研究,在 XCUIApplication
启动 arguments/environments 找到了答案。这允许您在执行测试时发送某些配置,稍后可以由您的主代码解释。
为了让我的案例生效,我放置了以下代码:
// UI Test
func testWelcomeIsShown() {
let app = XCUIApplication()
app.launchArguments.append("isUITestingLogin")
app.launch()
// Rest of your test steps
}
// AppDelegate or wherever you fetch your current session
func getCurrentSession() {
if NSProcessInfo.processInfo().arguments.contains("isUITestingLogin") {
session = nil
} else {
session = DatabaseManager.getSession()
}
}
注意:此代码将用于记录和执行您的测试。但是,如果您确实有多个具有相同逻辑的测试,您可能会将 testWelcomeIsShown()
的前 3 行移动到测试 class 的 setUp()
。不过需要注意的是,这个设置在录制测试的时候并没有执行,所以你需要手动设置一个没有当前会话的环境。
您也可以使用 SBTUITestTunnel,除其他外,它允许您将文件从测试目标上传到应用程序的沙箱。准备一个带有预填充登录信息的数据库就足够了,然后在启动时将其发送到应用程序的目标。
库的美妙之处在于应用程序的代码不会被测试代码污染。
我有一个带有登录系统的应用程序,所以一旦用户登录该应用程序,我就会将他们的会话存储在本地数据库中,这样可以防止用户每次使用该应用程序时都必须登录。显然,如果用户尚未登录,应用程序会显示 LoginViewController
,但如果应用程序检测到用户的当前会话,则会显示 HomeViewController
。
我已经为我的 HomeViewController
创建了一些测试,它们都运行良好。但是,我意识到它们工作正常,因为该应用程序当前存储了一个会话。如果我进入应用程序并注销当前用户,当我 运行 和 UI 测试时,它们将失败。这是有道理的,因为测试期望显示 HomeViewController
,而不是显示 LoginViewController
。
考虑到我还想为 LoginViewController
创建 UI 测试,创建一个解决方案似乎是合理的,在每个测试中,我设置用户是否登录.我该怎么做?
经过一些研究,在 XCUIApplication
启动 arguments/environments 找到了答案。这允许您在执行测试时发送某些配置,稍后可以由您的主代码解释。
为了让我的案例生效,我放置了以下代码:
// UI Test
func testWelcomeIsShown() {
let app = XCUIApplication()
app.launchArguments.append("isUITestingLogin")
app.launch()
// Rest of your test steps
}
// AppDelegate or wherever you fetch your current session
func getCurrentSession() {
if NSProcessInfo.processInfo().arguments.contains("isUITestingLogin") {
session = nil
} else {
session = DatabaseManager.getSession()
}
}
注意:此代码将用于记录和执行您的测试。但是,如果您确实有多个具有相同逻辑的测试,您可能会将 testWelcomeIsShown()
的前 3 行移动到测试 class 的 setUp()
。不过需要注意的是,这个设置在录制测试的时候并没有执行,所以你需要手动设置一个没有当前会话的环境。
您也可以使用 SBTUITestTunnel,除其他外,它允许您将文件从测试目标上传到应用程序的沙箱。准备一个带有预填充登录信息的数据库就足够了,然后在启动时将其发送到应用程序的目标。
库的美妙之处在于应用程序的代码不会被测试代码污染。