Currently looking for a QA Automation Engineer role

Fatih Donmez

QA Automation Engineer

5+ years of UI and API test automation in Agile teams. I build Java and Selenium frameworks with Cucumber BDD, validate services with REST Assured and Postman, and run the suites from Jenkins on every deployment.

>_ Terminal — mvn clean test
> mvn clean test -Dsuite=regression [INFO] Running TestNG suite: RegressionSuite.xml [PASS] LoginTest.validCredentials 1.8s [PASS] BookingTest.bookAppointment 2.4s [PASS] ApiTest.getAppointments_200 0.4s Tests run: 128, Failures: 0, Errors: 0, Skipped: 2 BUILD SUCCESS — 04:37 min
+55%test coverage
-35%script maintenance
-40%feedback loop

Workspace

The tools I work in every day: the framework in Eclipse, the services under test in Postman, the data behind them in MySQL, the same scenario across three browsers, the sprint board in Jira, and Jenkins running all of it.

Eclipse IDE — the framework itself: Page Objects, step definitions and the project tree.

Eclipse IDE — ui-automation-framework
AppointmentPage.java AppointmentSteps.java TestRunner.java booking.feature pom.xml
Project Explorer
  • ui-automation-framework
  • src/main/java
  • src/test/java
  • com.qa.pages
  • BasePage.java
  • LoginPage.java
  • AppointmentPage.java
  • DashboardPage.java
  • com.qa.stepdefinitions
  • LoginSteps.java
  • AppointmentSteps.java
  • Hooks.java
  • com.qa.runners
  • TestRunner.java
  • FailedRunner.java
  • com.qa.utilities
  • Driver.java
  • ConfigReader.java
  • DBUtils.java
  • src/test/resources
  • features
  • booking.feature
  • login.feature
  • configuration.properties
  • log4j2.xml
  • JRE System Library [JavaSE-17]
  • Maven Dependencies
  • target
  • classes
  • surefire-reports
  • cucumber-reports
  • test-output
  • screenshots
  • Jenkinsfile
  • pom.xml
  • README.md
  • testng.xml
package com.qa.pages;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import com.qa.utilities.Driver;

/** Page Object for the appointment booking flow. */
public class AppointmentPage extends BasePage {

    @FindBy(id = "booking-code")
    private WebElement bookingCodeInput;

    @FindBy(css = "button[data-test='confirm-btn']")
    private WebElement confirmButton;

    @FindBy(xpath = "//div[@role='alert'][contains(@class,'success')]")
    private WebElement confirmationToast;

    public AppointmentPage() {
        PageFactory.initElements(Driver.get(), this);
    }

    public void bookAppointment(String bookingCode) {
        waitForVisibility(bookingCodeInput).sendKeys(bookingCode);
        clickWithRetry(confirmButton, 3);
    }

    public String getConfirmationMessage() {
        return waitForVisibility(confirmationToast).getText().trim();
    }
}
JUnit: 128/128 passed Problems: 0 errors, 2 warnings Git: feature/QA-2205-booking-suite Java 17 · Maven 3.9

Postman — the request under test, its assertions and the payload the service returns.

Postman — Booking API / Appointments
GET {{base_url}}/v2/customers/{{customerId}}/appointments Send
ParamsAuthorizationHeaders (4)BodyTests
Status: 200 OKTime: 214 msSize: 1.24 KB

Tests

pm.test("status code is 200", () => {
    pm.response.to.have.status(200);
});

pm.test("response time under 500ms", () => {
    pm.expect(pm.response.responseTime).to.be.below(500);
});

pm.test("payload matches the contract", () => {
    const body = pm.response.json();
    pm.expect(body.appointments).to.be.an("array");
    pm.expect(body.appointments[0]).to.have.property("storeId");
    pm.environment.set("apptId", body.appointments[0].id);
});

Response body

{
    "customerId": "C-99312",
    "appointments": [
        {
            "id": "APT-4471",
            "type": "STORE_PICKUP",
            "storeId": 7412,
            "scheduledAt": "2026-09-04T15:30:00Z",
            "status": "CONFIRMED"
        }
    ]
}
Test Results: 3/3 passed Collection: smoke-collection.json Runner: Newman

