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

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

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

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

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

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

  • 每次运行测试前,使用脚本重置iOS模拟器的内容和设置。我尝试在测试目标的
    构建阶段添加
    运行脚本
    阶段,使用:
    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实际注销的选项。我一直试图按程序退出,但没有成功。谢谢尽管如此,我还是希望看到一种真正重置应用程序/模拟器的方法——尽管你的方法可以捕获注销错误,但它也会污染登录测试(因为我们正在处理注销过程留下的某些状态),我完全同意。希望在将来的版本中有这样一个简单的选项。