Skip to main content

Test Automation – Step by Step

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.

  • By Piotr Pomykała - Senior IT Delivery Engineer
  • Case study

Let’s Start with Some Theory

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:

  • Improving testing efficiency: Automation should reduce testing time and enable quick regression testing.
  • Expanding test coverage: The goal is to automate as many tests as possible, which can be reused across all T24 NWUs while maintaining high quality.
  • Reducing risk: Test automation helps identify defects early and prevents issues in the production environment.

Test automation in the T24 domain has a significant impact on the following areas:

  1. Increased efficiency and speed: Automation allows tests to be executed repeatedly and quickly without manual intervention, greatly accelerating the testing process. This reduces the time required to implement new features or fixes in the production system. However, it’s important to note that automation cannot fully replace manual testing. Some complex, detailed, or rare scenarios are better handled manually due to the time-consuming nature of automating such cases.
  2. Cost reduction: Manual testing is expensive and time-consuming. Automation reduces the need for large manual testing teams and shortens software release cycles. Sharing a common test case library across all T24 NWUs can significantly lower costs.
  3. Increased accuracy and repeatability: Automated tests eliminate human errors that may occur during manual testing. They allow for the exact repetition of test scenarios in the same way every time, increasing result reliability.
  4. Regulatory compliance: The banking sector is subject to numerous regulations requiring thorough software testing and legal compliance. Automation enables fast execution of compliance tests.
  5. Regression testing: Automation significantly supports regression testing—the process of verifying whether code changes have introduced errors in existing functionalities. Automated regression tests can be run regularly after each change to ensure system stability.
  6. Continuous Integration and Continuous Delivery (CI/CD): In the context of CI/CD, test automation is crucial. It enables regular, automated testing of new application versions, speeding up the deployment of new features and improvements. It also allows developers to receive immediate test feedback and detect defects early in the development lifecycle.

Application Testing Can Be Automated at Various Levels:

  • Simple tasks such as writing VBA macros for applications like Excel or Word.
  • Performance testing for web applications using tools such as JMeter, Gatling, or LoadRunner.
  • Web application regression testing using tools like Selenium, Cypress, or Playwright.
  • API testing using tools like SoapUI or Postman.

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.

Approach to T24 Test Automation

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] " +
"| //input[@title=''{0}'' and contains(@id,''R{1}'')] " +
"| //span[@title=''{0}''] " +
"| //[text()=''{0}'']//ancestor::div[contains(@id,''row_QUE'')]//textarea[@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.

Example scenario:

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.

Summary

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.