MySQL Workbench — the row behind the test: what the UI wrote, checked with SQL.

MySQL Workbench — qa_staging@db-01

Schemas

  • qa_staging
  • Tables
  • bookings
  • customers
  • stores
  • payments
  • audit_log
  • Views
  • Stored Procedures
  • qa_reporting
-- Then the order status in MySQL is "CONFIRMED"
SELECT b.booking_code,
       b.store_id,
       b.status,
       b.scheduled_at
FROM   bookings b
JOIN   customers c ON c.id = b.customer_id
WHERE  c.external_ref = 'C-99312'
ORDER BY b.created_at DESC
LIMIT  3;
#booking_codestore_idstatusscheduled_at
1BK-882137412CONFIRMED2026-09-04 15:30:00
2BK-881987412CANCELLED2026-09-01 10:00:00
3BK-881645120COMPLETED2026-08-27 09:15:00
3 row(s) returned 0.012 sec / 0.000019 sec Called from DBUtils.java in the Cucumber step

Cross-browser run — the same scenario on Chrome, Firefox and Edge through Selenium Grid.

Demo Portal — Appointments RUNNING
← → ⟳ https://staging.demo-portal.io/appointments

Book an appointment

Book
Edge 129 · EdgeDriver · Selenium Grid node 3
Demo Portal — Appointments PASS 3.1s
← → ⟳ https://staging.demo-portal.io/appointments

Book an appointment

Book
Firefox 131 · GeckoDriver · Selenium Grid node 2
Demo Portal — Appointments PASS 2.4s
← → ⟳ https://staging.demo-portal.io/appointments

Book an appointment

Book
Chrome 129 · ChromeDriver · Selenium Grid node 1

Jira — the sprint board the tickets come from and move across.

QA Board — Jira Test plan
← → ⟳ https://qa-team.atlassian.net/jira/software/projects/QA/boards/2
QA Automation · Sprint 24 6 days remaining · 8 issues FDTDSK
To do 3

Automate the password reset flow end to end

SQA-22113FD

Add JSON schema validation to the orders endpoint

TQA-22132FD

Triage flaky tests in the checkout suite

TQA-22165TD
In progress 2

Cross-browser suite for the booking flow

SQA-22055FD

REST Assured tests for the appointments API

SQA-22083FD
Done 3

Refactor the login module into Page Objects

TQA-2190FD

Nightly regression job in Jenkins

TQA-2193SK

Defect: confirmation toast not shown on Firefox

BQA-2198FD
Chrome 129 · Jira Software · sprint board

Jenkins — the pipeline that runs the suite after every deployment.

Jenkins — web-ui-regression · build #418
Branch: release/24.9 Trigger: post-deploy hook Node: linux-agent-02
Checkout6s
Build48s
Smoke1m 12s
Regressionrunning
Reportqueued
Passed: 126 Failed: 0 Skipped: 2 Elapsed: 04:12
Reports: Cucumber HTML · Extent · JUnit XML
+ mvn clean test -Dcucumber.filter.tags="@regression" [INFO] --- maven-surefire-plugin:3.2.5:test --- Scenario: Customer books a store appointment ✔ Given the customer is logged in with valid credentials ✔ When the customer submits booking code "BK-88213" ✔ Then the confirmation message is displayed ✔ And the order status in MySQL is "CONFIRMED" Scenario: Booking is rejected for an unavailable slot ✔ Given the selected slot is already fully booked ✔ Then the error banner reads "Slot no longer available" Tests run: 128, Failures: 0, Errors: 0, Skipped: 2 BUILD SUCCESS — Total time: 04:37 min
Eclipse IDE showing the ui-automation-framework project tree and a Page Object class
Eclipse IDE — the framework itself: Page Objects, step definitions and the project tree.
Postman showing a GET request with passing tests and the response payload
Postman — the request under test, its assertions and the payload the service returns.
MySQL Workbench with the query and the result grid for the booking the test created
MySQL Workbench — the row behind the test: what the UI wrote, checked with SQL.
Chrome, Firefox and Edge windows running the same booking scenario
Cross-browser run — the same scenario on Chrome, Firefox and Edge through Selenium Grid.
Jira sprint board with To do, In progress and Done columns
Jira — the sprint board the tickets come from and move across.
Jenkins build pipeline with the Cucumber console output
Jenkins — the pipeline that runs the suite after every deployment.

