XCUI Testing

A test for this code:

func test_using_text_strings3() throws {

let app = XCUIApplication()

app.launch()

app.buttons["Hello, World!"].tap()

let heading2 = app.staticTexts["Two"]

XCTAssertEqual(heading2.label , "Two") // heading label

app.buttons["Hello, World #2!"].tap()

let heading3 = app.staticTexts["Three"]

XCTAssertEqual(heading3.label , "Three") // heading label

app.buttons["Pop to root"].tap()

let heading1 = app.staticTexts["Root"]

XCTAssertEqual(heading1.label , "Root") // heading label

}

A better test using accessibility Identifiers

func test_using_accessibilityID() throws {

let app = XCUIApplication()

app.launch()

app.buttons["button1"].tap()

let heading2 = app.staticTexts["Two"]

XCTAssertEqual(heading2.label , "Two") // heading label

app.buttons["button2"].tap()

let heading3 = app.staticTexts["Three"]

XCTAssertEqual(heading3.label , "Three") // heading label

app.buttons["button3"].tap()

let heading1 = app.staticTexts["Root"]

XCTAssertEqual(heading1.label , "Root") // heading label

}


Testing NavigationView Links

Here's some code for simple testing of XCUI Testing.


//

// ContentView.swift

// Nav_Example_Test

//

// Created by David on 2/6/21.

//


import SwiftUI


struct ContentView: View {

@State var isActive : Bool = false


var body: some View {

NavigationView {

NavigationLink(

destination: ContentView2(rootIsActive: self.$isActive),

isActive: self.$isActive

) {

Text("Hello, World!")

.accessibility(identifier: "button1")

}

.isDetailLink(false)

.navigationBarTitle("Root")

}

}

}


struct ContentView2: View {

@Binding var rootIsActive : Bool


var body: some View {

NavigationLink(destination: ContentView3(shouldPopToRootView: self.$rootIsActive)) {

Text("Hello, World #2!")

.accessibility(identifier: "button2")

}

.isDetailLink(false)

.navigationBarTitle("Two")

}

}


struct ContentView3: View {

@Binding var shouldPopToRootView : Bool


var body: some View {

VStack {

Text("Hello, World #3!")

Button (action: { self.shouldPopToRootView = false } ){

Text("Pop to root")

.accessibility(identifier: "button3")

}

}.navigationBarTitle("Three")

}

}



struct ContentView_Previews: PreviewProvider {

static var previews: some View {

ContentView()

}

}


Your Mission - see which test are brittle - change something - experiment...

Here's a new implementation code:


//

// ContentView.swift

// Nav_Example_Test

//

// Created by David on 2/6/21.

//


import SwiftUI


struct ContentView: View {

@State var isActive : Bool = false


var body: some View {

NavigationView {

VStack {

Text("It's a small world, afterall...")

.accessibility(identifier: "smallworld")

Spacer()

NavigationLink(

destination: ContentView2(rootIsActive: self.$isActive),

isActive: self.$isActive

) {

Text("Hello, World!")

.accessibility(identifier: "button1")

}

.isDetailLink(false)

.navigationBarTitle("Tap-Root")

.toolbar {

ToolbarItem(placement: .navigationBarLeading) {

Button(action: {}) {

Image(systemName: "bell.fill")

.padding(.horizontal)

}

.accessibility(identifier: "bell")

}

ToolbarItem(placement: .bottomBar) {

Button(action: {}) {

Text("Bing Me")

.padding(.horizontal)

}

.accessibility(identifier: "bingme")

}

}

Text("accessibilityIdentifier = button1")

.fontWeight(.light)

.font(.footnote)

.italic()

Spacer()

}

}

}

}


struct ContentView2: View {

@Binding var rootIsActive : Bool


var body: some View {

NavigationLink(destination: ContentView3(shouldPopToRootView: self.$rootIsActive)) {

Text("Hello, World #2!")

.accessibility(identifier: "button2")

}

.isDetailLink(false)

.navigationBarTitle("Two")

}

}


struct ContentView3: View {

@Binding var shouldPopToRootView : Bool


var body: some View {

VStack {

Text("Hello, World #3!")

Button (action: { self.shouldPopToRootView = false } ){

Text("Pop to root")

.accessibility(identifier: "button3")

}

}.navigationBarTitle("Three")

}

}



struct ContentView_Previews: PreviewProvider {

static var previews: some View {

ContentView()

}

}



XCUI Test improved

I've not been using XCUI Test for quite some time... they were too difficult to get working. It seems in 2022 that the Accessibility Identifier issue has been fixed. I see all the cool kids using it now.