Implementation of Page-Object-Model (POM) to XCUITest (Native iOS Testing) with Swift

Mesut Güneş
3 min readFeb 8, 2022

--

What is XCUITest and XCTest

Xcode UI Testing is also known as XCUITest is a huge expansion of the testing technology in the Apple platform apps like iOS.XCTest is a general testing framework, used for unit integration, network, or performance testing of Apple platform apps. With XCTest you can treat it as a xUnit type of test framework, which can be used for lower-level testing.

The XCUITest framework is an extension of the XCTest framework but there are some basic differences between XCTest and XCUITest framework.

  • XCTest framework is a completely white-box framework where you can access the data and API in your main app.
  • XCUITest is not only a black-box framework to your app but also a white-box framework, so you can access the data or API of your main app but also interact with the UI elements like a user.
iOS UI Test With XCUITest

Page Object Model (POM)

The main idea behind the Page Object Model (POM) design pattern, is to create an object repository for the pages in the application, which will then be used in the tests. In other words, instead of including the page elements and the test code together within the test, we separate them into 2 different entities: the pages and the test scenarios. Using this concept, each screen in the application will have a corresponding page class. The page classes will identify the elements in the page and contain methods that perform operations on these page elements.

XCUITest Page Object Model Implementation

This framework adopts the POM design pattern and is structured as follows:

‘Pages’ folder

Contains all Page object classes. These classes represent the actual screens of the application. A Page Object class will contain a series of objects, representing the application screen, and a series of methods, representing the features of that screen.

‘Tests’ folder:

Contains all test classes or scripts. These classes define the user flow or end-to-end test scenario by referencing the page object class methods. Contains classes such as ‘BaseTest’ and ‘BasePage’ and other extendible classes.

‘Utilities’ folder:

Contains helpers, extensions to the XCTUITest, scripts.

How to Write Tests

All page object classes and tests will extend the BasePage or BaseTest, thus inheriting all the base methods. These classes contain common functionality for e.g. setting up the app, terminating the sessions, or initializing page objects.

  1. Create the BaseScreen

2. Create a Screen class named as HomeScreen by extending the BaseScreen. Define UI elements via the app using the accessibility identifiers of the elements

3. If the element doesn’t have an accessibility element then find the relevant view and add the accessibility identifier for it. ex: `homeText` that is used ` readmeMd`. This is an example of why XCUITest is not only a black-box solution. It enables us to modify source code for the sake of writing better-automated UI tests. This is one of the advantages over the non-native automation toolings.

4. Create the BaseTest. The BaseTest should handle all the basic things for launching, terminating the app also, it should include creating basic test objects for writing tests.

5. Create a test class for the screen by extending the BaseTest and calling them for the test steps. Test setup should handle all the required actions

Do you want to run these tests in your local and have experience with XCUITest for UI tests, XCTest for unit tests, and also overall iOS app structure then you are ready to go with my repo here: testdictionary-ios-app.

Originally published at https://www.testrisk.com on February 8, 2022.

--

--

Mesut Güneş

Principal Consultant at Modus Create. For more information check my website: http://www.testrisk.com