🦉 CrumbForest Tests
Tests für das CrumbForest Scanner-System - einfach, übersichtlich, und "naked" wie das Projekt selbst!
🧪 Test-Philosophie
Passend zur "naked" Projekt-Philosophie:
- ✅ Keine komplexen Mocking-Frameworks
- ✅ Klare Trennung: Unit vs Integration
- ✅ Einfache Patterns, leicht verständlich
- ✅ Separate Test-Datenbank
- ✅ Schnelle Unit-Tests, gründliche Integration-Tests
📂 Struktur
tests/
├── Unit/ # Schnelle, isolierte Tests
│ ├── ConfigTest.php # .env-Parsing, Config-Validierung
│ └── AuthTest.php # JWT-Token-Logik (ohne DB)
│
├── Integration/ # Tests mit echter Datenbank
│ └── ApiAuthTest.php # Kompletter Login-Flow
│
└── Fixtures/ # Test-Daten (future)
🚀 Erste Schritte
1. Test-Datenbank erstellen
mysql -u root -p
CREATE DATABASE crumbforest_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON crumbforest_test.* TO 'crumbforest_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
2. Dependencies installieren
composer install
3. Tests ausführen
# Alle Tests
./vendor/bin/phpunit
# Nur Unit-Tests (schnell, keine DB)
./vendor/bin/phpunit --testsuite Unit
# Nur Integration-Tests
./vendor/bin/phpunit --testsuite Integration
📋 Vorhandene Tests
Unit Tests
ConfigTest.php (14 Tests)
- ✅ Config kann geladen werden
- ✅ Database-Konfiguration vorhanden
- ✅ getValue() mit/ohne Default
- ✅ JWT, Upload, AI-Konfiguration
- ✅ Manufacturers & Device Types Listen
- ✅ Timezone wird korrekt gesetzt
AuthTest.php (8 Tests)
- ✅ JWT-Token kann dekodiert werden
- ✅ Abgelaufene Tokens werden erkannt
- ✅ Falsche Secrets werden abgelehnt
- ✅ Token enthält erwartete Felder
- ✅ JWT-Secret ist nicht Default
- ✅ JWT-Expiry ist sinnvoll
Integration Tests
ApiAuthTest.php (9 Tests)
- ✅ Erfolgreicher Login mit korrekten Credentials
- ✅ Login fehlschlägt bei falschen Credentials
- ✅ Login fehlschlägt bei nicht-existentem User
- ✅ Token kann validiert werden
- ✅ Admin-User hat Admin-Rechte
- ✅ Normaler User hat keine Admin-Rechte
- ✅ Ungültige Tokens werden abgelehnt
- ✅ Fehlender Authorization Header
- ✅ Last Login wird aktualisiert
✍️ Neue Tests schreiben
Unit Test Template
<?php
namespace CrumbForest\Tests\Unit;
use PHPUnit\Framework\TestCase;
class MyNewTest extends TestCase
{
protected function setUp(): void
{
// Setup vor jedem Test
}
public function testSomething(): void
{
// Arrange - Test vorbereiten
$input = 'test';
// Act - Funktion aufrufen
$result = myFunction($input);
// Assert - Ergebnis prüfen
$this->assertEquals('expected', $result);
}
}
Integration Test Template
<?php
namespace CrumbForest\Tests\Integration;
use CrumbForest\Database\Database;
use PHPUnit\Framework\TestCase;
class MyApiTest extends TestCase
{
private Database $db;
protected function setUp(): void
{
$this->db = new Database();
// Test-Daten vorbereiten
}
public function testDatabaseOperation(): void
{
// Test mit echter Datenbank
}
}
🔧 Nützliche Commands
# Einzelnen Test ausführen
./vendor/bin/phpunit tests/Unit/ConfigTest.php
# Mit Verbose-Output
./vendor/bin/phpunit --verbose
# Mit Code Coverage (benötigt Xdebug)
./vendor/bin/phpunit --coverage-html coverage/
# Test-Filter (nur Tests mit "Login" im Namen)
./vendor/bin/phpunit --filter Login
# Stop on Failure
./vendor/bin/phpunit --stop-on-failure
📊 Code Coverage
Wenn Xdebug installiert ist:
./vendor/bin/phpunit --coverage-html coverage/
Dann öffnen: coverage/index.html
🐛 Troubleshooting
"Database connection failed"
# Test-Datenbank prüfen
mysql -u crumbforest_user -p crumbforest_test -e "SELECT 1;"
# Credentials in phpunit.xml prüfen
cat phpunit.xml | grep DB_
"Class not found"
# Autoloader neu generieren
composer dump-autoload -o
"No tests executed"
# PHPUnit-Version prüfen
./vendor/bin/phpunit --version
# Test-Pfade prüfen
./vendor/bin/phpunit --list-tests
📝 Best Practices
- Unit Tests zuerst: Schnell, isoliert, keine externen Dependencies
- Test-DB nutzen: NIE gegen Production-Datenbank testen!
- Arrange-Act-Assert: Klare Struktur in jedem Test
- Sprechende Namen:
testUserCanLoginWithValidCredentials() - Ein Konzept pro Test: Nicht zu viel auf einmal testen
- Setup/Teardown nutzen: Gemeinsamen Code wiederverwenden
🎯 Nächste Schritte
Potenzielle Test-Erweiterungen:
- [ ]
DatabaseTest.php- PDO-Wrapper testen - [ ]
ScannerServiceTest.php- Business Logic - [ ]
NetboxClientTest.php- API-Integration (mit Mock) - [ ]
ApiScansTest.php- CRUD für Scans - [ ] Frontend-Tests (optional, mit Playwright/Cypress)
🤝 Contributing
Neue Tests hinzufügen:
1. Passende Test-Suite wählen (Unit vs Integration)
2. Template kopieren
3. Test schreiben (Arrange → Act → Assert)
4. Ausführen: ./vendor/bin/phpunit
5. In git committen
Merksatz: Tests sind wie die Eulen im Wald - sie passen auf, dass nichts schiefgeht! 🦉