Experience

Five-plus years inside Agile Scrum teams, owning automation from framework design to pipeline execution.

Quality Engineer II

Walgreens March 2024 — Present

Deerfield, Illinois

  • Architected a hybrid UI automation framework with Java, Selenium and Cucumber BDD using the Page Object Model, cutting script maintenance time.
  • Validated backend service integrity and payload responses through API testing with Postman and REST Assured.
  • Configured continuous testing pipelines with Maven and Jenkins to run regression suites after every deployment, shortening developer feedback loops by 40%.
  • Developed smoke and regression suites for prescription and appointment workflows, expanding test coverage by over 55%.
  • Drove defect resolution in Jira with detailed technical logs, partnering with developers on cross-team debugging.
  • Collaborated in sprint planning, backlog grooming and daily stand-ups to keep quality goals aligned.

QA Engineer

Upwork Feb 2021 — March 2024

San Francisco, California

  • Built and maintained Selenium WebDriver automation on an object-oriented Java framework structured with TestNG assertions and annotations.
  • Tested RESTful services with Postman, validating payload schemas and response codes, which raised backend coverage by 30%.
  • Delivered quality targets inside fast-paced sprint cycles with cross-functional teams.
  • Performed backend and database validation with SQL queries in MySQL to verify user data and transaction logs.
  • Integrated automation suites into Jenkins pipelines so tests ran on every commit.

Skills

Tools I have used on delivered work.

Languages & data

JavaSQLGherkin HTMLXMLJSON

UI automation

Selenium WebDriverCucumberTestNG JUnitPage Object ModelBDDTDD

API & backend

REST AssuredPostmanAPI testing MySQLJDBC

CI/CD & tooling

JenkinsMavenGit GitHubJiraEclipseExcel

Test types

RegressionSmokeFunctional Cross-browserIntegration

Process

Agile / ScrumSDLCSTLCWaterfall

Projects

Representative automation work from my roles, described without client-confidential detail.

Hybrid BDD framework

Java and Selenium framework with Cucumber BDD layered over the Page Object Model.

  • Thread-safe driver factory for parallel, cross-browser runs
  • Single locator layer that cut maintenance by about 35%
  • Screenshots and logs attached to every failed step
JavaSeleniumCucumberTestNG

API validation suite

Service coverage with REST Assured and Postman: status codes, schemas and the data behind them.

  • Schema and response-time assertions on critical endpoints
  • Chained requests with token handling and environments
  • JDBC checks confirming responses match the MySQL record
REST AssuredPostmanMySQLJDBC

Continuous testing pipeline

Jenkins jobs that turn every deployment into a clear pass or fail.

  • Maven profiles for smoke, regression and tag-filtered runs
  • Post-deploy triggers that shortened feedback loops by 40%
  • Failed-scenario rerun job to separate defects from flakiness
JenkinsMavenGitExtent Reports

About

How I work

I came to testing from the other side of the screen. My first years were spent freelancing as a front end developer, building the interfaces I would later be paid to break, and that is still where a lot of my instinct for finding defects comes from. For the past five years I have worked in QA full time. I started with plain Selenium and TestNG, then moved to Cucumber so that a scenario reads the way the product owner describes it and anyone on the team can tell what is covered. I stay close to developers and product owners, ask the awkward question during refinement, and turn the answer into an executable scenario. The suite I want is not the biggest one. It is the one the team still trusts on a release day.

Education

Yalova University, Türkiye
Bachelor of Business Administration

Contact

Open to QA Automation Engineer roles.

Location Orlando, FL