{"id":35741125,"url":"https://github.com/netresearch/typo3-testing-skill","last_synced_at":"2026-04-01T21:37:26.796Z","repository":{"id":319628053,"uuid":"1078702290","full_name":"netresearch/typo3-testing-skill","owner":"netresearch","description":"Agent Skill for creating and managing TYPO3 extension tests | Claude Code compatible","archived":false,"fork":false,"pushed_at":"2026-03-27T23:34:08.000Z","size":379,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-27T23:37:17.347Z","etag":null,"topics":["agent-skills","ai-agent","claude-code-skill","open-standard","skill","test-generator","testing","typo3","typo3-cms","typo3-extension"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/netresearch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-18T08:31:58.000Z","updated_at":"2026-03-27T23:34:11.000Z","dependencies_parsed_at":"2025-10-21T07:30:36.807Z","dependency_job_id":null,"html_url":"https://github.com/netresearch/typo3-testing-skill","commit_stats":null,"previous_names":["netresearch/typo3-testing-skill"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/netresearch/typo3-testing-skill","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netresearch%2Ftypo3-testing-skill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netresearch%2Ftypo3-testing-skill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netresearch%2Ftypo3-testing-skill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netresearch%2Ftypo3-testing-skill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/netresearch","download_url":"https://codeload.github.com/netresearch/typo3-testing-skill/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netresearch%2Ftypo3-testing-skill/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292434,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-skills","ai-agent","claude-code-skill","open-standard","skill","test-generator","testing","typo3","typo3-cms","typo3-extension"],"created_at":"2026-01-06T15:15:46.801Z","updated_at":"2026-04-01T21:37:26.787Z","avatar_url":"https://github.com/netresearch.png","language":"Shell","readme":"# TYPO3 Testing Skill\n\n[![Version](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://github.com/netresearch/typo3-testing-skill/releases/tag/v3.0.0)\n\nA comprehensive Claude Code skill for creating and managing TYPO3 extension tests.\n\n## 🔌 Compatibility\n\nThis is an **Agent Skill** following the [open standard](https://agentskills.io) originally developed by Anthropic and released for cross-platform use.\n\n**Supported Platforms:**\n- ✅ Claude Code (Anthropic)\n- ✅ Cursor\n- ✅ GitHub Copilot\n- ✅ Other skills-compatible AI agents\n\n\u003e Skills are portable packages of procedural knowledge that work across any AI agent supporting the Agent Skills specification.\n\n\n## Features\n\n- **Test Creation**: Generate Unit, Functional, and E2E tests\n- **E2E Testing**: Playwright-based browser automation (TYPO3 Core standard)\n- **Accessibility Testing**: axe-core integration for WCAG compliance\n- **Infrastructure Setup**: Automated testing infrastructure installation\n- **CI/CD Integration**: GitHub Actions and GitLab CI templates\n- **Quality Tools**: PHPStan, Rector, php-cs-fixer integration\n- **Fixture Management**: Database fixture templates and tooling\n- **Test Orchestration**: runTests.sh script pattern from TYPO3 best practices\n\n## Installation\n\n### Marketplace (Recommended)\n\nAdd the [Netresearch marketplace](https://github.com/netresearch/claude-code-marketplace) once, then browse and install skills:\n\n```bash\n# Claude Code\n/plugin marketplace add netresearch/claude-code-marketplace\n```\n\n### npx ([skills.sh](https://skills.sh))\n\nInstall with any [Agent Skills](https://agentskills.io)-compatible agent:\n\n```bash\nnpx skills add https://github.com/netresearch/typo3-testing-skill --skill typo3-testing\n```\n\n### Download Release\n\nDownload the [latest release](https://github.com/netresearch/typo3-testing-skill/releases/latest) and extract to your agent's skills directory.\n\n### Git Clone\n\n```bash\ngit clone https://github.com/netresearch/typo3-testing-skill.git\n```\n\n### Composer (PHP Projects)\n\n```bash\ncomposer require netresearch/typo3-testing-skill\n```\n\nRequires [netresearch/composer-agent-skill-plugin](https://github.com/netresearch/composer-agent-skill-plugin).\n## Quick Start\n\n1. **Setup testing infrastructure:**\n   ```bash\n   cd your-extension\n   ~/.claude/skills/typo3-testing/scripts/setup-testing.sh\n   ```\n\n2. **Generate a test:**\n   ```bash\n   ~/.claude/skills/typo3-testing/scripts/generate-test.sh unit MyService\n   ```\n\n3. **Run tests:**\n   ```bash\n   Build/Scripts/runTests.sh -s unit\n   composer ci:test\n   ```\n\n## Test Types\n\n### Unit Tests\nFast, isolated tests without external dependencies. Perfect for testing services, utilities, and domain logic.\n\n### Functional Tests\nTests with database and full TYPO3 instance. Use for repositories, controllers, and integration scenarios.\n\n### E2E Tests (Playwright)\nBrowser-based end-to-end tests using Playwright (TYPO3 Core standard). For testing complete user workflows, backend modules, and accessibility compliance with axe-core.\n\n## Advanced Testing Patterns\n\n### Advanced PHPUnit Configuration\n\nThe tea extension demonstrates production-grade PHPUnit configuration with parallel execution, strict mode, and comprehensive coverage analysis.\n\n#### Parallel Test Execution\n\nPHPUnit 10+ supports parallel test execution for significant performance improvements:\n\n**Configuration** (`Build/phpunit/UnitTests.xml`):\n\n```xml\n\u003cphpunit\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:noNamespaceSchemaLocation=\"../../.Build/vendor/phpunit/phpunit/phpunit.xsd\"\n    executionOrder=\"random\"\n    failOnRisky=\"true\"\n    failOnWarning=\"true\"\n    stopOnFailure=\"false\"\n    beStrictAboutTestsThatDoNotTestAnything=\"true\"\n    colors=\"true\"\n    cacheDirectory=\".Build/.phpunit.cache\"\u003e\n\n    \u003ctestsuites\u003e\n        \u003ctestsuite name=\"Unit Tests\"\u003e\n            \u003cdirectory\u003e../../Tests/Unit/\u003c/directory\u003e\n        \u003c/testsuite\u003e\n    \u003c/testsuites\u003e\n\n    \u003ccoverage includeUncoveredFiles=\"true\"\u003e\n        \u003creport\u003e\n            \u003cclover outputFile=\".Build/coverage/clover.xml\"/\u003e\n            \u003chtml outputDirectory=\".Build/coverage/html\"/\u003e\n            \u003ctext outputFile=\"php://stdout\" showUncoveredFiles=\"false\"/\u003e\n        \u003c/report\u003e\n    \u003c/coverage\u003e\n\u003c/phpunit\u003e\n```\n\n**Key Features**:\n\n- **`executionOrder=\"random\"`**: Detects hidden test dependencies by randomizing test order\n- **`failOnRisky=\"true\"`**: Treats risky tests as failures (tests without assertions)\n- **`failOnWarning=\"true\"`**: Fails on warnings like deprecated function usage\n- **`beStrictAboutTestsThatDoNotTestAnything=\"true\"`**: Ensures every test has assertions\n\n#### Separate Unit and Functional Configurations\n\nThe tea extension maintains separate PHPUnit configurations:\n\n**Unit Tests** (`Build/phpunit/UnitTests.xml`):\n- No database bootstrap\n- Fast execution (milliseconds per test)\n- Strict mode enabled\n- Code coverage analysis\n\n**Functional Tests** (`Build/phpunit/FunctionalTests.xml`):\n- Database bootstrap included\n- TYPO3 testing framework integration\n- SQLite for fast in-memory testing\n- Test doubles for external services\n\nExample functional test configuration:\n\n```xml\n\u003cphpunit\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:noNamespaceSchemaLocation=\"../../.Build/vendor/phpunit/phpunit/phpunit.xsd\"\n    stopOnFailure=\"false\"\n    colors=\"true\"\n    cacheDirectory=\".Build/.phpunit.cache\"\u003e\n\n    \u003ctestsuites\u003e\n        \u003ctestsuite name=\"Functional Tests\"\u003e\n            \u003cdirectory\u003e../../Tests/Functional/\u003c/directory\u003e\n        \u003c/testsuite\u003e\n    \u003c/testsuites\u003e\n\n    \u003cphp\u003e\n        \u003cini name=\"display_errors\" value=\"1\"/\u003e\n        \u003cenv name=\"TYPO3_CONTEXT\" value=\"Testing\"/\u003e\n    \u003c/php\u003e\n\u003c/phpunit\u003e\n```\n\n#### Coverage Thresholds\n\nEnforce minimum coverage requirements via composer scripts:\n\n```json\n{\n  \"scripts\": {\n    \"ci:coverage:check\": [\n      \"@ci:tests:unit\",\n      \"phpunit --configuration Build/phpunit/UnitTests.xml --coverage-text --coverage-clover=.Build/coverage/clover.xml\",\n      \"phpunit-coverage-check .Build/coverage/clover.xml 70\"\n    ]\n  }\n}\n```\n\n**Progressive Coverage Targets**:\n- MVP Extensions: 50% minimum\n- Production Extensions: 70% minimum\n- Reference Extensions: 80%+ target\n\n### CSV Fixture and Assertion Pattern\n\nThe tea extension demonstrates an elegant CSV-based pattern for functional test fixtures, significantly improving test readability and maintainability.\n\n#### Problem Statement\n\nTraditional fixture loading in TYPO3 functional tests uses SQL files or PHP arrays:\n\n```php\n// ❌ Traditional approach: Verbose and hard to read\nprotected function setUp(): void\n{\n    parent::setUp();\n    $this-\u003eimportCSVDataSet(__DIR__ . '/Fixtures/Database/pages.csv');\n    $this-\u003eimportCSVDataSet(__DIR__ . '/Fixtures/Database/tt_content.csv');\n    $this-\u003eimportCSVDataSet(__DIR__ . '/Fixtures/Database/tx_tea_domain_model_product_tea.csv');\n}\n```\n\n#### CSV Fixture Pattern\n\n**Fixture File** (`Tests/Functional/Fixtures/Database/tea.csv`):\n\n```csv\ntx_tea_domain_model_product_tea\nuid,pid,title,description,owner\n1,1,\"Earl Grey\",\"Classic black tea\",1\n2,1,\"Green Tea\",\"Organic green tea\",1\n3,2,\"Oolong Tea\",\"Traditional oolong\",2\n```\n\n**Loading in Test**:\n\n```php\nuse TYPO3\\TestingFramework\\Core\\Functional\\FunctionalTestCase;\n\nfinal class TeaRepositoryTest extends FunctionalTestCase\n{\n    protected array $testExtensionsToLoad = [\n        'typo3conf/ext/tea',\n    ];\n\n    protected function setUp(): void\n    {\n        parent::setUp();\n        $this-\u003eimportCSVDataSet(__DIR__ . '/Fixtures/Database/tea.csv');\n    }\n\n    /**\n     * @test\n     */\n    public function findAllReturnsAllRecords(): void\n    {\n        $result = $this-\u003esubject-\u003efindAll();\n\n        self::assertCount(3, $result);\n    }\n}\n```\n\n#### CSV Assertion Pattern\n\n**Even More Powerful**: Assert database state using CSV format:\n\n**Expected State File** (`Tests/Functional/Fixtures/Database/AssertTeaAfterCreate.csv`):\n\n```csv\ntx_tea_domain_model_product_tea\nuid,pid,title,description,owner\n1,1,\"Earl Grey\",\"Classic black tea\",1\n2,1,\"Green Tea\",\"Organic green tea\",1\n3,2,\"Oolong Tea\",\"Traditional oolong\",2\n4,1,\"New Tea\",\"Newly created tea\",1\n```\n\n**Assertion in Test**:\n\n```php\n/**\n * @test\n */\npublic function createPersistsNewTea(): void\n{\n    $newTea = new Tea();\n    $newTea-\u003esetTitle('New Tea');\n    $newTea-\u003esetDescription('Newly created tea');\n\n    $this-\u003esubject-\u003eadd($newTea);\n    $this-\u003epersistenceManager-\u003epersistAll();\n\n    // Assert entire database state matches expected CSV\n    $this-\u003eassertCSVDataSet(__DIR__ . '/Fixtures/Database/AssertTeaAfterCreate.csv');\n}\n```\n\n#### Benefits\n\n1. **Readability**: CSV format is human-readable and version control friendly\n2. **Maintainability**: Easy to modify fixtures without PHP syntax knowledge\n3. **Comprehensive Assertions**: Assert entire table state in single call\n4. **Change Detection**: Diff tools show fixture changes clearly\n5. **Cross-Test Reuse**: Same CSV fixtures reusable across multiple tests\n\n#### Best Practices\n\n**Minimal Fixtures**: Include only necessary columns for the test:\n\n```csv\ntx_tea_domain_model_product_tea\nuid,title\n1,\"Earl Grey\"\n2,\"Green Tea\"\n```\n\n**Named Test Data**: Use descriptive titles to make test intent clear:\n\n```csv\ntx_tea_domain_model_product_tea\nuid,title,deleted\n1,\"Active Tea\",0\n2,\"Deleted Tea\",1\n```\n\n**Fixture Organization**:\n\n```\nTests/Functional/\n├── Fixtures/\n│   └── Database/\n│       ├── tea_initial.csv           # Initial state\n│       ├── tea_after_create.csv      # Expected after creation\n│       ├── tea_after_update.csv      # Expected after update\n│       └── tea_after_delete.csv      # Expected after deletion\n```\n\n### Multi-Database Testing\n\nThe tea extension demonstrates comprehensive multi-database testing across SQLite, MariaDB, MySQL, and PostgreSQL, ensuring compatibility across all TYPO3-supported database systems.\n\n#### Why Multi-Database Testing Matters\n\nDifferent databases have subtle behavioral differences:\n\n- **SQLite**: Case-insensitive LIKE, limited ALTER TABLE support\n- **MySQL**: Case sensitivity varies by OS and configuration\n- **MariaDB**: Different optimizer behavior, JSON handling differences\n- **PostgreSQL**: Strict type casting, different string comparison semantics\n\nExtensions using advanced SQL features (e.g., JSON columns, full-text search, stored procedures) must test across all target databases.\n\n#### runTests.sh Pattern\n\nThe tea extension uses `Build/Scripts/runTests.sh` for orchestrated multi-database testing:\n\n```bash\n#!/usr/bin/env bash\n\n# Run functional tests against SQLite (default, fast)\n./Build/Scripts/runTests.sh -s functional\n\n# Run functional tests against MariaDB 10.11\n./Build/Scripts/runTests.sh -s functional -d mariadb -i 10.11\n\n# Run functional tests against MySQL 8.0\n./Build/Scripts/runTests.sh -s functional -d mysql -i 8.0\n\n# Run functional tests against PostgreSQL 16\n./Build/Scripts/runTests.sh -s functional -d postgres -i 16\n```\n\n**Script Responsibilities**:\n1. Docker container orchestration\n2. Database initialization and schema setup\n3. Test execution with proper environment variables\n4. Cleanup and teardown\n\n#### CI Matrix Configuration\n\n**GitHub Actions** (`.github/workflows/ci.yml`):\n\n```yaml\nname: CI\n\non: [push, pull_request]\n\njobs:\n  functional-tests:\n    name: Functional Tests\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        php: ['8.2', '8.3', '8.4']\n        typo3: ['12.4', '13.0']\n        database:\n          - type: 'sqlite'\n          - type: 'mariadb'\n            version: '10.11'\n          - type: 'mysql'\n            version: '8.0'\n          - type: 'postgres'\n            version: '16'\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          extensions: pdo_sqlite, pdo_mysql, pdo_pgsql\n\n      - name: Composer Install\n        run: composer install --no-progress\n\n      - name: Functional Tests\n        run: |\n          if [ \"${{ matrix.database.type }}\" = \"sqlite\" ]; then\n            ./Build/Scripts/runTests.sh -s functional\n          else\n            ./Build/Scripts/runTests.sh -s functional -d ${{ matrix.database.type }} -i ${{ matrix.database.version }}\n          fi\n```\n\nThis matrix runs tests across:\n- 3 PHP versions × 2 TYPO3 versions × 4 databases = **24 test combinations**\n\n#### Database-Specific Considerations\n\n**SQLite Advantages**:\n- Fast (in-memory execution)\n- No external dependencies\n- Ideal for local development\n\n**SQLite Limitations**:\n```php\n// ❌ Won't work on SQLite (lacks ALTER TABLE support)\n$connection-\u003eexecuteUpdate('ALTER TABLE tt_content ADD COLUMN new_field VARCHAR(255)');\n\n// ✅ Use TYPO3 API instead (cross-database compatible)\n$schemaManager = $connection-\u003egetSchemaManager();\n$column = new Column('new_field', Type::getType('string'), ['length' =\u003e 255]);\n$schemaManager-\u003eaddColumn('tt_content', $column);\n```\n\n**PostgreSQL Strict Typing**:\n```php\n// ❌ MySQL/MariaDB allow implicit conversion, PostgreSQL doesn't\n$queryBuilder-\u003ewhere(\n    $queryBuilder-\u003eexpr()-\u003eeq('uid', '123')  // String '123' vs INT uid\n);\n\n// ✅ Explicit type casting works everywhere\n$queryBuilder-\u003ewhere(\n    $queryBuilder-\u003eexpr()-\u003eeq('uid', $queryBuilder-\u003ecreateNamedParameter(123, \\PDO::PARAM_INT))\n);\n```\n\n#### Local Multi-Database Testing\n\nDevelopers can run multi-database tests locally:\n\n```bash\n# Quick SQLite test during development\ncomposer ci:tests:functional\n\n# Comprehensive multi-DB test before pushing\n./Build/Scripts/runTests.sh -s functional -d mariadb\n./Build/Scripts/runTests.sh -s functional -d mysql\n./Build/Scripts/runTests.sh -s functional -d postgres\n```\n\n#### Docker Compose Alternative\n\nFor complex scenarios, use `docker-compose.yml`:\n\n```yaml\nversion: '3.8'\n\nservices:\n  mariadb:\n    image: mariadb:10.11\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: test\n    ports:\n      - \"3306:3306\"\n\n  postgres:\n    image: postgres:16\n    environment:\n      POSTGRES_PASSWORD: root\n      POSTGRES_DB: test\n    ports:\n      - \"5432:5432\"\n\n  mysql:\n    image: mysql:8.0\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: test\n    ports:\n      - \"3307:3306\"\n```\n\n### runTests.sh Orchestration Pattern\n\nThe `runTests.sh` script from the tea extension provides comprehensive test orchestration with Docker-based isolation.\n\n#### Core Features\n\n**1. Test Suite Selection**:\n```bash\n./Build/Scripts/runTests.sh -s unit              # Unit tests only\n./Build/Scripts/runTests.sh -s functional        # Functional tests\n./Build/Scripts/runTests.sh -s acceptance        # Acceptance tests\n./Build/Scripts/runTests.sh -s lint              # PHP linting\n./Build/Scripts/runTests.sh -s phpstan           # Static analysis\n```\n\n**2. Database Selection**:\n```bash\n./Build/Scripts/runTests.sh -s functional -d sqlite       # Default\n./Build/Scripts/runTests.sh -s functional -d mariadb      # MariaDB\n./Build/Scripts/runTests.sh -s functional -d mysql        # MySQL\n./Build/Scripts/runTests.sh -s functional -d postgres     # PostgreSQL\n```\n\n**3. Version Control**:\n```bash\n./Build/Scripts/runTests.sh -s functional -d mariadb -i 10.11\n./Build/Scripts/runTests.sh -s functional -d postgres -i 16\n./Build/Scripts/runTests.sh -p 8.3              # PHP version\n```\n\n**4. Cleanup and Maintenance**:\n```bash\n./Build/Scripts/runTests.sh -s clean            # Remove containers\n./Build/Scripts/runTests.sh -s composer update  # Update dependencies\n```\n\n#### Implementation Structure\n\n**Key Components**:\n\n```bash\n#!/usr/bin/env bash\n\n# Parse command line arguments\nwhile getopts \"s:d:i:p:h\" option; do\n    case ${option} in\n        s) TEST_SUITE=${OPTARG} ;;\n        d) DATABASE=${OPTARG} ;;\n        i) DATABASE_VERSION=${OPTARG} ;;\n        p) PHP_VERSION=${OPTARG} ;;\n        h) showHelp; exit 0 ;;\n    esac\ndone\n\n# Set defaults\nDATABASE=${DATABASE:-sqlite}\nPHP_VERSION=${PHP_VERSION:-8.2}\n\n# Container configuration\nCONTAINER_NAME=\"typo3-testing-${DATABASE}\"\nDOCKER_IMAGE=\"typo3/core-testing-${DATABASE}:${DATABASE_VERSION}\"\n\n# Execute test suite in container\ndocker run \\\n    --name ${CONTAINER_NAME} \\\n    --rm \\\n    -v $(pwd):/app \\\n    -w /app \\\n    ${DOCKER_IMAGE} \\\n    /bin/bash -c \"composer ci:tests:${TEST_SUITE}\"\n```\n\n#### Benefits\n\n1. **Isolation**: Each test run in clean container environment\n2. **Reproducibility**: Same environment locally and in CI\n3. **Version Flexibility**: Test against multiple PHP/TYPO3/DB versions\n4. **Developer Convenience**: Single command for all test types\n5. **CI Integration**: Same script used locally and in CI\n\n#### Integration with Composer Scripts\n\nComposer scripts delegate to `runTests.sh`:\n\n```json\n{\n  \"scripts\": {\n    \"ci:tests:unit\": \"Build/Scripts/runTests.sh -s unit\",\n    \"ci:tests:functional\": \"Build/Scripts/runTests.sh -s functional\",\n    \"ci:tests:functional:mariadb\": \"Build/Scripts/runTests.sh -s functional -d mariadb\",\n    \"ci:tests:functional:postgres\": \"Build/Scripts/runTests.sh -s functional -d postgres\",\n    \"ci:tests\": [\n      \"@ci:tests:unit\",\n      \"@ci:tests:functional\"\n    ]\n  }\n}\n```\n\nThis maintains the local-CI parity principle: developers and CI use identical commands.\n\n#### Example Usage Workflows\n\n**Development Workflow**:\n```bash\n# Quick unit test during coding\ncomposer ci:tests:unit\n\n# Functional test before commit\ncomposer ci:tests:functional\n\n# Full test suite before push\ncomposer ci:tests\n```\n\n**Pre-Release Workflow**:\n```bash\n# Test against all databases\n./Build/Scripts/runTests.sh -s functional -d sqlite\n./Build/Scripts/runTests.sh -s functional -d mariadb -i 10.11\n./Build/Scripts/runTests.sh -s functional -d mysql -i 8.0\n./Build/Scripts/runTests.sh -s functional -d postgres -i 16\n\n# Test against multiple PHP versions\n./Build/Scripts/runTests.sh -s unit -p 8.2\n./Build/Scripts/runTests.sh -s unit -p 8.3\n./Build/Scripts/runTests.sh -s unit -p 8.4\n```\n\n**CI/CD Workflow**:\n```yaml\n# .github/workflows/ci.yml\n- name: Unit Tests\n  run: composer ci:tests:unit\n\n- name: Functional Tests (SQLite)\n  run: composer ci:tests:functional\n\n- name: Functional Tests (MariaDB)\n  run: composer ci:tests:functional:mariadb\n\n- name: Functional Tests (PostgreSQL)\n  run: composer ci:tests:functional:postgres\n```\n\n## Documentation\n\n- [SKILL.md](SKILL.md) - Main workflow guide with decision trees\n- [references/](references/) - Detailed testing documentation\n- [assets/](skills/typo3-testing/assets/) - PHPUnit configs, AGENTS.md, examples\n\n## Requirements\n\n- PHP 8.1+\n- Composer\n- Docker (for functional tests)\n- Node.js 22.18+ (for E2E tests)\n- TYPO3 v12 or v13\n\n## Based On\n\n- [TYPO3 Testing Framework](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Testing/)\n- [TYPO3 Best Practices: tea extension](https://github.com/TYPO3BestPractices/tea)\n- TYPO3 community best practices\n\n## Acknowledgments\n\nThis skill stands on the shoulders of the TYPO3 community's exceptional work. We gratefully acknowledge:\n\n- **[TYPO3 Core Development Team](https://typo3.org/community/teams/typo3-development)** — For creating and maintaining the TYPO3 Testing Framework, the `typo3/core-testing-*` Docker images, and establishing the testing patterns that make this skill possible.\n\n- **[TYPO3 Best Practices Team](https://typo3.org/community/teams/best-practices)** — For the exemplary [Tea Extension](https://github.com/TYPO3BestPractices/tea) that serves as the reference implementation for testing infrastructure, demonstrating production-grade PHPUnit configuration, multi-database testing, and runTests.sh orchestration.\n\n- **[TYPO3 Documentation Team](https://typo3.org/community/teams/documentation)** — For the comprehensive testing documentation that guides extension developers toward quality practices.\n\n## License\n\nThis project uses split licensing:\n\n- **Code** (scripts, workflows, configs): [MIT](LICENSE-MIT)\n- **Content** (skill definitions, documentation, references): [CC-BY-SA-4.0](LICENSE-CC-BY-SA-4.0)\n\nSee the individual license files for full terms.\n## Maintained By\n\nNetresearch DTT GmbH, Leipzig\n\n---\n\n**Made with ❤️ for Open Source by [Netresearch](https://www.netresearch.de/)**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetresearch%2Ftypo3-testing-skill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetresearch%2Ftypo3-testing-skill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetresearch%2Ftypo3-testing-skill/lists"}