Ios Xcode UI测试-使用存储的凭据登录/注销
我想在iOS应用程序(Xcode 7.2.1)中运行登录过程的功能(UI)测试 该应用程序的行为是,成功登录后,将存储用户凭据,以便在下次启动时自动登录(不显示登录屏幕) 因此,我在登录屏幕中设置了一系列UI事件,以便在应用程序首次在iOS模拟器中启动时通过登录测试。 但是,下次我运行测试时会失败,因为登录屏幕甚至没有按预期显示 我在这里看到两种选择,它们似乎都不适合:Ios Xcode UI测试-使用存储的凭据登录/注销,ios,objective-c,xcode,ios-simulator,xcode-ui-testing,Ios,Objective C,Xcode,Ios Simulator,Xcode Ui Testing,我想在iOS应用程序(Xcode 7.2.1)中运行登录过程的功能(UI)测试 该应用程序的行为是,成功登录后,将存储用户凭据,以便在下次启动时自动登录(不显示登录屏幕) 因此,我在登录屏幕中设置了一系列UI事件,以便在应用程序首次在iOS模拟器中启动时通过登录测试。 但是,下次我运行测试时会失败,因为登录屏幕甚至没有按预期显示 我在这里看到两种选择,它们似乎都不适合: 每次运行测试前,使用脚本重置iOS模拟器的内容和设置。我尝试在测试目标的构建阶段添加运行脚本阶段,使用:xcrun-simct
构建阶段添加运行脚本
阶段,使用:xcrun-simctl-shutdown-booted&&xcrun-simctl-erase-all&&killall“模拟器”
,它似乎不起作用(模拟器应用程序不启动,测试卡住)
-(void)拆卸中包含一些代码以清除存储的用户凭据。此选项也不好,因为它不仅在每个测试方法之间运行(不是每次测试启动),而且似乎我没有权限访问用于清除用户凭据的AuthManager
类
当用户界面测试这样的登录过程时,你会怎么做?我遇到过同样类型的问题。经过一系列的抨击之后,我最好的方法就是尽量让事情简单一点。在我流泪的时候,我总是“放松”我可能做过的任何事情。有时这是一种过分的做法,但仍然是一种良好的做法。我在展开时发现了很多bug,如果我做了一些硬重置,我可能会忽略它们。IE:我将导航回主页(我的起点),如果我已经登录,那么我只需注销即可。作为记录,在应用程序端,当用户注销时,他们的凭据将被剥离 例如,在我的SignInTests.swift类中,我将所有方法放在同一个类文件的扩展名中。这样我就可以简单地调用SignInTests().signIn()或SignInTests().signOut(),这样我就可以从调用signOut()的任何其他测试类访问它们 这是我最适合我的场景。也许这不是你的最佳选择,但我希望它能为你指明正确的方向 我们(在我的公司)的答案是创建一个名为ContainerResettingUITest的XCTestCase扩展。我们传入一系列附加的启动参数,这些参数覆盖安装程序(而不是tearDown),然后传入main(),如果这些启动参数传入,我们将取消docs目录、keychain和nsuserdefaults中的所有内容 有点核的选择。不要意外地通过了那场发射辩论
希望这能回答你的问题;我使用它的原因与您想要它的原因完全相同,即具有完全未受污染的登录和注册测试。当您从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 = []
好办法。我想我没有想到的是通过UI实际注销的选项。我一直试图按程序退出,但没有成功。谢谢尽管如此,我还是希望看到一种真正重置应用程序/模拟器的方法——尽管你的方法可以捕获注销错误,但它也会污染登录测试(因为我们正在处理注销过程留下的某些状态),我完全同意。希望在将来的版本中有这样一个简单的选项。