UI Testing
What is UI test
UI Test is unit testing for test UI are they working or not. It does not test what’s shaowing on screen and where is it showing. It’s just test whether Ui elements are performing perfect like text on label, button click from test and check functionality, view controller change or not.
How to write simple UI test
Click on 6th icon from left panel and add “New UI test target” and name the UI test. New generated class will create by magical variable “ continueAfterFailure = false”
Because to test the UI is heavy to run so it will finish testing if any test fails
XCUIApplication().launch()
is used to lunch the app
Initialize app test :
First lets start with making XCUIApplication as global variable as we will need in every test case. XCUIApplication is like access the application UI in all test.
var app: XCUIApplication!
Now replace XCUIApplication().launch() With below lines
app = XCUIApplication()
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
app.launchArguments.append("--uitesting")
app.launch()
Added “app.launchArguments.append” with key and can capture in Appdelegate’s didFinishLaunchingWithOptions to initialize testing(like create defaut values, empty the database )
if launchOptions(“—uitesting“) { configureAppForTesting() }
UILabel test:
To test label ,
Set label access identifier in storyboard or programmatically Create test function for this Label is defined as “static text” in UI testing . To test and verify the text of label ,
XCTAssertEqual(app.staticTexts.element(matching:.any, identifier: "testingLabel").label, "Test")
Where testingLabel is access identifier and “Test” is text to test
Button test:
To check the button click and its action , we use tap()
app.buttons["Done"].tap()
Where “Done ” is access identifier
Lets test button click and its actions by changing the label text to “Change text”
XCTAssertEqual(app.staticTexts.element(matching:.any, identifier: "testingLabel").label, "Test")
app.buttons["ChangetextButton"].tap()
XCTAssertEqual(app.staticTexts.element(matching:.any, identifier: "testingLabel").label, "Change text")
app.buttons[“ChangetextButton”].tap() will click button aumotally For more action , follow below blog. for more actions of UI componnets
https://www.hackingwithswift.com/articles/83/how-to-test-your-user-interface-using-xcode
TextFields test:
To use textfield , we first enable textfield by using
app.textFields.element.tap()
And to get textfeild use
let textField = app.textFields["testingTextField"] // where testingTextField is accessibility identifier
To write text in textfield
textField.typeText("text_user_typed_in")
And to test textfield text
XCTAssertEqual(textField.value as! String, "text_user_typed_in")
Controller test
We can not direct check which controller is visible so for this , we change the controller and test any elements from other controller whether it exist or not. Follow below link
https://stackoverflow.com/questions/33872364/uitesting-xctest-current-viewcontroller-class
app.buttons["Secondbutton"].tap() // button to change controller is clicked
wait(for: 1) // wait for 1 second because transaction takes time
XCTAssert(app.staticTexts["secondText"].exists) // check label on second controller is present or not
Screenshot via UI testing
Xcode automatically takes screenshots as it runs your UI tests, and automatically deletes them if your tests succeed. But if the tests fails then Xcode will keep the screenshots to help you step through visually and figure out what went wrong.
To take screen if you want , use below code
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "My Great Screenshot"
attachment.lifetime = .keepAlways
add(attachment)