Piotr Pomykała
Senior IT Delivery Engineer
Test automation plays a key role in ensuring the efficiency, security, and quality of delivered solutions. It enables fast and effective testing of complex functionalities, minimizing the risk of errors and ensuring compliance with regulations.
A test automation strategy for T24 is essential and should be consistent across all T24 Network Units (NWUs). It needs to be well-planned and aligned with the following strategic objectives:
However, test automation is not something that can be mastered instantly. To start writing scripts, one needs to understand manual testing—meaning the ability to navigate the application and identify "interesting" cases. Conceptual thinking skills are also useful to avoid duplicating functionality. Programming skills are important as well, although they can be learned over time.
Additionally, there are now many powerful tools on the market that support the process of writing or recording automated tests, such as Katalon or Ranorex Studio.
For T24 testing, I adopted an approach using the Selenium WebDriver tool, building a test framework in Java and C#. When it comes to functionality, the T24 frontend (browser) is very powerful. I spent a lot of time analyzing the web application’s DOM tree structure and the appearance of various elements like input fields, radio buttons, dropdowns, etc. I noticed some similarities between these elements and decided that my framework should optimize the code as much as possible, handle these elements, and eliminate redundant functionality across different tabs.I developed a set of universal methods. Thanks to a dozen or so of them, it's possible to handle almost all fields in the application. For example, only two methods were written to handle the “menu” and “submenu” by using just the field name provided as a %s parameter.
String menuNameLocator = "//ul[@id='menu']/li[@class='listItemactive']/ul[@class='submenu']/li/a/span[text()='%s']"; String submenuNameLocator = "//ul[@id='menu']/li[@class='listItemactive']/ul[@class='submenu']/li[@class='listItem active']//span[text()='%s']"; |
They are then located on the page and defined as a WebElement. This involves defining part of the selector as a text string, and only during the test execution the value (field name) is substituted into the text, and the entire expression is used as a selector.Text fields, dropdown lists, checkboxes, and radio buttons are defined in a similar way. Some selectors are defined with multiple conditions, for example:
String elementMultiField = "//[text()=''{0}'']//ancestor::div[contains(@id,''row_QUE'')]//input[@title] " + |
This happens because fields in different stages of the process may look the same, but their handling differs. To avoid creating additional methods, I decided to go with this solution.
| public void CreateUser() { pages.leftMenuPage.clickShowLeftMenu(); pages.leftMenuPage.clickUserMenu(); pages.leftMenuPage.chooseMenu("Customer"); pages.leftMenuPage.chooseSubmenu("Individual Customer"); pages.newCustomerIndividualPage.clickCustomerTabSelect("Title","MR"); pages.newCustomerIndividualPage.clickCustomerTabSelect("Marital Status","Married"); pages.newCustomerIndividualPage.chooseRadiobutton("Gender","MALE"); pages.newCustomerIndividualPage.sendTextField("Given Name", "given qwert"); pages.newCustomerIndividualPage.sendTextField("Family Name", "family qwert"); pages.newCustomerIndividualPage.sendTextField("Full Name", "full qwery"); pages.newCustomerIndividualPage.sendTextField("Short Name", "short name"); pages.newCustomerIndividualPage.sendTextField("Target", "1"); pages.newCustomerIndividualPage.sendTextField("Account Officer", "2"); pages.newCustomerIndividualPage.sendTextField("Second Officer.1", "1001"); pages.newCustomerIndividualPage.addMultiField("Second Officer", 1); pages.newCustomerIndividualPage.sendTextField("Second Officer.2", "2002"); pages.newCustomerIndividualPage.sendTextField("Nationality", "PL"); pages.newCustomerIndividualPage.sendTextField("Industry", "1000"); pages.newCustomerIndividualPage.sendTextField("Customer Status", "1"); pages.newCustomerIndividualPage.sendTextField("Residence", "PL"); pages.newCustomerIndividualPage.sendTextField("Date of Birth", "1988-11-12"); pages.newCustomerIndividualPage.sendTextField("Sector", "10001"); pages.newCustomerIndividualPage.waitToScreenMaskDisappear(); pages.newCustomerIndividualPage.clickCustomerTabSelect("Customer Type","Prospect"); pages.newCustomerIndividualPage.chooseRadiobutton("Vulnerability.1","Hearing impaired"); pages.newCustomerIndividualPage.addMultiField("Vulnerability", 1); pages.newCustomerIndividualPage.chooseRadiobutton("Vulnerability.2","Visually impaired"); pages.newCustomerIndividualPage.sendTextField("Mnemonic", "MNEM001"); pages.newCustomerIndividualPage.clickCommit(); pages.newCustomerIndividualPage.waitToScreenMaskDisappear(); pages.newCustomerIndividualPage.checkIsProcessComplete(); } |
The framework is based on the Page Object Model, meaning each “page” is a separate object/class in the code. For example, the login page is one page, the page visible after logging in is another, and the page where customer or account data is entered is yet another.
By using the Maven project management tool, I can control various framework parameters such as profiles—for example, to switch environment URLs, usernames, passwords, or many other settings needed during testing. Depending on the programming language, I build tests based on the Java test framework TestNG or C# framework NUnit.
There are many tools on the market for reporting automated test results. Depending on our needs and the tool’s capabilities, we can use simple libraries such as ExtentReports, or more advanced ones like Allure.
What I’ve presented is just a drop in the ocean of possibilities. Thanks to the flexibility and adaptability of automated tests to various T24 versions (such as R21, R22, R23, or R24), they can be deployed quickly and immediately used for regression testing. Initially, some time is needed to adjust the placeholders for different elements, build the test case flow, and prepare the scenario base. Once integration is complete, the focus shifts to scripting—using, as mentioned, a dozen or so methods.
Test automation has a broad and diverse impact on various areas of the T24 Core Banking system—from improving quality and security, ensuring regulatory compliance, to optimizing costs and accelerating innovation. Automation is essential for achieving system stability, scalability, and reliability.
The developed T24 test framework is our first step toward standardizing T24 testing. Together with the T24 NWUs, we still have a lot of work ahead, but we believe that strong collaboration across all NWUs will soon allow us to develop shared development standards and common tools that can be used by all T24 NWUs.
Senior IT Delivery Engineer