„Die Hälfte des Codes hat keine Tests und niemand weiß mehr, was er eigentlich macht.“ Kennt ihr das? Nach über 15 Jahren Erfahrung in Softwarequalität und Remote Consulting haben wir bei Never Code Alone eine klare Antwort: Characterisation Testing, auch bekannt als Golden Master Testing, ist euer Rettungsanker für Legacy-Code. Heute zeigen wir euch, wie ihr mit dieser Technik selbst den wildesten Code-Dschungel unter Kontrolle bekommt.
Warum Characterisation Testing und Golden Master Testing euer Team voranbringt
Characterisation Testing und Golden Master Testing sind zwei Namen für dieselbe geniale Technik. Michael Feathers prägte den Begriff Characterisation Testing, während die Testing-Community auch Golden Master Testing nutzt. Beide Begriffe beschreiben eure praktische Lösung für:
- Sofortige Test-Abdeckung für komplexe Legacy-Systeme
- Sicheres Refactoring ohne Angst vor versteckten Bugs
- Dokumentation des IST-Zustands eures Codes
- Schnelle Absicherung vor kritischen Änderungen
- Team-Confidence bei der Arbeit mit unbekanntem Code
Das Team von Never Code Alone nutzt Characterisation Testing regelmäßig in Consulting-Projekten, wenn klassische Unit-Tests zu aufwendig oder schlicht unmöglich sind. Der Clou: Golden Master Testing dokumentiert das aktuelle Verhalten eures Systems und macht es testbar – ohne es erst verstehen zu müssen.
Die 10 häufigsten Fragen zu Characterisation Testing und Golden Master Testing – direkt beantwortet
1. Was genau ist Characterisation Testing bzw. Golden Master Testing und wann brauche ich es?
Characterisation Testing erfasst den aktuellen Output eures Codes und vergleicht ihn bei zukünftigen Änderungen. Golden Master Testing macht genau dasselbe – die Namen sind austauschbar. Der entscheidende Unterschied zu Unit Tests:
// Unit Test: Prüft ob das Verhalten KORREKT ist
$this->assertEquals(42, $calculator->calculate('20+22'));
// Characterisation Test / Golden Master Test: Prüft ob das Verhalten UNVERÄNDERT ist
$output = $legacySystem->process($input);
$this->assertEquals(file_get_contents('golden-master.txt'), $output);
Praxis-Tipp: Nutzt Characterisation Testing wenn ihr Legacy-Code habt, der funktioniert aber niemand weiß warum. Golden Master Testing ist perfekt für Refactoring-Projekte!
2. Wie implementiere ich Characterisation Tests und Golden Master Tests in PHPUnit?
Die Implementation von Characterisation Testing ist erstaunlich straightforward:
class LegacySystemCharacterisationTest extends PHPUnitFrameworkTestCase
{
public function testLegacyOutputRemainsSame(): void
{
$input = file_get_contents(__DIR__ . '/fixtures/input.json');
$system = new LegacySystem();
$actualOutput = $system->process($input);
// Beim ersten Durchlauf: Golden Master erstellen
if (!file_exists(__DIR__ . '/golden-master/output.txt')) {
file_put_contents(
__DIR__ . '/golden-master/output.txt',
$actualOutput
);
$this->markTestSkipped('Golden Master created for characterisation test');
}
$expectedOutput = file_get_contents(__DIR__ . '/golden-master/output.txt');
$this->assertEquals($expectedOutput, $actualOutput);
}
}
Team-Workflow: Commitet die Golden Master Files ins Repository – sie charakterisieren euer erwartetes Verhalten.
3. Wie gehe ich bei Characterisation Testing mit nicht-deterministischen Outputs um?
Timestamps, Zufallszahlen und IDs sind die natürlichen Feinde von Golden Master Testing und Characterisation Testing. Unsere bewährte Lösung:
class CharacterisationOutputNormalizer
{
public static function normalize(string $output): string
{
// Timestamps für Characterisation Tests entfernen
$output = preg_replace(
'/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/',
'TIMESTAMP',
$output
);
// UUIDs für Golden Master normalisieren
$output = preg_replace(
'/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/',
'UUID',
$output
);
return $output;
}
}
// Im Characterisation Test verwenden
$actualOutput = CharacterisationOutputNormalizer::normalize($system->process($input));
$expectedOutput = CharacterisationOutputNormalizer::normalize(
file_get_contents(__DIR__ . '/golden-master/output.txt')
);
Consulting-Erfahrung: Erstellt eine zentrale Normalizer-Klasse für eure Characterisation Tests – spart Zeit bei Golden Master Testing.
4. Welche PHPUnit-Tools und Libraries unterstützen Characterisation Testing und Golden Master Testing?
Die PHP-Community bietet mehrere Ansätze für Characterisation Testing:
Native PHPUnit-Lösung für Golden Master Testing:
// PHPUnit Snapshots für Characterisation Tests
$this->assertJsonStringEqualsJsonFile(
__DIR__ . '/snapshots/golden-master.json',
json_encode($response)
);
Approval Tests PHP für Characterisation Testing:
composer require --dev approvals/approval-tests
use ApprovalTestsApprovals;
class CharacterisationTest extends PHPUnitFrameworkTestCase
{
public function testComplexOutputCharacterisation(): void
{
$result = $this->legacySystem->generateReport();
Approvals::verifyString($result); // Golden Master Verification
}
}
Snapshot Testing für Golden Master Approach:
composer require --dev spatie/phpunit-snapshot-assertions
Unser Praxis-Tipp: Startet Characterisation Testing mit nativen PHPUnit-Features. Wenn ihr mehr Komfort für Golden Master Testing braucht, steigt auf spezialisierte Libraries um.
5. Wie unterscheidet sich Characterisation Testing von klassischen Unit Tests?
Der fundamentale Unterschied zwischen Golden Master Testing und Unit Tests liegt im Ziel:
Aspekt | Unit Test | Characterisation Test / Golden Master Test |
---|---|---|
Ziel | Verifiziert korrektes Verhalten | Charakterisiert und detektiert Verhaltensänderungen |
Wissen | Erfordert Verständnis der Business-Logik | Funktioniert ohne Domain-Knowledge |
Granularität | Testet einzelne Units | Kann ganze Systeme charakterisieren |
Wartung | Ändert sich mit Requirements | Ändert sich bei jedem gewollten Output |
Refactoring | Bleibt stabil | Perfekt für Refactoring mit Golden Master |
Entscheider-Perspektive: Characterisation Tests sind eure Versicherung beim Refactoring – Golden Master Testing kostet wenig und schützt vor teuren Fehlern.
6. Wann sollte ich Characterisation Tests und Golden Master Tests wieder loswerden?
Characterisation Testing und Golden Master Testing sind Übergangs-Helden, keine Dauer-Lösung:
// Phase 1: Characterisation Test etablieren
class LegacyCharacterisationTest extends TestCase {
// Golden Master Approach
}
// Phase 2: Parallel zu Characterisation Tests Unit Tests aufbauen
class LegacyUnitTest extends TestCase
{
public function testSpecificBusinessRule(): void
{
// Gezielter Test ersetzt Characterisation Test
}
}
// Phase 3: Golden Master und Characterisation Tests schrittweise ersetzen
// Wenn Unit Test Coverage > 80% → Characterisation Tests löschen
Best Practice Timeline für Golden Master Testing:
- Woche 1-2: Characterisation Tests erstellen
- Woche 3-8: Code verstehen parallel zum Golden Master
- Woche 9+: Characterisation Tests durch spezifische Tests ersetzen
7. Wie manage ich Golden Master Files und Characterisation Test Outputs im Team?
Versionskontrolle ist kritisch für erfolgreiches Characterisation Testing:
# .gitignore für Golden Master Testing anpassen
!/tests/characterisation-tests/golden-master/
/tests/characterisation-tests/*.tmp
# Golden Master Update-Workflow für Characterisation Tests
php artisan test:update-characterisation-golden-master
git add tests/characterisation-tests/golden-master/
git commit -m "Update golden master for characterisation tests after feature X"
CI/CD Integration für Characterisation Testing:
# .github/workflows/tests.yml
- name: Run Characterisation and Golden Master Tests
run: |
vendor/bin/phpunit --group characterisation-testing,golden-master
if [ $? -ne 0 ]; then
echo "::warning::Characterisation test golden master mismatch detected"
diff -u tests/golden-master/expected/ tests/golden-master/actual/
fi
Team-Regel: Golden Master Updates in Characterisation Tests erfordern Code Review – verhindert versehentliche Bug-Akzeptanz.
8. Wie teste ich APIs und externe Services mit Characterisation Testing?
API-Responses sind perfekte Kandidaten für Golden Master Testing und Characterisation Testing:
class ApiCharacterisationTest extends TestCase
{
public function testApiResponseCharacterisation(): void
{
// Golden Master Recording für Characterisation Test
$cassettePath = __DIR__ . '/characterisation/api-golden-master.json';
if (getenv('CHARACTERISATION_RECORD') === 'true') {
$response = $this->httpClient->get('https://api.example.com/data');
file_put_contents($cassettePath, json_encode($response));
$this->markTestSkipped('Characterisation test golden master recorded');
}
// Characterisation Test mit Golden Master
$expectedResponse = json_decode(
file_get_contents($cassettePath),
true
);
$this->httpClient->shouldReceive('get')
->andReturn($expectedResponse);
$result = $this->systemUnderTest->fetchAndProcess();
$this->assertMatchesCharacterisationGoldenMaster($result);
}
}
Remote-Consulting-Tipp: Nutzt Environment-Variables für Characterisation Test Recording – macht Golden Master Updates kontrollierbar.
9. Was sind die größten Fallstricke beim Characterisation Testing und Golden Master Testing?
Aus unserer Consulting-Praxis die Top-Fehler bei Characterisation Testing:
❌ Fehler 1: Zu große Golden Master Files
// Schlecht für Characterisation Testing: Gesamte Datenbank-Dumps
$this->assertEquals(
file_get_contents('50mb-golden-master-dump.sql'),
$currentDump
);
// Besser für Golden Master Testing: Relevante Teilmengen charakterisieren
$this->assertEquals(
$this->extractRelevantDataForCharacterisation($dump),
file_get_contents('characterisation-data.json')
);
❌ Fehler 2: Fehlende Dokumentation der Characterisation Tests
/**
* @group characterisation-testing
* @group golden-master
* @ticket JIRA-4242
*
* Characterisation Test für Legacy-Preisberechnung
* Golden Master kann entfernt werden sobald PriceCalculatorV2 vollständig ist
* Erstellt: 2024-01-15 / Geplante Entfernung: Q2 2024
*/
❌ Fehler 3: Characterisation Testing als Dauerlösung
Golden Master Testing und Characterisation Testing sind der Start, nicht das Ziel!
10. Wie überzeugen wir Entscheider von Characterisation Testing und Golden Master Testing?
Die Business-Argumente für Characterisation Testing die ziehen:
ROI-Rechnung für Golden Master Testing:
- Setup Characterisation Tests: 2-4 Stunden
- Absicherung durch Golden Master: Unbezahlbar
- Verhinderte Bugs durch Characterisation Testing: 10-50 Stunden gespart
- Team-Confidence mit Golden Master Tests: Messbar höhere Velocity
Risiko-Minimierung durch Characterisation Testing:
// Vorher: Ohne Characterisation Tests - Russisches Roulette
$legacySystem->refactor(); // 🙏 Hoffentlich geht nichts kaputt
// Nachher: Mit Golden Master Testing - Kontrolliertes Vorgehen
$this->runCharacterisationTests(); // ✅ Golden Master bestätigt
$legacySystem->refactor();
$this->runCharacterisationTests(); // ✅ Verhalten unverändert charakterisiert
Kommunikations-Template für Entscheider:
„Mit Characterisation Testing und Golden Master Testing sichern wir in 4 Stunden ab, was sonst 40 Stunden Unit-Test-Entwicklung kosten würde. Characterisation Tests geben uns sofort Sicherheit für kritische Änderungen.“
Best Practices für Characterisation Testing aus über 15 Jahren Software-Qualität
Nach unzähligen Projekten haben wir bei Never Code Alone diese Standards für Golden Master Testing etabliert:
✅ Characterisation Test First: Bei ungetesteten Legacy-Systemen immer zuerst mit Golden Master absichern
✅ Normalize für Characterisation: Normalizer vom ersten Golden Master Test an einplanen
✅ Document Characterisation Tests: Jeder Golden Master braucht ein Ablaufdatum
✅ Review Golden Master Changes: Characterisation Test Updates immer im Team besprechen
✅ Plan Beyond Characterisation: Roadmap von Golden Master zu echten Tests
Der entscheidende Vorteil von Characterisation Testing für eure Code-Qualität
Golden Master Testing und Characterisation Testing sind keine Magie – sie sind pragmatische Ingenieurskunst. Ihr bekommt:
- Sofortige Characterisation ohne Wochen der Analyse
- Golden Master Sicherheit für kritische Systeme
- Team-Empowerment durch Characterisation Testing
- Dokumentation durch Golden Master des tatsächlichen Systemverhaltens
- Brücke von Characterisation Tests zu nachhaltiger Test-Strategie
Direkte Unterstützung für Characterisation Testing in eurem Team
Ihr kämpft mit einem untestbaren Legacy-Monster? Oder wollt ihr Golden Master Testing und Characterisation Testing optimal in eure CI/CD-Pipeline integrieren? Mit über 15 Jahren Expertise in Softwarequalität, Open Source und Remote Consulting unterstützen wir euch gerne bei der praktischen Umsetzung von Characterisation Tests.
Kontakt: roland@nevercodealone.de
Gemeinsam implementieren wir Characterisation Testing und Golden Master Testing in eurem Projekt – keine theoretischen Konzepte, sondern praktische Lösungen die funktionieren.
Fazit: Characterisation Testing als pragmatischer Weg aus der Legacy-Falle
Golden Master Testing und Characterisation Testing sind euer Schweizer Taschenmesser für Legacy-Code. Characterisation Tests sind nicht perfekt, müssen es aber auch nicht sein. Golden Master Testing gibt euch das, was ihr jetzt braucht: Sicherheit für Änderungen und Zeit für bessere Lösungen.
Startet heute: Identifiziert euren kritischsten Legacy-Code, schreibt einen Characterisation Test mit Golden Master Approach und erlebt die Befreiung, endlich refactoren zu können ohne Angst vor dem großen Knall.
Never Code Alone – Gemeinsam für bessere Software-Qualität mit Characterisation Testing und Golden Master Testing!