Initial commit
This commit is contained in:
691
references/test-runners.md
Normal file
691
references/test-runners.md
Normal file
@@ -0,0 +1,691 @@
|
||||
# Test Runners and Orchestration
|
||||
|
||||
The `runTests.sh` script is the standard TYPO3 pattern for orchestrating all quality checks and test suites.
|
||||
|
||||
## Purpose
|
||||
|
||||
- Single entry point for all testing and quality checks
|
||||
- Consistent environment across local and CI/CD
|
||||
- Handles Docker, database setup, and test execution
|
||||
- Based on [TYPO3 Best Practices tea extension](https://github.com/TYPO3BestPractices/tea)
|
||||
|
||||
## Script Location
|
||||
|
||||
```
|
||||
Build/Scripts/runTests.sh
|
||||
```
|
||||
|
||||
## Basic Usage
|
||||
|
||||
```bash
|
||||
# Show help
|
||||
./Build/Scripts/runTests.sh -h
|
||||
|
||||
# Run specific test suite
|
||||
./Build/Scripts/runTests.sh -s unit
|
||||
./Build/Scripts/runTests.sh -s functional
|
||||
./Build/Scripts/runTests.sh -s acceptance
|
||||
|
||||
# Run quality tools
|
||||
./Build/Scripts/runTests.sh -s lint
|
||||
./Build/Scripts/runTests.sh -s phpstan
|
||||
./Build/Scripts/runTests.sh -s cgl
|
||||
./Build/Scripts/runTests.sh -s rector
|
||||
```
|
||||
|
||||
## Script Options
|
||||
|
||||
```
|
||||
-s <suite> Test suite to run (required)
|
||||
unit, functional, acceptance, lint, phpstan, cgl, rector
|
||||
|
||||
-d <driver> Database driver for functional tests
|
||||
mysqli (default), pdo_mysql, postgres, sqlite
|
||||
|
||||
-p <version> PHP version (7.4, 8.1, 8.2, 8.3)
|
||||
|
||||
-e <command> Execute specific command in container
|
||||
|
||||
-n Don't pull Docker images
|
||||
|
||||
-u Update composer dependencies
|
||||
|
||||
-v Enable verbose output
|
||||
|
||||
-x Stop on first error (PHPUnit --stop-on-error)
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Run Unit Tests
|
||||
|
||||
```bash
|
||||
# Default PHP version
|
||||
./Build/Scripts/runTests.sh -s unit
|
||||
|
||||
# Specific PHP version
|
||||
./Build/Scripts/runTests.sh -s unit -p 8.3
|
||||
|
||||
# Stop on first error
|
||||
./Build/Scripts/runTests.sh -s unit -x
|
||||
```
|
||||
|
||||
### Run Functional Tests
|
||||
|
||||
```bash
|
||||
# Default database (mysqli)
|
||||
./Build/Scripts/runTests.sh -s functional
|
||||
|
||||
# PostgreSQL
|
||||
./Build/Scripts/runTests.sh -s functional -d postgres
|
||||
|
||||
# SQLite (fastest for local development)
|
||||
./Build/Scripts/runTests.sh -s functional -d sqlite
|
||||
```
|
||||
|
||||
### Run Quality Tools
|
||||
|
||||
```bash
|
||||
# Lint all PHP files
|
||||
./Build/Scripts/runTests.sh -s lint
|
||||
|
||||
# PHPStan static analysis
|
||||
./Build/Scripts/runTests.sh -s phpstan
|
||||
|
||||
# Code style check
|
||||
./Build/Scripts/runTests.sh -s cgl
|
||||
|
||||
# Rector automated refactoring
|
||||
./Build/Scripts/runTests.sh -s rector
|
||||
```
|
||||
|
||||
### Custom Commands
|
||||
|
||||
```bash
|
||||
# Run specific test file
|
||||
./Build/Scripts/runTests.sh -s unit -e "bin/phpunit Tests/Unit/Domain/Model/ProductTest.php"
|
||||
|
||||
# Run with coverage
|
||||
./Build/Scripts/runTests.sh -s unit -e "bin/phpunit --coverage-html coverage/"
|
||||
```
|
||||
|
||||
## Composer Integration
|
||||
|
||||
Integrate runTests.sh into composer.json:
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"ci:test": [
|
||||
"@ci:test:php:lint",
|
||||
"@ci:test:php:phpstan",
|
||||
"@ci:test:php:cgl",
|
||||
"@ci:test:php:rector",
|
||||
"@ci:test:php:unit",
|
||||
"@ci:test:php:functional"
|
||||
],
|
||||
"ci:test:php:lint": "Build/Scripts/runTests.sh -s lint",
|
||||
"ci:test:php:phpstan": "Build/Scripts/runTests.sh -s phpstan",
|
||||
"ci:test:php:cgl": "Build/Scripts/runTests.sh -s cgl",
|
||||
"ci:test:php:rector": "Build/Scripts/runTests.sh -s rector",
|
||||
"ci:test:php:unit": "Build/Scripts/runTests.sh -s unit",
|
||||
"ci:test:php:functional": "Build/Scripts/runTests.sh -s functional"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Then run via composer:
|
||||
|
||||
```bash
|
||||
composer ci:test # All checks
|
||||
composer ci:test:php:unit # Just unit tests
|
||||
composer ci:test:php:phpstan # Just PHPStan
|
||||
```
|
||||
|
||||
## Script Structure
|
||||
|
||||
### Basic Template
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Script configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
|
||||
# Default values
|
||||
TEST_SUITE=""
|
||||
DATABASE_DRIVER="mysqli"
|
||||
PHP_VERSION="8.4"
|
||||
VERBOSE=""
|
||||
|
||||
# Parse arguments
|
||||
while getopts ":s:d:p:e:nuvx" opt; do
|
||||
case ${opt} in
|
||||
s) TEST_SUITE=${OPTARG} ;;
|
||||
d) DATABASE_DRIVER=${OPTARG} ;;
|
||||
p) PHP_VERSION=${OPTARG} ;;
|
||||
*) showHelp; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate required arguments
|
||||
if [ -z "${TEST_SUITE}" ]; then
|
||||
echo "Error: -s parameter (test suite) is required"
|
||||
showHelp
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Execute test suite
|
||||
case ${TEST_SUITE} in
|
||||
unit)
|
||||
runUnitTests
|
||||
;;
|
||||
functional)
|
||||
runFunctionalTests
|
||||
;;
|
||||
lint)
|
||||
runLint
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unknown test suite: ${TEST_SUITE}"
|
||||
showHelp
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
### Docker Integration
|
||||
|
||||
```bash
|
||||
runUnitTests() {
|
||||
CONTAINER_PATH="/app"
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:${CONTAINER_PATH}" \
|
||||
-w "${CONTAINER_PATH}" \
|
||||
php:${PHP_VERSION}-cli \
|
||||
bin/phpunit -c Build/phpunit/UnitTests.xml
|
||||
}
|
||||
|
||||
runFunctionalTests() {
|
||||
CONTAINER_PATH="/app"
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:${CONTAINER_PATH}" \
|
||||
-w "${CONTAINER_PATH}" \
|
||||
-e typo3DatabaseDriver="${DATABASE_DRIVER}" \
|
||||
-e typo3DatabaseHost="localhost" \
|
||||
-e typo3DatabaseName="typo3_test" \
|
||||
php:${PHP_VERSION}-cli \
|
||||
bin/phpunit -c Build/phpunit/FunctionalTests.xml
|
||||
}
|
||||
```
|
||||
|
||||
### Quality Tool Functions
|
||||
|
||||
```bash
|
||||
runLint() {
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:/app" \
|
||||
-w /app \
|
||||
php:${PHP_VERSION}-cli \
|
||||
vendor/bin/phplint
|
||||
}
|
||||
|
||||
runPhpstan() {
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:/app" \
|
||||
-w /app \
|
||||
php:${PHP_VERSION}-cli \
|
||||
vendor/bin/phpstan analyze --configuration Build/phpstan.neon
|
||||
}
|
||||
|
||||
runCgl() {
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:/app" \
|
||||
-w /app \
|
||||
php:${PHP_VERSION}-cli \
|
||||
vendor/bin/php-cs-fixer fix --config Build/php-cs-fixer.php --dry-run --diff
|
||||
}
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
Configure via environment variables:
|
||||
|
||||
```bash
|
||||
# Database configuration
|
||||
export typo3DatabaseDriver=pdo_mysql
|
||||
export typo3DatabaseHost=db
|
||||
export typo3DatabasePort=3306
|
||||
export typo3DatabaseName=typo3_test
|
||||
export typo3DatabaseUsername=root
|
||||
export typo3DatabasePassword=root
|
||||
|
||||
# TYPO3 context
|
||||
export TYPO3_CONTEXT=Testing
|
||||
|
||||
# Run tests
|
||||
./Build/Scripts/runTests.sh -s functional
|
||||
```
|
||||
|
||||
## CI/CD Integration
|
||||
|
||||
### GitHub Actions
|
||||
|
||||
```yaml
|
||||
name: Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
php: '8.2', '8.2', '8.3']
|
||||
suite: ['unit', 'functional', 'lint', 'phpstan']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Run ${{ matrix.suite }} tests
|
||||
run: Build/Scripts/runTests.sh -s ${{ matrix.suite }} -p ${{ matrix.php }}
|
||||
```
|
||||
|
||||
### GitLab CI
|
||||
|
||||
```yaml
|
||||
.test:
|
||||
image: php:${PHP_VERSION}-cli
|
||||
script:
|
||||
- Build/Scripts/runTests.sh -s ${TEST_SUITE} -p ${PHP_VERSION}
|
||||
|
||||
unit:8.2:
|
||||
extends: .test
|
||||
variables:
|
||||
PHP_VERSION: "8.2"
|
||||
TEST_SUITE: "unit"
|
||||
|
||||
functional:8.2:
|
||||
extends: .test
|
||||
variables:
|
||||
PHP_VERSION: "8.2"
|
||||
TEST_SUITE: "functional"
|
||||
```
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Parallel Execution
|
||||
|
||||
```bash
|
||||
# Run linting in parallel (fast)
|
||||
find . -name '*.php' -print0 | xargs -0 -n1 -P8 php -l
|
||||
|
||||
# PHPUnit parallel execution
|
||||
vendor/bin/paratest -c Build/phpunit/UnitTests.xml --processes=4
|
||||
```
|
||||
|
||||
### Caching
|
||||
|
||||
```bash
|
||||
# Cache Composer dependencies
|
||||
if [ ! -d "${PROJECT_DIR}/.cache/composer" ]; then
|
||||
mkdir -p "${PROJECT_DIR}/.cache/composer"
|
||||
fi
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
-v "${PROJECT_DIR}:/app" \
|
||||
-v "${PROJECT_DIR}/.cache/composer:/tmp/composer-cache" \
|
||||
php:${PHP_VERSION}-cli \
|
||||
composer install --no-progress --no-suggest
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Single Source of Truth**: Use runTests.sh for all test execution
|
||||
2. **CI/CD Alignment**: CI should use same script as local development
|
||||
3. **Docker Isolation**: Run tests in containers for consistency
|
||||
4. **Fast Feedback**: Run lint and unit tests first (fastest)
|
||||
5. **Matrix Testing**: Test multiple PHP versions and databases
|
||||
6. **Caching**: Cache dependencies to speed up execution
|
||||
7. **Verbose Mode**: Use `-v` flag for debugging test failures
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Docker Permission Issues
|
||||
|
||||
```bash
|
||||
# Run with current user
|
||||
docker run \
|
||||
--rm \
|
||||
--user $(id -u):$(id -g) \
|
||||
-v "${PROJECT_DIR}:/app" \
|
||||
php:${PHP_VERSION}-cli \
|
||||
bin/phpunit
|
||||
```
|
||||
|
||||
### Database Connection Errors
|
||||
|
||||
```bash
|
||||
# Verify database is accessible
|
||||
docker run --rm --network host mysql:8.0 \
|
||||
mysql -h localhost -u root -p -e "SELECT 1"
|
||||
|
||||
# Use SQLite for simple tests
|
||||
./Build/Scripts/runTests.sh -s functional -d sqlite
|
||||
```
|
||||
|
||||
### Missing Dependencies
|
||||
|
||||
```bash
|
||||
# Update dependencies
|
||||
./Build/Scripts/runTests.sh -s unit -u
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- [TYPO3 Tea Extension runTests.sh](https://github.com/TYPO3BestPractices/tea/blob/main/Build/Scripts/runTests.sh)
|
||||
- [TYPO3 Testing Documentation](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Testing/)
|
||||
- [PHPUnit Documentation](https://phpunit.de/documentation.html)
|
||||
|
||||
## Multi-PHP Version Testing
|
||||
|
||||
TYPO3 extensions should support multiple PHP versions to maximize compatibility. This section covers testing strategies for all supported PHP versions.
|
||||
|
||||
### Standard Approach: Using Build/Scripts/runTests.sh
|
||||
|
||||
The `runTests.sh` script with Docker containers is the recommended TYPO3 testing approach. It provides isolated environments and consistent results.
|
||||
|
||||
#### Testing Across PHP Versions with Docker
|
||||
|
||||
```bash
|
||||
# Test with PHP 8.2
|
||||
./Build/Scripts/runTests.sh -s unit -p 8.2
|
||||
./Build/Scripts/runTests.sh -s functional -p 8.2 -d sqlite
|
||||
|
||||
# Test with PHP 8.3
|
||||
./Build/Scripts/runTests.sh -s unit -p 8.3
|
||||
./Build/Scripts/runTests.sh -s functional -p 8.3 -d sqlite
|
||||
|
||||
# Test with PHP 8.4
|
||||
./Build/Scripts/runTests.sh -s unit -p 8.4
|
||||
./Build/Scripts/runTests.sh -s functional -p 8.4 -d sqlite
|
||||
```
|
||||
|
||||
**Advantages:**
|
||||
- Isolated Docker containers per PHP version
|
||||
- Consistent environment across local and CI/CD
|
||||
- No need to install multiple PHP versions locally
|
||||
- Handles database setup automatically
|
||||
- Based on official TYPO3 best practices
|
||||
|
||||
#### Complete Test Matrix Example
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Test all supported PHP versions and databases
|
||||
|
||||
PHP_VERSIONS=("8.2" "8.3" "8.4")
|
||||
DATABASES=("sqlite" "mysql" "postgres")
|
||||
|
||||
for PHP in "${PHP_VERSIONS[@]}"; do
|
||||
echo "Testing PHP ${PHP}..."
|
||||
|
||||
# Unit tests
|
||||
./Build/Scripts/runTests.sh -s unit -p "${PHP}"
|
||||
|
||||
# Functional tests with different databases
|
||||
for DB in "${DATABASES[@]}"; do
|
||||
echo " Functional tests with ${DB}..."
|
||||
./Build/Scripts/runTests.sh -s functional -p "${PHP}" -d "${DB}"
|
||||
done
|
||||
|
||||
# Quality tools (run once per PHP version)
|
||||
./Build/Scripts/runTests.sh -s lint -p "${PHP}"
|
||||
./Build/Scripts/runTests.sh -s phpstan -p "${PHP}"
|
||||
done
|
||||
```
|
||||
|
||||
### Alternative Approach: Native PHP Versions (Without Docker)
|
||||
|
||||
For CI/CD environments or when Docker is unavailable, use locally installed PHP versions.
|
||||
|
||||
#### Testing with Native PHP Installations
|
||||
|
||||
```bash
|
||||
# Test with PHP 8.2
|
||||
php8.2 /usr/local/bin/composer update --no-interaction
|
||||
php8.2 .Build/bin/phpunit --configuration=Build/phpunit/UnitTests.xml
|
||||
typo3DatabaseDriver=pdo_sqlite php8.2 .Build/bin/phpunit --configuration=Build/phpunit/FunctionalTests.xml
|
||||
|
||||
# Test with PHP 8.3
|
||||
php8.3 /usr/local/bin/composer update --no-interaction
|
||||
php8.3 .Build/bin/phpunit --configuration=Build/phpunit/UnitTests.xml
|
||||
typo3DatabaseDriver=pdo_sqlite php8.3 .Build/bin/phpunit --configuration=Build/phpunit/FunctionalTests.xml
|
||||
|
||||
# Test with PHP 8.4
|
||||
php8.4 /usr/local/bin/composer update --no-interaction
|
||||
php8.4 .Build/bin/phpunit --configuration=Build/phpunit/UnitTests.xml
|
||||
typo3DatabaseDriver=pdo_sqlite php8.4 .Build/bin/phpunit --configuration=Build/phpunit/FunctionalTests.xml
|
||||
```
|
||||
|
||||
**CRITICAL**: Always run `composer update` with the target PHP version FIRST. This ensures:
|
||||
- Correct PHPUnit version selection (PHPUnit 11 for PHP 8.2, PHPUnit 12 for PHP 8.3+)
|
||||
- Proper dependency resolution for the PHP version
|
||||
- Compatible autoloader generation
|
||||
|
||||
### PHPUnit Version Compatibility
|
||||
|
||||
The `typo3/testing-framework` supports both PHPUnit 11 and 12, allowing Composer to automatically select the compatible version:
|
||||
|
||||
| PHP Version | PHPUnit Version | Auto-Selected by Composer |
|
||||
|-------------|-----------------|---------------------------|
|
||||
| 8.2 | 11.x | ✅ Yes |
|
||||
| 8.3 | 11.x or 12.x | ✅ Yes (12.x preferred) |
|
||||
| 8.4 | 11.x or 12.x | ✅ Yes (12.x preferred) |
|
||||
|
||||
**Example: Automatic PHPUnit Selection**
|
||||
|
||||
```bash
|
||||
# PHP 8.2 automatically gets PHPUnit 11
|
||||
$ php8.2 /usr/local/bin/composer update
|
||||
# Installing typo3/testing-framework (v8.0.14)
|
||||
# Installing phpunit/phpunit (11.5.42)
|
||||
|
||||
# PHP 8.3 automatically gets PHPUnit 12
|
||||
$ php8.3 /usr/local/bin/composer update
|
||||
# Installing typo3/testing-framework (v8.0.14)
|
||||
# Installing phpunit/phpunit (12.4.1)
|
||||
```
|
||||
|
||||
### GitHub Actions CI/CD Integration
|
||||
|
||||
#### Using runTests.sh (Recommended)
|
||||
|
||||
```yaml
|
||||
name: CI
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php: ['8.2', '8.3', '8.4']
|
||||
suite: ['unit', 'functional']
|
||||
database: ['sqlite', 'mysql', 'postgres']
|
||||
exclude:
|
||||
# Only test sqlite for unit tests
|
||||
- suite: unit
|
||||
database: mysql
|
||||
- suite: unit
|
||||
database: postgres
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Run ${{ matrix.suite }} tests on PHP ${{ matrix.php }}
|
||||
run: |
|
||||
Build/Scripts/runTests.sh \
|
||||
-s ${{ matrix.suite }} \
|
||||
-p ${{ matrix.php }} \
|
||||
-d ${{ matrix.database }}
|
||||
```
|
||||
|
||||
#### Using Native PHP (Alternative)
|
||||
|
||||
```yaml
|
||||
name: CI
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php: ['8.2', '8.3', '8.4']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up PHP ${{ matrix.php }}
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
extensions: dom, libxml, sqlite3
|
||||
coverage: none
|
||||
|
||||
- name: Install dependencies
|
||||
run: composer update --no-interaction --no-progress
|
||||
|
||||
- name: Run unit tests
|
||||
run: .Build/bin/phpunit -c Build/phpunit/UnitTests.xml
|
||||
|
||||
- name: Run functional tests
|
||||
env:
|
||||
typo3DatabaseDriver: pdo_sqlite
|
||||
run: .Build/bin/phpunit -c Build/phpunit/FunctionalTests.xml
|
||||
```
|
||||
|
||||
### Common Pitfalls
|
||||
|
||||
#### ❌ Wrong: Testing Without Updating Dependencies
|
||||
|
||||
```bash
|
||||
# This will use wrong PHPUnit version
|
||||
php8.2 .Build/bin/phpunit -c Build/phpunit/UnitTests.xml
|
||||
```
|
||||
|
||||
**Problem:** Uses PHPUnit version from previous `composer update`, may be incompatible.
|
||||
|
||||
#### ✅ Right: Update Dependencies First
|
||||
|
||||
```bash
|
||||
# This ensures correct PHPUnit version
|
||||
php8.2 /usr/local/bin/composer update --no-interaction
|
||||
php8.2 .Build/bin/phpunit -c Build/phpunit/UnitTests.xml
|
||||
```
|
||||
|
||||
#### ❌ Wrong: Removing PHP Version Support Due to Test Failures
|
||||
|
||||
```bash
|
||||
# Don't do this!
|
||||
# composer.json: "php": "^8.3 || ^8.4" # Removed 8.2
|
||||
```
|
||||
|
||||
**Problem:** Unnecessarily reduces compatibility. Fix the testing approach instead.
|
||||
|
||||
#### ✅ Right: Fix Testing Process
|
||||
|
||||
```bash
|
||||
# Run composer update with the problematic PHP version
|
||||
php8.2 /usr/local/bin/composer update
|
||||
# Composer automatically selects compatible dependencies
|
||||
# Now tests work correctly
|
||||
```
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Standard Approach First**: Use `Build/Scripts/runTests.sh` with Docker whenever possible
|
||||
2. **Update Before Testing**: Always run `composer update` with target PHP version first (native approach)
|
||||
3. **Trust Composer**: Let Composer select compatible PHPUnit versions automatically
|
||||
4. **Test All Versions**: Run full test suite on all supported PHP versions in CI
|
||||
5. **SQLite for Speed**: Use SQLite for local functional testing (fastest)
|
||||
6. **Matrix Testing**: Use CI matrix to test all PHP versions in parallel
|
||||
7. **Don't Remove Support**: Fix testing process, don't remove PHP version support
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
#### Docker Issues
|
||||
|
||||
```bash
|
||||
# Update Docker images
|
||||
./Build/Scripts/runTests.sh -u
|
||||
|
||||
# Check Docker is running
|
||||
docker ps
|
||||
|
||||
# Clean up old containers
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
#### Native PHP Issues
|
||||
|
||||
```bash
|
||||
# Verify PHP version
|
||||
php8.2 --version
|
||||
|
||||
# Check installed extensions
|
||||
php8.2 -m | grep -E 'dom|libxml|sqlite'
|
||||
|
||||
# Clean and reinstall dependencies
|
||||
rm -rf .Build vendor composer.lock
|
||||
php8.2 /usr/local/bin/composer install
|
||||
```
|
||||
|
||||
#### PHPUnit Version Conflicts
|
||||
|
||||
```bash
|
||||
# Clear Composer cache
|
||||
php8.2 /usr/local/bin/composer clear-cache
|
||||
|
||||
# Show why PHPUnit version was selected
|
||||
php8.2 /usr/local/bin/composer why phpunit/phpunit
|
||||
|
||||
# Force dependency resolution
|
||||
rm composer.lock
|
||||
php8.2 /usr/local/bin/composer update --with-all-dependencies
|
||||
```
|
||||
|
||||
### Summary
|
||||
|
||||
| Aspect | Docker/runTests.sh | Native PHP |
|
||||
|--------|-------------------|------------|
|
||||
| **Use Case** | Standard TYPO3 development | CI/CD, no Docker available |
|
||||
| **Isolation** | ✅ Full container isolation | ⚠️ System-wide PHP |
|
||||
| **Setup** | Docker required | Multiple PHP versions required |
|
||||
| **Speed** | Slower (container overhead) | Faster (native execution) |
|
||||
| **Consistency** | ✅ Guaranteed environment | ⚠️ Depends on system config |
|
||||
| **Recommendation** | **Recommended** | Alternative when needed |
|
||||
|
||||
**Choose Docker/runTests.sh for:**
|
||||
- Local development and testing
|
||||
- Consistent environment across team
|
||||
- Official TYPO3 best practices
|
||||
|
||||
**Choose Native PHP for:**
|
||||
- GitHub Actions/GitLab CI environments
|
||||
- Systems without Docker
|
||||
- Performance-critical testing pipelines
|
||||
Reference in New Issue
Block a user