End-to-end & API test automation by Ivan Armadi
12 projects · 170+ automated tests · 10 real-world applications · every project runs in CI
| Skill | Where to look | |
|---|---|---|
| 🧱 | Page Object Model with chainable actions and reusable components | every Cypress project – cypress/pages |
| 🥒 | BDD with Gherkin – Scenario Outlines, Data Tables, tag strategy | Saucedemo-BDD, BeautyHaul-BDD, Voila-BDD |
| 🌐 | Network stubbing with cy.intercept to test UI without hitting a protected backend |
BeautyHaul |
| ⚡ | Fast, stable logins with cy.session() and API login via cy.request |
Websecurity, Saucedemo |
| 🎲 | Data-driven & generated test data – fixtures and Faker | DemoQA, HeroKuApp |
| 🔐 | Secrets management – credentials in git-ignored env files / CI secrets, never in code | Voila-BDD, PayEver |
| 🔌 | API testing – CRUD, JSON schemas, chained requests, parallel execution | API_Karate_Framework |
| 🤖 | CI/CD – one reusable GitHub Actions workflow, one status badge per project | .github/workflows |
| Project | Status | Stack | Application | Tests |
|---|---|---|---|---|
| Saucedemo | Cypress | saucedemo.com | 27 | |
| Saucedemo-BDD | Cypress · Cucumber | saucedemo.com | 17 | |
| BeautyHaul | Cypress | beautyhaul.com | 16 | |
| BeautyHaul-BDD | Cypress · Cucumber | beautyhaul.com | 13 | |
| DemoQA | Cypress · Faker | demoqa.com | 28 | |
| HeroKuApp | Cypress | CURA Healthcare | 15 | |
| RahulAcademy | Cypress | rahulshettyacademy.com | 20 | |
| Websecurity | Cypress | Zero Bank | 11 | |
| Voila-BDD | Cypress · Cucumber | voila.id | 6 + auth | |
| PayEver | Cypress | PayEver commerceOS | 5 + auth | |
| DraftCypressFile | Cypress template | example.cypress.io | 5 | |
| API_Karate_Framework | Karate · JUnit 5 | JSONPlaceholder | 16 |
+ auth – extra scenarios that run only when a test account is provided (see Secrets).
Every Cypress project shares the same layered structure, so a reviewer can open any folder and feel at home.
flowchart LR
A["Spec / .feature<br/><i>what is tested</i>"] --> B["Step definitions<br/><i>BDD glue only</i>"]
A --> C
B --> C["Page Objects<br/><i>how to interact with the UI</i>"]
C --> D[("Application<br/>under test")]
E["Fixtures / Faker<br/><i>test data</i>"] -.-> A
F["Custom commands<br/><i>cy.session login, helpers</i>"] -.-> A
<Project>/
├── cypress/
│ ├── e2e/ # specs (*.cy.js) or Gherkin (*.feature)
│ ├── pages/ # Page Objects + shared components
│ ├── fixtures/ # test data
│ └── support/ # custom commands, step definitions, global setup
├── cypress.config.js
└── package.json
A spec reads like a test case, with no raw selectors:
it('E2E: completes checkout with multiple products', () => {
checkoutPage.fillInformation(customer).continue()
checkoutPage.shouldHaveCorrectTotals().finish()
checkoutPage.shouldBeComplete()
header.shouldHaveCartCount(0)
})Requirements: Node.js 22+ for Cypress projects, Java 17 + Maven for Karate.
git clone https://github.com/HivanA98/Cypress-CodeJS.git
cd Cypress-CodeJS/Saucedemo # pick any project
npm install
npm run cy:open # interactive runner
npm test # headless run + HTML report in cypress/reportsProjects that need a real account read credentials from a git-ignored cypress.env.json
(copy cypress.env.example.json). In CI the same JSON is provided as a repository secret:
| Project | Repository secret |
|---|---|
| Voila-BDD | VOILA_CYPRESS_ENV |
| PayEver | PAYEVER_CYPRESS_ENV |
Without the secret the workflow still runs and simply skips the account-only scenarios.
cypress-reusable.yml– install, verify Cypress, run, upload the report- One small workflow per project calls it, so every project gets its own badge and only runs when its folder changes
- A weekly scheduled run detects changes on the live websites
- HTML reports and failure screenshots are uploaded as build artifacts
vMAJOR.MINOR.PATCH – e.g. v2.1.3: MAJOR = new feature / project · MINOR = new test case · PATCH = improvement or fix