Steuerkram/tests/run.php

90 lines
2.8 KiB
PHP

#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Steuerkram Test-Runner
*
* Führt alle Tests im tests/-Verzeichnis aus und gibt eine Zusammenfassung aus.
* Exit-Code: 0 = alle Tests bestanden, 1 = mindestens ein Fehler.
*
* Verwendung:
* php tests/run.php
* php tests/run.php --json # Ausgabe als JSON (für Skript-Auswertung)
*/
$projectRoot = dirname(__DIR__);
$autoload = $projectRoot . '/vendor/autoload.php';
if (!file_exists($autoload)) {
fwrite(STDERR, "Fehler: vendor/autoload.php nicht gefunden. Bitte 'composer install' ausführen.\n");
exit(1);
}
require $autoload;
require __DIR__ . '/TestCase.php';
\Steuerkram\Config::load();
$jsonMode = in_array('--json', $argv ?? [], true);
// Alle Test-Dateien laden
$testFiles = glob(__DIR__ . '/[0-9][0-9]_*.php');
sort($testFiles);
$testClasses = [];
foreach ($testFiles as $file) {
require_once $file;
// Klassenname aus Dateiname ableiten: 01_BelegUploadTest.php → BelegUploadTest
$base = basename($file, '.php');
$className = preg_replace('/^\d+_/', '', $base);
if (class_exists($className)) {
$testClasses[] = $className;
}
}
if (empty($testClasses)) {
fwrite(STDERR, "Keine Testklassen gefunden.\n");
exit(1);
}
if (!$jsonMode) {
echo "\n\e[1m╔══════════════════════════════════════════╗\e[0m\n";
echo "\e[1m║ Steuerkram Test-Suite ║\e[0m\n";
echo "\e[1m╚══════════════════════════════════════════╝\e[0m\n";
}
$allFailures = [];
foreach ($testClasses as $class) {
/** @var TestCase $test */
$test = new $class();
$failures = $test->execute();
$allFailures = array_merge($allFailures, $failures);
}
$summary = TestCase::globalSummary();
if (!$jsonMode) {
$total = $summary['passed'] + $summary['failed'];
echo "\n\e[1m══════════════════════════════════════════\e[0m\n";
if ($summary['failed'] === 0) {
echo "\e[32;1m✓ Alle {$summary['passed']} Tests bestanden.\e[0m\n";
} else {
echo "\e[31;1m✗ {$summary['failed']} von {$total} Tests fehlgeschlagen:\e[0m\n";
foreach ($summary['failures'] as $failure) {
echo " • {$failure}\n";
}
}
echo "\e[1m══════════════════════════════════════════\e[0m\n\n";
} else {
echo json_encode([
'passed' => $summary['passed'],
'failed' => $summary['failed'],
'failures' => $summary['failures'],
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "\n";
}
exit($summary['failed'] > 0 ? 1 : 0);