我应该如何使用由表单连接的多个视图来设计我的 UITest?
How should I be designing my UITests with multiple views that are joined by forms?
我不确定如何构建需要遍历多个视图的 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
中的所有代码,以及将遍历下一个视图的新代码,还是有更好的方法?
您可以使用启动参数或环境变量绕过设置(如登录)。在您的情况下,您可以通过测试传递访问令牌,然后在应用程序启动时 "catch" 它。
这是您编写的代码的更好版本
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
一个常用的架构是 Page Object pattern,正如链接 post 所解释的那样,它是关于将应用程序中页面的功能和状态封装到可重用的 类.
最近,Screenplay pattern 也获得了关注,这是一种更紧密地遵循 SOLID 原则的方法,尽管与页面对象相比,它的理解和使用稍微复杂一些。
我不确定如何构建需要遍历多个视图的 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
中的所有代码,以及将遍历下一个视图的新代码,还是有更好的方法?
您可以使用启动参数或环境变量绕过设置(如登录)。在您的情况下,您可以通过测试传递访问令牌,然后在应用程序启动时 "catch" 它。
这是您编写的代码的更好版本
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
一个常用的架构是 Page Object pattern,正如链接 post 所解释的那样,它是关于将应用程序中页面的功能和状态封装到可重用的 类.
最近,Screenplay pattern 也获得了关注,这是一种更紧密地遵循 SOLID 原则的方法,尽管与页面对象相比,它的理解和使用稍微复杂一些。