我应该如何设计由表单加入的多个视图的UITests?

问题描述 投票:0回答:1

我不知道该如何架构需要走过多个视图的UITest代码,每个视图都有自己的表单。

我正在为我的SwiftUI应用程序编写UITests。我刚刚写出了一个测试,正确地走过我的SignUpView,点击适当的字段,并输入信息。

但是,当这个SignUpView正确提交之后,它又进入了另一个有新字段的视图来输入数据......然后又进入了另一个有额外输入的视图......等等。

这就是我的SignUpView测试的样子。

func test_sign_up_view() {
    let app = XCUIApplication()
    app.launchArguments = LaunchArguments.launchLocalArguments
    app.launch()

    let bottom_text_button = app.buttons["To Signup Button"]
    bottom_text_button.tap()

    let first_name_field = app.textFields["Signup form first name field"]
    XCTAssertTrue(first_name_field.exists)
    first_name_field.tap()

    let first_name = "test"
    for letter in first_name {first_name_field.typeText(String(letter))}
    XCTAssertEqual(first_name_field.value as! String, first_name)

    let last_name_field = app.textFields["Signup form last name field"]
    XCTAssertTrue(last_name_field.exists)
    last_name_field.tap()

    let last_name = "test"
    for letter in last_name {last_name_field.typeText(String(letter))}
    XCTAssertEqual(last_name_field.value as! String, last_name)

    let phone_number_field = app.textFields["Signup form phone number field"]
    XCTAssertTrue(phone_number_field.exists)
    phone_number_field.tap()

    let phone_number = "+01234567890"
    for letter in phone_number {phone_number_field.typeText(String(letter))}
    XCTAssertEqual(phone_number_field.value as! String, phone_number)

    let email_field = app.textFields["Signup form email field"]
    XCTAssertTrue(email_field.exists)
    email_field.tap()

    let email = "[email protected]"
    for letter in email {email_field.typeText(String(letter))}
    XCTAssertEqual(email_field.value as! String, email)

    let signup_button = app.buttons["Signup Button"]
    XCTAssertTrue(signup_button.exists)
    signup_button.tap()

}

但现在,我想测试在按下signup_button后出现的视图。问题是,这个视图只有在SignUpView正确提交之后才可以查看。

我是否应该写一个全新的测试,并将我的 test_sign_up_view和新的代码一起走过下一个视图,还是有更好的方法?

swift swiftui xcode-ui-testing xctestcase
1个回答
2
投票

你可以用Launch Arguments或Environmental Variables绕过设置(比如签到)。在你的情况下,你可以用测试传递访问令牌,然后在应用程序启动时 "捕获 "它。


以下是你写的代码的更好版本

import XCTest

let app = XCUIApplication()

class signUpTests: XCTestCase {
    let bottomTextButton = app.buttons["To Signup Button"]
    let firstNameField = app.textFields["Signup form first name field"]
    let lastNameField = app.textFields["Signup form last name field"]
    let phoneNumberField = app.textFields["Signup form phone number field"]
    let emailField = app.textFields["Signup form email field"]
    let signupButton = app.buttons["Signup Button"]

    override func setUp() {
        app.launchArguments = LaunchArguments.launchLocalArguments
        app.launch()
    }

    func testSignUpView() {
        // Given
        let firstName = "test"
        let lastName = "test"
        let phoneNumber = "+01234567890"
        let email = "[email protected]"

        // When
        bottomTextButton.tap()
        firstNameField.slowType(firstName)
        lastNameField.slowType(lastName)
        phoneNumberField.slowType(phoneNumber)
        emailField.slowType(email)
        signupButton.tap()

        // Then
        // final assertions
    }
}

extension XCUIElement {
    func slowType(_ text: String) {
        tap()
        for letter in text {
            typeText(String(letter))
        }
        XCTAssertEqual(value as! String, text, "Unexpected value of XCUIElement")
    }
}

为了进一步改进,你可以使用ScreenObject(又名PageObject)模式。请看我在这里的实现,例如https:/github.comrzakharxctest-assignment。


1
投票

一个常用的架构是 页面对象模式正如链接的文章所解释的那样,它是关于将应用程序中页面的功能和状态封装成可重用的类。

最近, 剧本模式 也得到了广泛的应用,这是一种更加遵循SOLID原则的方法,不过相对于Page Object来说,它的理解和使用要复杂一些。

© www.soinside.com 2019 - 2024. All rights reserved.