9.3 KiB
Test-Suite Dokumentation
Übersicht
Diese Test-Suite bietet umfassende Tests für die Todo-App Backend Applikation. Sie besteht aus Unit Tests, Feature Tests und Database Tests.
Test-Struktur
tests/
├── unit/
│ ├── Controllers/
│ │ └── AuthControllerTest.php # Auth Controller Tests
│ ├── Models/
│ │ └── UserModelTest.php # User Model Tests
│ └── HealthTest.php # Basis-Health Checks
├── feature/
│ └── AuthApiTest.php # API Integration Tests
├── database/
│ ├── MigrationTest.php # Database Migration Tests
│ └── ExampleDatabaseTest.php # Example Tests
├── _support/ # Test Support Files
│ ├── Database/
│ ├── Libraries/
│ └── Models/
└── session/ # Session Tests
Tests ausführen
Alle Tests ausführen
cd /Users/yanis/BFOTodo/Todo-App-Backend
php vendor/bin/phpunit
Nur Auth Controller Tests
php vendor/bin/phpunit tests/unit/Controllers/AuthControllerTest.php
Nur User Model Tests
php vendor/bin/phpunit tests/unit/Models/UserModelTest.php
Nur API Tests
php vendor/bin/phpunit tests/feature/AuthApiTest.php
Nur Database Migration Tests
php vendor/bin/phpunit tests/database/MigrationTest.php
Mit Coverage Report
php vendor/bin/phpunit --coverage-html build/logs/coverage
Test-Kategorien
1. Unit Tests - Auth Controller (tests/unit/Controllers/AuthControllerTest.php)
Testet die Core-Logik des Auth Controllers:
Tests:
- ✅
testLoginPageLoads- Login Seite wird angezeigt - ✅
testLoginWithValidCredentials- Login mit korrekten Daten - ✅
testLoginWithInvalidCredentials- Login mit falschen Daten - ✅
testRegisterWithValidData- Registrierung mit gültigen Daten - ✅
testRegisterWithDuplicateEmail- Doppelte Email wird verhindert - ✅
testLogout- Logout Funktionalität - ✅
testPasswordIsHashed- Passwort wird gehasht - ✅
testLoginRequiresEmail- Email ist erforderlich - ✅
testRegisterRequiresEmail- Email bei Registrierung erforderlich - ✅
testLoginWithInvalidEmail- Ungültiges Email Format
Beispiel Ausführung:
php vendor/bin/phpunit tests/unit/Controllers/AuthControllerTest.php::AuthControllerTest::testLoginWithValidCredentials
2. Unit Tests - User Model (tests/unit/Models/UserModelTest.php)
Testet die Benutzermodell-Operationen:
Tests:
- ✅
testUserCanBeCreated- Benutzer erstellen - ✅
testUserCanBeFoundByEmail- Benutzer nach Email finden - ✅
testDuplicateEmailIsRejected- Doppelte Email ablehnen - ✅
testUserCanBeUpdated- Benutzer aktualisieren - ✅
testUserCanBeDeleted- Benutzer löschen - ✅
testAllUsersCanBeRetrieved- Alle Benutzer abrufen - ✅
testPasswordHashIsValid- Passwort Hash Validierung
Beispiel Ausführung:
php vendor/bin/phpunit tests/unit/Models/UserModelTest.php
3. Feature Tests - Auth API (tests/feature/AuthApiTest.php)
Testet API Endpoints und HTTP Responses:
Tests:
- ✅
testGetLoginPageReturns200- Login Seite Status Code - ✅
testLoginWithValidDataReturns302- Login Redirect - ✅
testRegisterApiCreatesNewUser- Registrierung erstellt Benutzer - ✅
testLoginWithInvalidDataReturns302- Fehlerhafte Login Redirect - ✅
testLogoutApiReturns302- Logout Redirect - ✅
testLoginWithMissingEmailField- Fehlende Email Feld - ✅
testLoginWithMissingPasswordField- Fehlende Password Feld - ✅
testRegisterWithMissingNameField- Fehlende Name Feld - ✅
testLoginPageContentType- Content-Type Header - ✅
testRegisterValidatesEmailFormat- Email Format Validierung - ✅
testLoginPageIncludesSecurityHeaders- Sicherheits-Header - ✅
testRegisterSetsUserIdInSession- Session User ID - ✅
testMultipleLoginAttempts- Mehrfache Login Versuche
Beispiel Ausführung:
php vendor/bin/phpunit tests/feature/AuthApiTest.php::AuthApiTest::testLoginWithValidDataReturns302
4. Database Tests - Migrations (tests/database/MigrationTest.php)
Testet Datenbankmigrationen und Schema:
Tests:
- ✅
testUsersTableExists- Users Tabelle existiert - ✅
testUsersTableHasRequiredColumns- Erforderliche Spalten vorhanden - ✅
testEmailIsUnique- Email Unique Constraint - ✅
testCategoriesTableExists- Categories Tabelle - ✅
testProjectsTableExists- Projects Tabelle - ✅
testTodosTableExists- Todos Tabelle - ✅
testTodoCategoriesTableExists- TodoCategories Tabelle - ✅
testTodosTableHasRequiredColumns- Todos Spalten - ✅
testDatabaseConnectionWorks- DB Verbindung - ✅
testTableCountIsCorrect- Tabellenzahl - ✅
testUserSettingsIsJson- Settings JSON Type - ✅
testTimestampsAreCorrectType- Timestamp Spalten
Beispiel Ausführung:
php vendor/bin/phpunit tests/database/MigrationTest.php
Test-Konventionen
Naming Konvention
- Test-Klassen:
{Feature}Test.php(z.B.AuthControllerTest.php) - Test-Methoden:
test{Scenario}(z.B.testLoginWithValidCredentials) - Namespace:
Tests\{Category}\{Feature}(z.B.Tests\Unit\Controllers)
Struktur
/**
* Test: Beschreibung was getestet wird
*/
public function testFeatureName(): void
{
// Arrange - Setup Daten
$userData = ['email' => 'test@example.com', ...];
// Act - Aktion ausführen
$response = $this->post('/auth/login', $userData);
// Assert - Ergebnis verifizieren
$this->assertTrue($response->getStatusCode() === 302);
}
Test-Traits
DatabaseTestTrait
Ermöglicht Datenbankzugriff in Tests:
use DatabaseTestTrait;
protected $seed = UserSeeder::class; // Optional: Daten seeden
FeatureTestTrait
Ermöglicht HTTP Requests in Tests:
use FeatureTestTrait;
$response = $this->get('/path');
$response = $this->post('/path', $data);
$response = $this->put('/path', $data);
$response = $this->delete('/path');
Datenbank in Tests
Automatisches Rollback
Tests verwenden automatisch Transaktionen, die nach jedem Test gerollt werden:
class AuthControllerTest extends CIUnitTestCase
{
use DatabaseTestTrait;
// Daten werden automatisch nach jedem Test gelöscht
}
Daten Seeding
class MigrationTest extends CIUnitTestCase
{
use DatabaseTestTrait;
protected $seed = UserSeeder::class; // Lädt vor jedem Test
}
Assertions häufig verwendet
// Grundlegende Assertions
$this->assertTrue($condition);
$this->assertFalse($condition);
$this->assertNull($value);
$this->assertNotNull($value);
// Vergleiche
$this->assertEquals($expected, $actual);
$this->assertNotEquals($expected, $actual);
// Collections
$this->assertCount($count, $array);
$this->assertContains($needle, $haystack);
// Strings
$this->assertStringContainsString($needle, $haystack);
$this->assertStringStartsWith($prefix, $string);
// Response
$this->assertTrue($response->getStatusCode() === 200);
Fehlerbehandlung in Tests
Datenbank Fehler
try {
// Operation die Fehler verursachen könnte
$this->post('/auth/attemptRegister', $data);
} catch (\Exception $e) {
$this->assertTrue(true); // Expected Error
}
HTTP Status Codes
$this->assertTrue($response->getStatusCode() === 302); // Redirect
$this->assertTrue($response->getStatusCode() === 200); // OK
$this->assertTrue($response->getStatusCode() === 400); // Bad Request
$this->assertTrue($response->getStatusCode() === 404); // Not Found
$this->assertTrue($response->getStatusCode() === 500); // Server Error
Best Practices
✅ Do's
- ✅ Tests sollten unabhängig voneinander sein
- ✅ Verwende aussagekräftige Test-Namen
- ✅ Ein Test pro Scenario/Feature
- ✅ Verwende Arrange-Act-Assert Pattern
- ✅ Test Edge Cases und Error Conditions
- ✅ Verwende Fixtures/Seeders für Testdaten
❌ Dont's
- ❌ Tests sollten nicht voneinander abhängig sein
- ❌ Keine Tests mit zufälligen Daten
- ❌ Keine Long-Running Tests (< 1 Sekunde pro Test)
- ❌ Keine Tests die externe APIs aufrufen
- ❌ Keine Tests die Datei-Operationen durchführen
Continuous Integration
Tests können in CI/CD Pipelines integriert werden:
# .github/workflows/tests.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Tests
run: php vendor/bin/phpunit
Performance
Aktuelle Test-Zusammenfassung:
- Gesamt Tests: ~40 Tests
- Durchschnittliche Dauer: < 5 Sekunden
- Coverage Ziel: > 80%
Troubleshooting
Tests schlagen fehl mit "Database not found"
# Stelle sicher dass .env konfiguriert ist
cp env.example .env
# Führe Migrationen aus
php spark migrate
CSRF Token Fehler
Tests werden automatisch mit CSRF Protection gehändelt durch FeatureTestTrait
Session wird nicht persistent
Sessions werden zwischen Requests in Feature Tests automatisch beibehalten
Zukünftige Verbesserungen
- API Response Body Assertions
- Performance Benchmarks
- Integration Tests für komplexe Workflows
- E2E Tests mit Selenium
- Load Tests
- Security Tests
Für weitere Fragen oder Probleme: Dokumentation: CodeIgniter Testing Guide