我应该如何设计我的 UITests 与表单连接的多个视图?

Posted

技术标签:

【中文标题】我应该如何设计我的 UITests 与表单连接的多个视图?【英文标题】:How should I be designing my UITests with multiple views that are joined by forms? 【发布时间】:2020-06-10 21:53:02 【问题描述】:

我不确定如何构建需要遍历多个视图的 UITest 代码,每个视图都有自己的表单。

我正在为我的 SwiftUI 应用程序编写 UITest。我刚刚编写了一个测试,该测试正确地遍历了我的 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 = "test@gmail.com"
    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 中的所有代码,以及将通过下一个视图的新代码,还是有更好的方法?

【问题讨论】:

您也不必检查您点击的元素是否存在,因为tap() 方法会自动检查是否存在 【参考方案1】:

您可以使用启动参数或环境变量绕过设置(例如登录)。在您的情况下,您可以通过测试传递访问令牌,然后在应用程序启动时“捕获”它。


这是您编写的代码的更好版本

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 = "test@gmail.com"

        // 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.com/rzakhar/xctest-assignment

【讨论】:

谢谢。我非常感谢重构,它确实会对我将来编写的测试产生影响。不过,这并不能真正解决我的问题,这可能是因为我是如何编写问题的,但我试图隔离我的视图,以便我可以测试不同的视图,而无需在每个视图之前遍历它以便到达我想测试的视图。例如,我不想测试 SignUpView 和 VerificationView 来测试我的 FinalizeView。我更愿意为每个视图分别编写一个测试。 添加了解决该问题的更多信息 酷,让它工作。 ***.com/questions/49020329/… 帮了大忙。【参考方案2】:

为此,一个常用的架构是Page Object pattern,正如链接中的帖子所解释的,它是将应用中页面的功能和状态封装到可重用的类中。

最近,Screenplay pattern 也获得了关注,这是一种更接近 SOLID 原则的方法,尽管与页面对象相比,它的理解和使用稍微复杂一些。

【讨论】:

以上是关于我应该如何设计我的 UITests 与表单连接的多个视图?的主要内容,如果未能解决你的问题,请参考以下文章

UITests - 如何在UITests中获取当前语言

UITests-如何在 UITests 中获取当前语言

使用 React 和 Django Rest 框架的多步表单处理

UITests:如何测试标签是不是在更改后包含一些文本?

将 Google Apps 表单与表格连接起来

带有所有选项复选框的多对多 MS 访问表单