testing

  • Running PHPUnit inside PHPUnit

    Testing an extension, which means executing a test run and asserting on what it produced. A subprocess rather than an in-process run, because the extension registers against a…

  • A PHPUnit extension, and the event that does not exist

    An extension that needs coverage data, which the event system does not carry. The event system is about test lifecycle rather than about the runner’s outputs, which is…

  • The value object library, five years on

    32 value objects in 2021, 41 now, and a retrospective on which of them earned their place. No symptom — a deliberate look.

  • Building an MCP server for a database

    turkerdev/mysql-mcp, and what a protocol for tool access actually requires. The authorisation model is the host’s problem, which means it is all yours.

  • The stylesheet that finally got a second maintainer

    2,100 lines that one person could change, and the year spent fixing that. Every stylesheet change routed through one person for four years.

  • Writing a PHPUnit extension

    turkerdev/phpunit-json-coverage-report, and a coverage report a machine can read. Coverage as a percentage in a log, and no way to ask which paths changed.

  • The suite at ninety seconds, a year later

    A suite that reached ninety seconds in 2025, measured again after a year of tests being added. Treating suite duration as a budget with a trend rather than…

  • Testing a lint config with fixtures

    A lint config with tests, which is unusual and is the only way to know a rule change did what was intended. A config change with no test…

  • Ten years of a WordPress site, and what is left of the theme

    A theme that was 61 PHP templates in 2023 and is six block templates and a stylesheet. An audit rather than a problem.

  • A dual-write window, and the check that ran nightly

    Six weeks of writing two columns, and a check that they agree. The nightly agreement check is what makes a dual-write window safe, and it caught exactly the…