新增完整 UI Test 回归套件,并完善启动隔离逻辑。
按模块拆分 XCUITest 用例与 Support 基础设施,UI Test 运行时跳过推送与排队 WebSocket,并将 Podfile 最低版本对齐 iOS 16。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
26
suixinkanUITests/Modules/InviteUITests.swift
Normal file
26
suixinkanUITests/Modules/InviteUITests.swift
Normal file
@ -0,0 +1,26 @@
|
||||
//
|
||||
// InviteUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class InviteUITests: AuthenticatedUITestCase {
|
||||
/// 测试邀请页与邀请记录页。
|
||||
func testInviteAndRecordPages() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "注册邀请", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("摄影师邀请", in: app)
|
||||
|
||||
let recordEntry = app.application.staticTexts.matching(NSPredicate(format: "label CONTAINS '邀请记录'")).firstMatch
|
||||
if recordEntry.waitForExistence(timeout: 6) {
|
||||
recordEntry.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("邀请记录", in: app)
|
||||
} else {
|
||||
BackNavigator.goBack(app: app)
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "邀请记录", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("邀请记录", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
29
suixinkanUITests/Modules/LiveUITests.swift
Normal file
29
suixinkanUITests/Modules/LiveUITests.swift
Normal file
@ -0,0 +1,29 @@
|
||||
//
|
||||
// LiveUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class LiveUITests: AuthenticatedUITestCase {
|
||||
/// 测试直播管理列表与创建页。
|
||||
func testLiveManagementAndCreatePage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "直播管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("直播管理", in: app)
|
||||
|
||||
let addButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '添加'")).firstMatch
|
||||
if addButton.waitForExistence(timeout: 6) {
|
||||
addButton.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("添加直播", in: app)
|
||||
BackNavigator.goBack(app: app)
|
||||
}
|
||||
}
|
||||
|
||||
/// 测试直播相册页可打开。
|
||||
func testLiveAlbumPage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "直播相册", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("直播相册", in: app)
|
||||
}
|
||||
}
|
||||
26
suixinkanUITests/Modules/LocationReportUITests.swift
Normal file
26
suixinkanUITests/Modules/LocationReportUITests.swift
Normal file
@ -0,0 +1,26 @@
|
||||
//
|
||||
// LocationReportUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class LocationReportUITests: AuthenticatedUITestCase {
|
||||
/// 测试位置上报与历史记录页。
|
||||
func testLocationReportAndHistory() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "位置上报", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("位置上报", in: app)
|
||||
|
||||
let historyEntry = app.application.staticTexts.matching(NSPredicate(format: "label CONTAINS '历史'")).firstMatch
|
||||
if historyEntry.waitForExistence(timeout: 6) {
|
||||
historyEntry.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("位置上报历史", in: app)
|
||||
} else {
|
||||
BackNavigator.goBack(app: app)
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "定位上报历史", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("位置上报历史", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
21
suixinkanUITests/Modules/MessageCenterUITests.swift
Normal file
21
suixinkanUITests/Modules/MessageCenterUITests.swift
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// MessageCenterUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class MessageCenterUITests: AuthenticatedUITestCase {
|
||||
/// 测试消息中心列表可展示并尝试进入详情。
|
||||
func testMessageCenterListAndDetail() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "消息中心", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("消息中心", in: app)
|
||||
|
||||
let firstCell = app.application.cells.element(boundBy: 0)
|
||||
if firstCell.waitForExistence(timeout: 8) {
|
||||
firstCell.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("消息详情", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
28
suixinkanUITests/Modules/PilotCertificationUITests.swift
Normal file
28
suixinkanUITests/Modules/PilotCertificationUITests.swift
Normal file
@ -0,0 +1,28 @@
|
||||
//
|
||||
// PilotCertificationUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class PilotCertificationUITests: AuthenticatedUITestCase {
|
||||
/// 测试飞手认证表单校验与验证码按钮。
|
||||
func testPilotCertificationValidation() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "飞手认证", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("飞手认证", in: app)
|
||||
|
||||
let submitButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '提交'")).firstMatch
|
||||
if submitButton.waitForExistence(timeout: 6) {
|
||||
submitButton.tap()
|
||||
}
|
||||
|
||||
XCTAssertTrue(
|
||||
app.application.staticTexts.matching(NSPredicate(format: "label CONTAINS '请'")).firstMatch
|
||||
.waitForExistence(timeout: 4)
|
||||
)
|
||||
|
||||
let smsButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '验证码'")).firstMatch
|
||||
XCTAssertTrue(smsButton.exists)
|
||||
}
|
||||
}
|
||||
29
suixinkanUITests/Modules/ProjectsUITests.swift
Normal file
29
suixinkanUITests/Modules/ProjectsUITests.swift
Normal file
@ -0,0 +1,29 @@
|
||||
//
|
||||
// ProjectsUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class ProjectsUITests: AuthenticatedUITestCase {
|
||||
/// 测试摄影师项目列表与新建页。
|
||||
func testProjectManagementCreatePage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "项目管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("项目管理", in: app)
|
||||
|
||||
let createButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '新建'")).firstMatch
|
||||
if createButton.waitForExistence(timeout: 6) {
|
||||
createButton.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("新建项目", in: app)
|
||||
BackNavigator.goBack(app: app)
|
||||
}
|
||||
}
|
||||
|
||||
/// 测试店铺项目管理页可打开。
|
||||
func testStoreProjectManagementPage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "店铺项目管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("店铺项目管理", in: app)
|
||||
}
|
||||
}
|
||||
21
suixinkanUITests/Modules/PunchPointUITests.swift
Normal file
21
suixinkanUITests/Modules/PunchPointUITests.swift
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// PunchPointUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class PunchPointUITests: AuthenticatedUITestCase {
|
||||
/// 测试打卡点列表与新建页。
|
||||
func testPunchPointListAndCreatePage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "打卡点管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("打卡点管理", in: app)
|
||||
|
||||
let createButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '新增'")).firstMatch
|
||||
if createButton.waitForExistence(timeout: 6) {
|
||||
createButton.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("新增打卡点", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
21
suixinkanUITests/Modules/QueueManagementUITests.swift
Normal file
21
suixinkanUITests/Modules/QueueManagementUITests.swift
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// QueueManagementUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class QueueManagementUITests: AuthenticatedUITestCase {
|
||||
/// 测试排队管理首页与设置页。
|
||||
func testQueueManagementAndSettings() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "排队管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("排队管理", in: app)
|
||||
|
||||
let settingsEntry = app.application.staticTexts.matching(NSPredicate(format: "label CONTAINS '设置'")).firstMatch
|
||||
if settingsEntry.waitForExistence(timeout: 6) {
|
||||
settingsEntry.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("排队设置", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
21
suixinkanUITests/Modules/ScheduleUITests.swift
Normal file
21
suixinkanUITests/Modules/ScheduleUITests.swift
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// ScheduleUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class ScheduleUITests: AuthenticatedUITestCase {
|
||||
/// 测试日程管理页与新增排班页。
|
||||
func testScheduleManagementAndAddPage() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "日程管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("日程管理", in: app)
|
||||
|
||||
let addButton = app.application.buttons.matching(NSPredicate(format: "label CONTAINS '添加'")).firstMatch
|
||||
if addButton.waitForExistence(timeout: 6) {
|
||||
addButton.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("添加日程", in: app)
|
||||
}
|
||||
}
|
||||
}
|
||||
32
suixinkanUITests/Modules/TasksUITests.swift
Normal file
32
suixinkanUITests/Modules/TasksUITests.swift
Normal file
@ -0,0 +1,32 @@
|
||||
//
|
||||
// TasksUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class TasksUITests: AuthenticatedUITestCase {
|
||||
/// 测试任务列表可进入详情,发布任务页可打开。
|
||||
func testTaskListDetailAndCreateValidation() throws {
|
||||
openTaskManagement()
|
||||
|
||||
let firstCell = app.application.cells.element(boundBy: 0)
|
||||
if firstCell.waitForExistence(timeout: 10) {
|
||||
firstCell.tap()
|
||||
NavigationAssertions.waitForNavigationTitle("任务详情", in: app)
|
||||
BackNavigator.goBack(app: app)
|
||||
} else {
|
||||
throw XCTSkip("测试账号暂无任务数据,跳过详情流测试。")
|
||||
}
|
||||
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "发布任务", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("发布任务", in: app)
|
||||
}
|
||||
|
||||
private func openTaskManagement() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "任务管理", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("任务管理", in: app)
|
||||
}
|
||||
}
|
||||
42
suixinkanUITests/Modules/WalletUITests.swift
Normal file
42
suixinkanUITests/Modules/WalletUITests.swift
Normal file
@ -0,0 +1,42 @@
|
||||
//
|
||||
// WalletUITests.swift
|
||||
// suixinkanUITests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
final class WalletUITests: AuthenticatedUITestCase {
|
||||
/// 测试钱包首页与提现表单校验。
|
||||
func testWalletWithdrawValidation() {
|
||||
openWallet()
|
||||
|
||||
app.application.staticTexts["提现"].tap()
|
||||
NavigationAssertions.waitForNavigationTitle("提现申请", in: app)
|
||||
|
||||
let submitButton = app.application.buttons["提交提现申请"]
|
||||
XCTAssertTrue(submitButton.waitForExistence(timeout: 6))
|
||||
submitButton.tap()
|
||||
XCTAssertTrue(
|
||||
app.application.staticTexts["请输入提现金额"].waitForExistence(timeout: 4)
|
||||
|| app.application.staticTexts.matching(NSPredicate(format: "label CONTAINS '金额'")).firstMatch.exists
|
||||
)
|
||||
}
|
||||
|
||||
/// 测试银行卡与积分兑换二级页可打开。
|
||||
func testWalletSecondaryPages() {
|
||||
openWallet()
|
||||
|
||||
app.application.staticTexts["银行卡"].tap()
|
||||
NavigationAssertions.waitForNavigationTitle("银行卡设置", in: app)
|
||||
BackNavigator.goBack(app: app)
|
||||
|
||||
app.application.staticTexts["积分兑换"].tap()
|
||||
NavigationAssertions.waitForNavigationTitle("积分兑换", in: app)
|
||||
}
|
||||
|
||||
private func openWallet() {
|
||||
DebugMenuNavigator.open(app: app)
|
||||
DebugMenuNavigator.tapMenu(title: "我的钱包", app: app)
|
||||
NavigationAssertions.waitForNavigationTitle("我的钱包", in: app)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user