How We Test at Hexis: Our Integrated Approach to Quality

At Hexis, delivering high-quality software isn’t just a goal — it’s part of our DNA. In today’s fast-paced development environment, moving fast can sometimes clash with maintaining reliability. So, how do we strike the right balance?
The answer isn’t a single tool or technique, but a deeply integrated testing culture that combines human expertise with smart automation.
In this post, we’ll take you behind the scenes of our testing strategy — showing how we blend the irreplaceable insight of manual testing with the precision and speed of automation, using Behavior-Driven Development (BDD) and Playwright to build a testing framework that’s effective, maintainable, and truly collaborative.
Our Foundation: A People-First Approach to Quality
Before writing a single line of test code, we start with people.
We believe that the most valuable insights come from human intuition and a deep understanding of the user experience. Our QA and development teams are driven by curiosity — and that’s where quality begins.
Manual testing remains a cornerstone of our approach, particularly for:
- Exploratory Testing: Our testers are empowered to go off-script, uncovering unexpected issues and edge cases that rigid test scripts often miss.
- User Experience (UX) Evaluation: We constantly assess whether our applications feel intuitive and solve real user problems — something only a human can truly judge.
- Ad-hoc Testing: When new features ship or issues arise, we can quickly validate changes without the overhead of automation setup.
However, as our projects grew, we needed to scale. That meant finding a way to amplify our efforts without losing the human touch.
Scaling Our Efforts with Playwright and BDD
To handle growing complexity, we needed a testing framework that was fast, reliable, and easy to maintain, while keeping everyone — developers, QAs, and product owners — aligned.This led us to combine Playwright with a Behavior-Driven Development (BDD) philosophy.
Here’s what this approach brought us:
- Greater Efficiency: We automated repetitive regression tests, freeing our team to focus on higher-value exploratory work.
- Stronger Collaboration: Thanks to plain-language (Gherkin) tests, our product team can read and contribute to scenarios — bridging the gap between business intent and implementation.
- Living Documentation: Our test suite reflects how the app truly behaves, evolving alongside the product.
Beyond Playwright: A Broader Approach to Automated Testing
Playwright is powerful, but we see it as part of a larger picture. A sustainable automation strategy depends on balance, structure, and discipline.
Here are a few key principles we follow:
- Follow the Testing Pyramid: Prioritize fast, independent unit tests, then integration tests, and finally critical end-to-end tests. This ensures quick feedback with fewer dependencies. (We use Bun for high-speed unit testing.)
- Define a Clear Automation Strategy: Focus on the areas that bring the most value. Don’t automate everything — automate what matters.
- Integrate with CI/CD: Automated testing is baked into our CI/CD pipeline, catching issues before they ever reach production.
- Prioritize Maintainability: Clear, modular, and well-documented tests ensure long-term stability as the codebase grows.
- Stay Flexible: Tools evolve. Playwright works well for us today, but we continually reassess our stack to keep improving.
Our Testing Strategy in Practice
A tool is only as strong as the strategy behind it. At Hexis, we build our process on three key pillars:
A Balanced Test Portfolio:
We follow the testing pyramid — fast unit tests (with Bun) form the base, supported by integration tests and a select suite of Playwright end-to-end tests.
Deep CI/CD Integration:
Quality isn’t a separate phase — it’s built into every commit. Each change triggers our full test suite, delivering immediate feedback.
Maintainability as a Principle:
We treat test code with the same discipline as production code — clean, modular, and easy to update.
A Glimpse into Our BDD Test Suite
Behavior-Driven Development is the glue that connects our teams.
We define behavior from the user’s perspective using Gherkin syntax with Cucumber, keeping tests readable and meaningful for everyone.
Example: Gherkin Feature File
Feature: Calculator Operations Scenario: Add two numbers Given I am on the calculator page When I enter "2" and "3" And I click the addition button Then I should see the result as "5"
Here’s how we bring that to life in our codebase.
1. Our Blueprint: The Page Object Model (POM)
We keep selectors and logic organized through the Page Object Model, separating the how from the what.
class CalculatorPage { constructor(page) { this.page = page; this.baseUrl = '[https://calculatorapp.com](https://calculatorapp.com)'; this.resultDisplay = '#result-display'; this.addButton = '#addition-button'; // ... other selectors } async navigateTo() { await this.page.goto(this.baseUrl); } async enterNumber(number) { for (const digit of String(number)) { await this.page.click(`#button-${digit}`); } } async clickAdd() { await this.page.click(this.addButton); } async getResult() { return this.page.textContent(this.resultDisplay); } } module.exports = { CalculatorPage };
2. Our Translator: BDD Step Definitions
Step definitions are the bridge between our Gherkin scenarios and our Playwright code. They use our Page Objects to execute the actions described in plain language.
const { Given, When, Then } = require('@cucumber/cucumber'); const { expect } = require('@playwright/test'); const { CalculatorPage } = require('./calculatorPage'); Given('I am on the calculator page', async function () { const calculatorPage = new CalculatorPage(this.page); await calculatorPage.navigateTo(); }); When('I enter "{string}" and "{string}"', async function (num1, num2) { const calculatorPage = new CalculatorPage(this.page); await calculatorPage.enterNumber(num1); await calculatorPage.clickAdd(); await calculatorPage.enterNumber(num2); }); Then('I should see the result as "{string}"', async function (expectedResult) { const calculatorPage = new CalculatorPage(this.page); const result = await calculatorPage.getResult(); expect(result).toBe(expectedResult); });
3. Our Story: Feature Files
These files are the heart of our BDD process. They serve as living documentation, ensuring that our technical implementation is always aligned with our business requirements.
Feature: Calculator Operations Scenario: Add two numbers Given I am on the calculator page When I enter "2" and "3" And I click the addition button Then I should see the result as "5" Scenario: Subtract two numbers Given I am on the calculator page When I enter "7" and "3" And I click the subtraction button Then I should see the result as "4"
Conclusion: Quality is a Shared Responsibility
At Hexis, our testing framework does more than find bugs — it aligns our entire team around a shared goal: building quality into every step of development.
By combining human insight with BDD-driven automation, we ship features quickly and confidently — without ever compromising on reliability.
Quality isn’t an afterthought. It’s part of how we work.