TestRunCommand - Intelligenter Test-Runner mit automatischem Setup
Übersicht
Der TestRunCommand ist ein neuer Artisan-Command, der Test-Ausführung und Datenbank-Setup intelligent kombiniert. Er prüft automatisch, ob die Test-Datenbank bereit ist und führt nur bei Bedarf ein Setup durch.
Hauptfeatures:
- Smart-Check-Logik: Setup nur wenn wirklich nötig
- Automatische Datenbank-Validierung
- Integration mit allen Pest-Test-Optionen
- Parallele Test-Ausführung
- Detaillierte Status-Ausgaben
Verwendung
Basis-Syntax
php artisan test:run [options]Verfügbare Optionen
| Option | Beschreibung |
|---|---|
--fresh | Datenbank immer neu aufbauen (keine Smart-Checks) |
--parallel | Tests parallel ausführen |
--filter=NAME | Nur Tests ausführen die dem Filter entsprechen |
--testsuite=NAME | Nur bestimmte Testsuite ausführen (Unit, Feature, Modules) |
--coverage | Code Coverage Report generieren |
--stop-on-failure | Bei erstem Fehler abbrechen |
--connection=NAME | Datenbank-Connection (Default: testing_local) |
Beispiele
# Standard: Smart-Check + parallele Tests
php artisan test:run --parallel
# Immer frisches Setup erzwingen
php artisan test:run --fresh --parallel
# Nur Unit-Tests
php artisan test:run --testsuite=Unit
# Nur spezifische Tests
php artisan test:run --filter="UebungBedeutungenZuordnen" --parallel
# Mit Coverage-Report
php artisan test:run --coverage
# Debugging: Bei erstem Fehler stoppen
php artisan test:run --stop-on-failure --no-parallelSmart-Check-Logik
Der Command führt vier intelligente Checks durch, bevor er entscheidet ob ein Setup nötig ist:
1. Datenbank existiert?
private function databaseExists(): boolPrüft:
- Verbindung zur MySQL-Instanz
- Existenz der konfigurierten Test-Datenbank
Ergebnis bei Fehler:
Setup erforderlich: Datenbank existiert nicht2. Schema aktuell?
private function schemaIsUpToDate(): boolPrüft:
migrationsTabelle existiert- Keine ausstehenden Migrationen (Vergleich Dateien vs. DB)
Ergebnis bei Fehler:
Setup erforderlich: Schema nicht aktuell (ausstehende Migrationen)3. Base-Data vorhanden?
private function baseDataExists(): boolPrüft (Stichprobe):
- Mindestens 100 Einträge in
glossarium_verben - Mindestens 20 Einträge in
reihen
Ergebnis bei Fehler:
Setup erforderlich: Base-Data fehlt4. Test-Accounts existieren?
private function testAccountsExist(): boolPrüft:
- Alle 5 Test-User existieren in
usersTabelle:- bruce.wayne (admin)
- harvey.dent (editor)
- james.gordon (tester)
- selina.kyle (teacher)
- joker (user)
Ergebnis bei Fehler:
Setup erforderlich: Test-Accounts fehlenErfolgreiche Validierung
Wenn alle Checks erfolgreich sind:
Datenbank ist bereit (Setup nicht erforderlich).Workflow-Ablauf
1. Initialisierung
=== Hermeneus Test Runner ===
Pruefe Datenbank-Status...2. Smart-Check oder Fresh-Mode
Mit --fresh Flag:
--fresh Flag gesetzt: Datenbank wird neu aufgebaut.
Setup erforderlich: Fresh-FlagOhne --fresh (Smart-Check):
- Führt alle 4 Checks durch
- Gibt konkreten Grund aus wenn Setup nötig
3. Setup (falls erforderlich)
Setup erforderlich: [Grund]
[Output von test:setup Command]
Setup abgeschlossen.Intern ruft der Command auf:
$this->call('test:setup', [
'--fresh' => true,
'--connection' => $this->connection,
]);4. Test-Ausführung
=== Starte Tests ===
[Pest Test Output]Intern ruft der Command auf:
$this->call('test', $arguments);5. Zusammenfassung
Gesamtdauer: 2 minutesIntegration mit NPM Scripts
Die NPM-Scripts in package.json nutzen den TestRunCommand:
{
"scripts": {
"test": "php artisan test:run --parallel",
"test:fresh": "php artisan test:run --parallel --fresh",
"test:setup": "php artisan test:setup --fresh",
"test:unit": "php artisan test:run --testsuite=Unit",
"test:feature": "php artisan test:run --testsuite=Feature",
"test:modules": "php artisan test:run --testsuite=Modules --parallel",
"test:filter": "php artisan test:run --parallel --filter",
"test:no-parallel": "php artisan test:run"
}
}Verwendung:
# Entwickler-freundlich: Einfach npm run test
npm run test
# Automatisches Setup wenn nötig
npm run test:fresh
# Spezifische Suite
npm run test:unitVorteile gegenüber direktem php artisan test
| Feature | php artisan test | php artisan test:run |
|---|---|---|
| Automatisches Setup | Nein | Ja (Smart-Check) |
| Datenbank-Validierung | Nein | Ja (4 Checks) |
| Setup nur wenn nötig | N/A | Ja |
| Frisches Setup erzwingen | Nein | Ja (--fresh) |
| Test-Optionen | Ja | Ja (durchgereicht) |
| Zeiterfassung | Nein | Ja (Gesamtdauer) |
| Fehler-Handling | Basic | Erweitert |
Technische Details
Klasse und Namespace
namespace App\Console\Commands;
class TestRunCommand extends Command
{
use DatabaseSetupActions;
}Trait: DatabaseSetupActions wird von TestSetupCommand geteilt und bietet:
switchToConnection(string $connection)- Gemeinsame Datenbank-Helper-Methoden
Signature
protected $signature = 'test:run
{--fresh : Datenbank immer neu aufbauen (keine Smart-Checks)}
{--parallel : Tests parallel ausfuehren}
{--filter= : Nur Tests ausfuehren die dem Filter entsprechen}
{--testsuite= : Nur bestimmte Testsuite ausfuehren}
{--coverage : Code Coverage Report generieren}
{--stop-on-failure : Bei erstem Fehler abbrechen}
{--connection=testing_local : Datenbank-Connection}';Hauptmethode
public function handle(): int
{
// 1. Initialisierung
$startTime = now();
$this->connection = $this->option('connection');
$this->dbConfig = config("database.connections.{$this->connection}");
// 2. Setup-Status prüfen
if ($this->option('fresh')) {
$setupRequired = true;
$reason = 'Fresh-Flag';
} else {
[$setupRequired, $reason] = $this->checkSetupRequired();
}
// 3. Setup ausführen wenn nötig
if ($setupRequired) {
$setupResult = $this->runSetup();
if ($setupResult !== Command::SUCCESS) {
return Command::FAILURE;
}
}
// 4. Tests ausführen
$testResult = $this->runTests();
// 5. Zusammenfassung
$duration = $startTime->diffForHumans(now(), true);
$this->line("Gesamtdauer: {$duration}");
return $testResult;
}Fehlerbehandlung
Datenbank-Verbindung fehlgeschlagen
catch (PDOException $e) {
$this->warn(" DB-Verbindung fehlgeschlagen: " . $e->getMessage());
return false;
}Folge: Setup wird durchgeführt
Setup fehlgeschlagen
if ($setupResult !== Command::SUCCESS) {
$this->error('Setup fehlgeschlagen! Tests werden nicht ausgefuehrt.');
return Command::FAILURE;
}Folge: Tests werden NICHT ausgeführt, Exit Code 1
Tests fehlgeschlagen
$testResult = $this->runTests();
return $testResult; // Exit Code von `php artisan test`Folge: Exit Code wird durchgereicht (z.B. 1 bei Fehlern)
Best Practices
Entwicklungs-Workflow
Erstmaliges Setup:
bashnpm run test:setupReguläre Entwicklung:
bashnpm run testSmart-Check stellt sicher, dass Setup nur läuft wenn nötig
Nach Schema-Änderungen:
bashnpm run test:freshErzwingt Neuerstellung der Datenbank
Debugging einzelner Tests:
bashnpm run test:filter -- "Test-Name" # oder php artisan test:run --filter="Test-Name" --stop-on-failure
CI/CD Integration
Für CI-Pipelines empfiehlt sich immer --fresh:
# .github/workflows/tests.yml
- name: Run Tests
run: npm run test:freshGrund: Garantiert sauberen Zustand, vermeidet Cache-Probleme
Lokale Performance-Optimierung
Für schnelle Test-Iterationen ohne Setup:
# Einmal Setup
npm run test:setup
# Danach: Nur Tests ohne Setup
php artisan test --parallelNur verwenden wenn:
- Keine Schema-Änderungen
- Keine Base-Data-Änderungen
- Sichere Datenbank-Konsistenz
Verwandte Commands
| Command | Zweck |
|---|---|
test:setup | Nur Setup ohne Tests |
test:run | Setup (smart) + Tests |
test | Nur Tests (kein Setup) |
Troubleshooting
"DB-Verbindung fehlgeschlagen"
Ursache: MySQL-Server läuft nicht oder Credentials falsch
Lösung:
- MySQL-Server starten
.envprüfen:DB_TEST_*Variablen- Connection in
config/database.phpprüfen
"Setup fehlgeschlagen! Tests werden nicht ausgeführt."
Ursache: test:setup Command hat einen Fehler zurückgegeben
Lösung:
- Setup manuell ausführen:
php artisan test:setup --fresh - Log-Output analysieren
- Migrationen prüfen
- Base-Data SQL-Dateien prüfen
Tests laufen, obwohl Datenbank veraltet ist
Ursache: Smart-Checks greifen nicht (z.B. nur 1 Migration fehlt)
Lösung:
npm run test:freshSetup läuft bei jedem Test-Lauf
Ursache: Einer der 4 Checks schlägt immer fehl
Debugging:
Command mit Ausgabe prüfen:
bashphp artisan test:run # Zeigt: "Setup erforderlich: [Grund]"Konkreten Check debuggen:
php// In TestRunCommand.php dd($this->databaseExists()); dd($this->schemaIsUpToDate()); dd($this->baseDataExists()); dd($this->testAccountsExist());
Weiterführende Dokumentation
- Testing Leitlinien - Allgemeine Testing-Philosophie
- Pest-Konfiguration - Helper-Funktionen und Expectations
- Test-Datenbank Setup - Base-Data Import-Prozess