QA Lab · Cross-Stack Series · Stack 2

Pytest + Python
+ Allure Framework

Idiomatic Python automation framework demonstrating the pytest ecosystem patterns valued in data-engineering, DevOps, and Python-native organisations — built against the same QA Lab target as all Cross-Stack Series frameworks.

pytest 8.2 · Playwright-Python 1.44 · allure-pytest 2.13 · pytest-xdist 3.5 · Python 3.12

✓ CI Green 12 Test Files 13 UI Sections Covered Python 3.12 LTS 📊 Allure Report Live pytest-xdist Parallel

About This Project

The Purpose

Python is the dominant language in data engineering, ML infrastructure, DevOps tooling, and API-first organisations. Teams in these environments expect pytest fluency, type-annotated code, and Allure-grade reporting as table stakes — not as extras bolted on top.

This is Stack 2 of the Cross-Stack Series — the same QA Lab target tested with different frameworks to enable direct, evidence-based comparison. The framework demonstrates idiomatic Python automation: yield fixtures, conftest hierarchy, dataclasses for test data, and @pytest.mark.parametrize for data-driven coverage.

Key differentiator vs Stack 1 (Playwright TS): Python’s yield fixture model and @pytest.mark.parametrize produce more expressive, composable test code than TypeScript’s base.extend() equivalent — a real trade-off worth understanding per team context.

Architecture Constraints

Every decision reflects real Python ecosystem requirements:

  • conftest.py fixture hierarchy — root for browser/page, section-level for page objects
  • yield fixtures throughout — no setup/teardown class methods, idiomatic pytest
  • @allure.step on all Page Object methods — Allure report populated automatically
  • @pytest.mark.parametrize for data-driven tests — not manual loops or test.each
  • pytest-xdist -n auto — CPU-count parallelism, --dist=loadfile prevents context conflicts
  • mypy --strict passes with zero errors — full type annotation discipline
  • ruff 0.4+ replaces flake8 + isort + black in a single pass
  • No time.sleep() anywhere — all waits via Playwright expect() auto-wait

Test Coverage

13 QA Lab UI sections covered across 12 test files. Same automation surface targeted in every Cross-Stack Series framework.

Buttons
Click states, disabled state assertion
Forms
Validation, field interaction, @parametrize submit
Input Fields
Text, number, date, search, URL types
Checkboxes
Check/uncheck, disabled state
Radio Buttons
Selection, mutual exclusivity
Dropdowns
Single select, multi-select
Tables
Cell content, row count, edit action
Alerts & Modals
Open, confirm, cancel, dismiss
Dynamic Visibility
Checkbox-triggered panel reveal
Async Buttons
Loading → success/error transitions
IFrames
frame_locator() — same API as TS
Drag & Drop
drag_and_drop() mouse simulation
Slider
Value change via fill() assertion

CI Test Results

Latest GitHub Actions run · May 9, 2026 · ubuntu-latest · View all runs →

29
Total Tests
29
Passed
0
Failed
1m 23s
Run Duration
Smoke 11 tests · ~7s
Regression 29 tests · ~10s
Parallelism 4 workers (pytest-xdist)
Report Allure → GitHub Pages

Tech Stack

Python ecosystem stack — every tool justified by real-world team requirements. Zero proprietary or paid dependencies.

🐍
Python 3.12 LTS
Language — LTS, typing improvements, universally available in CI environments
pytest 8.2
Test runner — fixture system, plugin ecosystem, industry standard for Python
🌐
Playwright-Python 1.44
Browser automation — same engine as Stack 1 TS — fair cross-stack comparison
📊
allure-pytest 2.13
Reporting — @allure.step, @allure.feature, failure screenshots, GitHub Pages deploy
pytest-xdist 3.5
Parallelism — -n auto CPU-count workers, --dist=loadfile for fixture safety
🔎
mypy 1.10 (strict)
Type checking — strict mode, zero errors enforced in CI before tests run
🔧
ruff 0.4
Linting — replaces flake8 + isort + black, ANN rules enforce type annotations
⚙️
GitHub Actions
CI/CD — smoke on push, full regression on main, Monday 09:00 UTC schedule
🤖
Claude Code
AI engineering accelerator — scaffolding, pattern review, CLAUDE.md specification

Cross-Stack Series

Same target, different stacks. Five frameworks built against the same QA Lab UI to produce evidence-based comparisons — not vendor benchmarks.

Performance Testing — Locust

Python-native load testing in the same virtual environment as the pytest suite. Locust is ecosystem-native to the Python stack — HttpUser with @task decorators, same venv, same CI job. No toolchain switch. Part of the Cross-Stack Performance Series.

38ms
p95 Response
650ms
p99 Response
0%
Error Rate
500ms
p95 SLO Target
Smoke 5 VU · 30s
Baseline 10 VU · 60s · main only
p99 note 650ms spike = CloudFront cold edge miss (warm ≤40ms)
Target QA Lab / CloudFront · SLO compliance
📊 View Full Performance Series →
Evgenii Subbotin
QA/SDET Lead · QA Architect · SAFe RTE

20 years in software engineering. This framework demonstrates cross-stack fluency — the ability to operate effectively in the Python ecosystem while understanding where different stacks deliver better outcomes for a given team context.