Portfolio

Real-world case studies showcasing my testing strategies, tools, and measurable results.

Software / Project Management QA Engineer Personal project

Testing the Jira Cloud REST API End-to-End with Postman

A Postman collection that exercises the Jira Cloud REST API through a complete issue lifecycle - creating, updating, linking, adding attachments, commenting and cleaning up - with structured test scripts covering happy path validation, negative testing, schema checks and non-functional assertions.

API Testing Test Automation Negative Testing Schema Validation
Postman JavaScript Jira Cloud REST API JSON Schema Newman

18 (12 happy path, 6 error/reporting)

API Requests

60+

Test Assertions

GET, POST, PUT, DELETE

HTTP Methods Covered

Car Finance Test Analyst 2 years

Hardcoded Dates in 2,000-Line SOAP Requests? Auto-Parameterise Them with Groovy

When every SOAP test request contains hardcoded dates, contract numbers and environment-specific values, running tests for different date scenarios or environment meant hours of manual edits. Here's how I built a SoapUI Groovy utility to automatically parameterise XML requests - replacing static values with dynamic property references in seconds.

Test Automation API Testing Parameterisation
SoapUI Groovy SOAP Oracle Regex

30–60 minutes → under 1 second

Request Prep Time

20+

Fields Auto-Parameterised

Software / Web Development QA Engineer Personal project

BDD End-to-End Testing with Playwright: Gherkin Features Meet Modern Browser Automation

A behaviour-driven test suite for a live website built with playwright-bdd, combining Gherkin feature files with Playwright's cross-browser engine. Covers navigation, form validation, file downloads, mobile responsiveness and theme detection across 7 browser targets.

BDD Test Automation Cross-Browser Testing Form Validation Mobile Responsive Testing CI/CD
Playwright playwright-bdd TypeScript Gherkin GitHub Actions

9 (home, header, footer, contact, resume, blog, portfolio, about, skills)

Feature Files

7 (Chromium, Firefox, WebKit, Edge, Chrome, Pixel 5, iPhone 12)

Browser Targets

58 across smoke and regression suites

Scenarios

Car Finance Test Analyst Project-based

The File Was Fixed-Field Format and Over 1,000 Characters Wide. How to Test?

The CAIS credit referencing agencies feed follows a strict fixed-width field format that would be incredibly laborious to test manually. Here I discuss the approach I took using SoapUI and Groovy to automate verification of every field.

Test Automation Data Verification Credit Reporting Fixed-Field Format
SoapUI Groovy Oracle JDBC SQL

35+ per record

Fields Verified

30+ automated JDBC checks

Verification Steps

Under 10 minutes

Verification Time

Car Finance Test Analyst Project-based

Working-Day Date Logic Looks Easy Until Easter and Christmas Show Up

A reusable Oracle pattern for verifying 'N working days from today' business rules - like payment clearance dates - by driving both the calculation and the test cases off a single calendar reference table, so weekends, moving Easter dates and Christmas/Boxing Day substitutes only have to be handled once.

Business Rule Verification Date/Calendar Logic Test Data Design Test Automation
Oracle SQL PL/SQL SQL*Plus

10, covering weekends, Easter and Christmas/Boxing Day

Test Scenarios

11 UK dates across 2026-2027

Bank Holidays Modelled

3 of 10, to prove the Pass/Fail check actually works

Deliberate Failures Seeded

Car Finance Test Analyst Project-based

The Statement Was XML. The Source of Truth Was Two Relational Tables. How Do You Prove They Match?

Verifying a machine-generated XML statement against the customer and transaction data it was built from used to mean PL/SQL functions that located tags by counting characters. Here's how Oracle's XMLTABLE and an EXCEPT/MINUS diff technique solve the same problem in a fraction of the code.

Data Verification XML Processing Test Automation Database Testing
Oracle SQL PL/SQL XML SQL*Plus

3 monthly XML statements across 2 customers

Statements Modelled

1 (tag + occurrence lookup) with 1 XMLTABLE call

Hand-Rolled Function Replaced

5, across inserts, updates and deletes, to prove the diff catches them

Deliberate Differences Seeded