ios - 是否可以对单个 Swift UI 组件进行 UI 测试?
问题描述
我对 Swift 和 SwiftUI 非常陌生,并且我已经使用 SwiftUI 开始了一个新项目。我在其他基于组件的 web 库方面有一些经验,我想要一种方法来使用相同的模式进行 iOS 开发。
有没有办法在 SwiftUI 中对单个组件进行 ui 测试?例如,我创建了一个接受坐标并呈现地图的 Map 组件,我想通过让应用程序立即呈现该组件来单独测试此地图。这是我目前的代码和测试代码:
// App.swift (main)
// Map is not rendered yet
@main
struct PicksApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
// MyMap.swift
struct MyMap: View {
@State private var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(
latitude: 25.7617,
longitude: 80.1918
),
span: MKCoordinateSpan(
latitudeDelta: 10,
longitudeDelta: 10
)
)
var body: some View {
Map(coordinateRegion: $region)
}
}
struct MyMap_Previews: PreviewProvider {
static var previews: some View {
MyMap()
}
}
// MyMapUITests.swift
class MyMapUITests: XCTestCase {
func testMapExists() throws {
let app = XCUIApplication()
app.launch()
let map = app.maps.element
XCTAssert(map.exists, "Map does not exist")
}
}
是否可以告诉 UI 测试框架只测试一个组件,而不是启动整个应用程序并让我在每个视图之间导航,然后才能进入我的视图?
例如,在我的例子中,当应用程序第一次打开时会有一个登录视图(从 ui 测试的角度来看是每次),并且地图视图可以位于应用程序内部的某个地方。我希望能够仅测试地图视图而不测试端到端用户体验。
解决方案
如果找到一些环境变量,您可以采取的一种方法是将您的应用程序转换为目录之一。为此,您必须保留固定的视图集合以用作应用程序的根:
@main
struct PicksApp: App {
static let viewBuilders: [String: () -> AnyView] = [
"ContentView": { AnyView(ContentView()) },
"MyMap": { AnyView(MyMap()) }]
var body: some Scene {
WindowGroup {
if let viewName = ProcessInfo().customUITestedView,
let viewBuilder = Self.viewBuilders[viewName] {
viewBuilder()
} else {
AnyView(ContentView())
}
}
}
}
这是ProcessInfo
辅助方法:
extension ProcessInfo {
var customUITestedView: String? {
guard environment["MyUITestsCustomView"] == "true" else { return nil }
return environment["MyCustomViewName"]
}
}
有了上面的改动,UI测试只需要多两行代码——环境准备:
func testMapExists() throws {
let app = XCUIApplication()
app.launchEnvironment["MyUITestsCustomView"] = "true"
app.launchEnvironment["MyCustomViewName"] = "MyMap"
app.launch()
let map = app.maps.element
XCTAssert(map.exists, "Map does not exist")
}
推荐阅读
- jenkins - 我无法在 Jenkins 管道中运行 pipenv shell
- r - 如何更改数据框中的特定值
- python - PyTorch 在 Detectron2LayoutModel() 上抛出 OSError
- angular11 - 需要使用 web api 服务在 Angular11 中显示新添加的记录/行而不刷新页面
- python - 比较两个变量,最多 x 个小数位
- javascript - 单击另一个下拉菜单后如何关闭一个下拉菜单
- python - 如何使用python提取从API获取数据的图表
- awk - Grep - 打印不匹配的单词
- python - 我如何使用 prometheus 抓取 python flaskapi 的唯一响应时间
- python - 训练精度提高但验证精度仍然是每个班级的机会(1/班级数)