QA Engineering Assessment · Player API

Player API
Tests

ASP.NET Core 8 Web API built and tested solo in 3 days. Full NUnit suite covering unit and integration layers — 28 tests, all green.

ASP.NET Core 8 · C# 12 · NUnit 3 · WebApplicationFactory · Swagger · Railway

✓ 28 Tests Pass ☁️ Live on Railway 🔄 CI/CD Green 5 API Endpoints 12 Unit + 16 Integration 3-Day Sprint AI-First Delivery

About This Project

The Challenge

A QA Engineering Assessment requiring candidates to design and implement a production-ready REST API for player management from scratch — then write comprehensive test coverage for it.

The constraint: 3-day sprint, solo delivery, acting simultaneously as API developer, QA engineer, and delivery manager.

This project demonstrates that an experienced QA Engineer can own both the implementation and the verification — not just test what others build.

The Approach

AI-First Engineering: Claude Code was used as the primary accelerator — not a replacement for engineering judgment. Every decision is documented in architectural records and a specification file that served as the project's source of truth.

Two-layer test strategy:

  • 12 unit tests — PlayerStore in isolation, no HTTP
  • 16 integration tests — full API pipeline via WebApplicationFactory
  • 100% endpoint coverage, positive and negative paths
  • All 28 tests green on clean clone

Delivered on time with full documentation and live CI pipeline.

Project Documentation Library

Engineering artefacts authored during the sprint — architectural decisions, test plan, and security assessment.

CI Test Results

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

28
Total Tests
28
Passed
0
Failed
41s
Run Duration
Integration 16 tests · WebApplicationFactory
Unit 12 tests · PlayerStore direct
Test Execution 991ms (NUnit)
Trigger Push · PR to main

Tech Stack

Every tool selected for a documented reason — see the ADR collection for full justification.

⚙️
ASP.NET Core 8
LTS Web API framework — minimal hosting model, built-in DI
🔮
C# 12
Primary constructors, records, pattern matching — clean models
🧰
NUnit 3
Unit + integration test framework — rich assertion model
🔌
WebApplicationFactory
In-process integration testing — no real ports, no deployment
🔒
JWT Bearer
Stateless auth — signature-only validation, 1-hour expiry
🚫
ConcurrentDictionary
Thread-safe in-memory store — zero I/O, deterministic resets
📄
Swagger (Swashbuckle)
Auto-generated API docs from XML comments — zero extra cost
GitHub Actions
Build → Test → TRX report → HTML report → Railway deploy
🚂
Railway
Free-tier Docker deployment — public API URL + Swagger UI
🤖
Claude Code
AI engineering accelerator — primary development tool

Performance Testing — Apache JMeter

Separate standalone repo targeting the live Player API on Railway. JMeter 5.6.3 with full JWT authentication flow per virtual user. Stepped stress ramp demonstrates real degradation on Railway’s 512MB RAM free tier. Part of the Cross-Stack Performance Series.

🔎 Engineering Finding — Write Contention & Railway RAM Ceiling

ConcurrentDictionary write contention is visible in the p99 long tail at 15+ concurrent users. At 25–30 VU, Railway 502/503 errors emerge — the 512MB RAM allocation ceiling on the free tier. Cold start of ~5 seconds after inactivity is isolated by a dedicated warm-up Thread Group before load begins. Real degradation on real infrastructure with real documented constraints. The p99/p95 ratio reaches 2.6× at the breaking point — a classic contention signature.

126ms
Smoke avg (5 VU)
~7.2s
p99 at 30 VU
3–5%
Errors at 30 VU
~25 VU
Degradation Threshold
Smoke (5 VU) avg 126ms · p99 520ms · 0% errors
Baseline (10 VU) avg 171ms · p99 1050ms · <0.5% errors
Stress (5→15→30 VU) 502/503 at 30 VU · weekly schedule only
Auth overhead ~15–20% of cycle time per VU
📊 View Full Performance Series →
Evgenii Subbotin
QA/SDET Lead · QA Architect · SAFe RTE

20 years in software engineering. This project demonstrates full-cycle API delivery — design, implementation, testing, documentation, and CI/CD in a 3-day solo sprint.