Is it possible to open a screen directly in XCUITest?

前端 未结 1 860
闹比i
闹比i 2020-12-19 05:06

I have 3 screens, lets say,

  1. Login
  2. Forgot Password
  3. Help screen

By default the Login screen open when the app starts. The Forgot

相关标签:
1条回答
  • 2020-12-19 05:25

    As far as I know, you can't go directly to the second screen using XCUITest Framework. Anyway, documentation states:

    UI testing exercises your app's UI in the same way that users do without access to your app's internal methods, functions, and variables. This enables your tests to see the app the same way a user does, exposing UI problems that users encounter.

    Which means that if user of your app can't reach the second screen directly, why could your UI tests.

    I know it's time consuming to wait to go to the second screen when you run your tests, but you can bypass writing it for every test. To write it only once, in your XCTestCase class write a function where you implement calling a second screen and call that function in setUp() method. Then, the process of skipping the first screen will be called every time you run a test because setUp() method is called before every test run.

    EDIT

    After reading your comment, I could think of one hacky solution. You can communicate with your app from your tests using Launch Environment and/or Launch Arguments. So, in your XCTestCase class, set up argument and environment:

    class ForgotPasswordUITest: XCTestCase {
        let app = XCUIApplication()
    
        override func setUp() {
            app.launchArguments += ["UI-TESTING"]
            app.launchEnvironment["pageToGo"] = "forgotPassword"
            app.launch()
        }
    }
    

    Then, in your ViewController, write these computed properties:

    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"
        }
    }
    

    And in viewDidLoad() method, you can have something like this:

        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)
            }
        }
    

    Note: this is a really dirty hack and it is not recommended way of writing UI tests.

    0 讨论(0)
提交回复
热议问题