Xcode UI测试 - 使用存储的凭据登录/注销

问题描述 投票:6回答:3

我想在我的iOS应用程序(Xcode 7.2.1)中运行登录过程的功能(UI)测试。

应用程序的行为是,成功登录后,将存储用户凭据,以便在下次启动时自动登录(不显示登录屏幕)。

因此,我在登录屏幕中设置了一系列UI事件,以便在iOS模拟器中首次启动应用程序时通过登录测试。但是,下次我运行我的测试将失败,因为登录屏幕甚至没有按预期显示。

我在这里看到两个选项,它们似乎都不合适:

  1. 在每次测试运行之前,使用脚本重置iOS模拟器的内容和设置。我尝试在测试目标的Run Script中添加Build Phases阶段:xcrun simctl shutdown booted && xcrun simctl erase all && killall "Simulator",它似乎不起作用(模拟器应用程序不启动,测试卡住)。
  2. -(void)tearDown中包含一些代码以清除存储的用户凭据。这个选项不好,因为它不仅在每个测试方法之间运行(不是每次测试启动),而且似乎我无法访问用于清除用户凭据的AuthManager类。

在UI测试这样的登录程序时你会怎么做?

ios objective-c xcode ios-simulator xcode-ui-testing
3个回答
3
投票

我遇到过相同类型的问题。经过一番抨击我最好的方法是尝试让事情变得更简单。在我的撕裂中,我总是“放松”我可能做过的任何事情。有时它太过分了,但它仍然是很好的做法。如果我做了某种硬重置,我在放松的时候发现了许多错误,我可能会忽略它们。 IE:我将导航回主页(我的起点),如果我已登录,那么我只需退出即可。为了记录,当用户注销时,在应用程序端,他们的凭据被剥离。

例如,在我的SignInTests.swift类中,我将所有方法放在同一个类文件的扩展中。这样我就可以简单地调用SignInTests()。signIn()或SignInTests()。signOut(),这样我就可以从任何其他可能调用signOut()的测试类中访问它们。

这是我的场景,对我来说非常合适。可能不是你的最佳选择,但我希望它指出你正确的方向。


2
投票

我们的答案(在我的公司)是创建一个名为ContainerResettingUITest的XCTestCase扩展。我们传递了一系列额外的启动参数,它们覆盖了setUp(而不是tearDown),然后在main()中传递了那些启动参数,我们在docs目录,keychain和nsuserdefaults中查找了所有内容。

有点核选择。不要偶然传递那个启动参数。

希望能回答你的问题;我使用它的原因与您似乎想要它完全相同,完全没有受到污染的登录和注册测试。


1
投票

当您从XCTestCase运行您的应用程序时,您可以使用这样的东西

let app = XCUIApplication()
app.launchArguments.append("--uitesting")
app.launch()

并在AppDelegate方法

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

if CommandLine.arguments.contains("--uitesting") {
    clear()
} 

需要登录时,在第一次测试中运行此命令。在下一个测试中,您可以从launchArguments中清除数据。

app.launchArguments = []
© www.soinside.com 2019 - 2024. All rights reserved.