Senior Software Development Engineer in Test (SDET) at BP, Gabriel Ng, explains what tools to consider when designing and scaling a robust application programming interface (API) framework
Ng is a dedicated Engineer/Developer in test who has had the opportunity to work in multiple roles, including Quality Engineer, Technical Consultant and QA Lead within government, financial, oil, retail and gaming services.
His current client role includes architecting test solutions, defining test dependencies, implementing test automation frameworks across API and UI layers, leading test strategy, as well as risks and approaches to deliver a robust solution alongside other smart engineers. Overall, he acts as the quality gates to govern all test environments and production releases.
“Although I started my career within software development, I eased into the world of test automation quite quickly and fell in love with such a niche field with an enormous ecosystem,” said Ng.
Nevertheless, he finds that keeping up-to-date with the latest tools can be difficult, despite there being various tools which can be utilised.
“My current tech stack includes Azure, VSTS for release, builds and pipeline management, Java, Serenity BDD, RestAssured for API Test Automation and Protractor, Typescript, Selenium, WebdriverJS for Angular UI Test Automation; all of which sit under JVM Cucumber and Cucumber JS following the BDD test approach.”
Why use Selenium?
Although the growth of Selenium has evolved dramatically over the years’, he still recommends Selenium for UI testing for the following reasons:
- It’s growing modern browser support, we would not need to worry about new browsers breaking test as Selenium would partially handle this with its WebDriver implementation
- Selenium Grid, Remote WebDrivers, out of the box Selenium provides the ability to execute tests on any remote browsers, integrating with any cloud-based platforms easily
- Flexible to use and refactor, design patterns such as Page Object Model, Object Repository can complement extremely well with Selenium test scripts, allowing flexibility to refactor classes and objects as desired
- Furthermore, the test script can be run with many CI platform such as Jenkins and supported by cloud platforms.
Selenium and the cloud
In order to utilise Selenium with cloud platforms, he uses two main test platforms ‘Browser Stack’ and ‘Sauce Labs’. According to him, both cloud platforms can easily be utilised when executing UI Selenium test scripts, performance and load testing.
Ng commented: “These platforms will decrease script execution time vastly at the same time provide support for over 700 different browsers and mobile platforms.
“By running tests in the cloud, this will also reduce overheads costs such as maintaining and house Selenium Grid. Through cloud capabilities, there are great benefits when trying to scale across various types of browsers and mobile platform; all within configuration files.
“As we evolve into user-centric testing to ensure compatibility, accessibility bugs are identified early on and cloud capabilities will help leverage this and bring test implementation to the next level.”
Security monitoring tools
As all tools are open source these days, he recommends integrating security monitoring tools such as ‘Black Duck’ to scan for any open source libraries vulnerabilities to ensure projects are not at risk to security risks and follow trusted and industry standard advice.
When designing and scaling a robust API framework, Ng believes it’s important to consider the below components:
- Test scripts, test data JSON bodies: Used for configuration files and resources to act as resources that drive and execute test scripts
- Automation toolset: Automate, make calls and interact with REST/SOAP API endpoints
- Common libraries and helper classes: Use database classes, assertion classes, data readers and JSON loaders to take away the implementation from test scripts and increase code reusability
- Execution environments: Where will the test scripts execute in containerised environment architecture? A cloud-based platform?
- Test reporting: How do you best represent test results? Currently, Cucumber Reports are the most popular to provide step by steps expectation of pass-fail features and scenarios derived from Cucumber Feature files.
On a high level, Serenity BDD out of the box provides a comprehensive list of helper functionality, professional test reporting, test environments, and integration and test scripts management where Cucumber JVM is at the heart of driving BDD test scripts. API request and responses can also be captured easily using special Serenity annotations to represent these test results in Serenity Report through the usage of Serenity Step libraries.
Using Serenity Rest and the core wrapper class of RestAssured provides great functionality when interrogating and validating APIs such as the handling of API security, advanced JSON request, response, object types and asserting an API response status; allowing code reusability throughout the test framework.
“For Angular projects, I would recommend Typescript with Protractor as the UI Automation tool, following the Page Object Model design pattern. Protractor is simply a wrapper around WebDriver JS which contains all the benefits of core Selenium including the ability to integrate with remote browsers and Selenium Grid.
“Protractor also provides additional Angular specific wait functions, element selector types and page bindings. Additionally, Protractor would work well with any assertion libraries such as Mocha and Jasmine, alongside Cucumber JS, Serenity JS, which allows true flexible integration across the UI automation stack.”
To improve the test-reporting process, Ng says it’s important to consider the following points:
- UI specific defects captured should be presented in screenshots through BDD reports, allowing stakeholders to easily see why the functionality has failed in the reports at each test steps
- Each ‘scenarios’ in Cucumber Feature files should only test a specific functionality
- ‘Background’ in Cucumber Feature files should be used to reduce repetition of steps in test execution and reporting
- Cucumber Hooks should be used where possible to create setup and teardown for each test scenarios, this will lead to overall better readability when test reports are produced
- Create professional reports by making use of Serenity BDD reporting functionality through the integration of Serenity Rest and Serenity Steps annotations for API tests execution
- Test reports should utilise ‘example’ tables where possible to minimise the need for creating duplicate test scenarios for the same types of data sets.
Creating a test framework
When creating a reusable test framework, he also believes that the below practices are the best to consider:
- Introduce helper classes, wrapper methods for global functions, and stateless utility methods such as connecting to databases, file loading, test assertions, external libraries, while allowing code reuse for similar sets of functionalities across the framework
- Singleton approach provides a global point of access, should ideally be implemented for test logging, as well as test configuration functionality
- Use Page Object Model to design a pattern in UI tests in order to reduce test maintenance and the dependency between test code and element locators. This will be a single repository for the services or related operations/functions and provides a great abstraction when implementing step definitions in Cucumber
- Stubs and Mocks provide any stubs/mock required for test/execution in lower environments which reduces dependencies on real environments and endpoint; allowing any bugs to be found early on in lower environments.
According to him, it’s also important to follow vendor blogs, articles and webinars such as Blazemeter and Applitools as it can vastly improve knowledge on ensuring tools are fit for purpose, easily accessible and up-to-date.
Written by Leah Alger