I lead quality strategy that turns quality into a competitive advantage.
QA Lead: banking · media · AdTech · retail.
About
As QA Lead for CNN's U.S. Elections project, I owned the quality strategy for a high-stakes international platform — managing the team, defining the test plan, tracking KPIs, and coordinating directly with executive stakeholders in the US. That experience shaped how I think about quality leadership: it's a strategic function, not a testing phase.
Today at Globant · Santander UK, I lead QA across multiple teams in the Digital Obsolescence program — defining the technology stack, designing automation frameworks from scratch, and acting as the direct technical point of contact with UK-based client stakeholders.
I combine deep technical expertise (Playwright, TypeScript, CI/CD) with the strategic mindset of a QA leader: risk ownership, continuous improvement, and quality culture — not just test coverage.
Career
From Indra to CNN to Santander UK. Each role shaped how I lead quality at scale.
Tech Stack
10+ years of tool selection and team leadership guided by one principle: use what makes the team faster and more confident.
Proven Impact
Working with AI
I use AI tools across the testing lifecycle. Generation, review and documentation, but every output is human-validated before it ships. I own the quality, not the tool.
test('login test', async ({ page }) => {
await page.goto('/login');
// AI generated: basic, no env handling
await page.fill('#username', 'Admin');
await page.fill('#password', 'admin123');
await page.click('button[type=submit]');
// Issues: CSS selector, no semantic role, no wait
});
const LOGIN_URL = `${process.env.ORANGEHRM_URL}/auth/login`;
test('should redirect to dashboard after valid login',
async ({ page }) => {
await page.goto(LOGIN_URL);
// Semantic locators: resilient to redesign
await page.getByPlaceholder('Username').fill('Admin');
await page.getByPlaceholder('Password').fill('admin123');
await page.getByRole('button', { name: 'Login' }).click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page.getByRole('heading',
{ name: 'Dashboard' })).toBeVisible();
});
6 grounding documents that constrain the AI to correct patterns — no hallucinated APIs, no CSS selectors, no assertions inside Page Objects. Used daily alongside Copilot and Claude.
What follows is a technical showcase. A full automation framework built from scratch to demonstrate how I design, architect, and ship quality at scale.
The Project
Every section below documents a real decision I'd make on a client project, from app selection to CI pipeline design.
Testing Strategy
Every decision prioritises isolation, speed, and determinism over convenience shortcuts. Six principles guide the entire suite.
Prerequisite data is created through the API before any browser launches. Tests are fast, independent of UI navigation, and deterministically provisioned on every run.
Each page is a typed class with readonly Locator properties and workflow
methods. Assertions belong exclusively in test files, page objects only act.
All raw selector strings live in *.locators.ts files exported
as const. OrangeHRM's custom oxd-* class names are
centralised. One change propagates everywhere.
Auth is performed once per worker, not per test. The session is cached in
storageState and injected via test.extend, eliminating login
overhead entirely.
The shared OrangeHRM demo sporadically disables modules. Guards check for 403 pages
after networkidle, and API calls are wrapped in try/catch — tests skip
cleanly, never fail noisily.
The demo resets hourly. Factories generate unique IDs per run using
parallelIndex + Date.now(). Leftover data never causes collisions;
teardown code never breaks tests.
Test Coverage
Four functional modules under test, with both API and E2E layers exercising each domain independently.
| Module | E2E | API | Total | Status |
|---|---|---|---|---|
| Authentication | 5 | — | 5 | ✓ |
| PIM / Employees | 6 | 5 | 11 | ✓ |
| Leave Management | 4 | 3 | 7 | ✓ |
| Recruitment | 6 | 4 | 10 | ✓ |
| Total | 21 | 12 | 33 | ✓ |
Architecture
A strict dependency direction, locators feed pages and pages feed specs. Keeps the suite maintainable as it scales.
src/
locators/ ← selector strings only
orangehrm.locators.ts
candidates.locators.ts
...
pages/ ← POM classes
pim/
recruitment/
leave/
api/ ← typed API clients
factories/ ← test data builders
fixtures/ ← DI via test.extend
types/ ← TS interfaces
tests/
auth.setup.ts ← saves storageState
e2e/ ← browser tests
api/ ← headless API tests
*.locators.ts file with as const. Zero Playwright
imports in this layer.
readonly Locator properties initialized in the constructor.
Methods represent complete user workflows, never single actions.
parallelIndex + Date.now(). No hardcoded values, no collisions
across parallel workers.
CI/CD Pipeline
Runs on every push and pull request. Every run generates an Allure trend report with full history, even when tests fail.
Get in touch
Open to QA Lead and Quality Engineering Leadership opportunities. Email is the best way to reach me.
The full Allure report includes trend history, failure screenshots, videos, and traces for every test run.