
Unter den besten Snapshot-Testtools für .NET-Entwickler gibt es viele großartige Optionen. Aber es gibt zwei Tools, die wirklich herausstechen: Verify und Storm Petrel. Beide bieten einzigartige Ansätze zur Verwaltung von erwarteten Baselines in Unit- und Integrationstests, unterscheiden sich jedoch erheblich in der Methodik und Implementierung.
Verify konzentriert sich auf die dateibasierte Snapshot-Verwaltung, speichert serialisierte Baselines und nutzt spezialisierte Erweiterungen und Diff-Tools.
Storm Petrel hingegen führt einen C#-Code-basierten Ansatz ein, bei dem .NET-Inkremental-Generatoren verwendet werden, um Baselines direkt im Testcode zu aktualisieren. Das Verständnis ihrer Unterschiede kann Entwicklern helfen, das richtige Tool basierend auf den Anforderungen ihres Projekts auszuwählen.
Was ist Verify .NET?
Verify .NET ist eine Sammlung von NuGet-Paketen, Snapshot-Management-Tools und Erweiterungen, die darauf abzielen, Snapshot-Tests in .NET zu vereinfachen.
Es bietet Erweiterungen für die Serialisierung, den Vergleich und die Verifizierung von erwarteten Baselines für die beliebtesten .NET-Bibliotheken und -Frameworks. Verify hilft, Snapshot-Tests zu organisieren, indem es Baseline-Snapshots vergleicht und neu schreibt, die im Dateisystem gespeichert sind.

Was ist Storm Petrel .NET?
Storm Petrel .NET ist ein Inkremental-Generator-Tool, das erwartete Baselines direkt im C#-Testcode aktualisiert (anstatt in Datei-Snapshots). Es unterstützt Unit- und Integrationstests für die beliebtesten .NET-Test-Frameworks.
Datei-Snapshots sind ein spezifischer Anwendungsfall des Baseline-Managements in Storm Petrel, das über das zusätzliche NuGet-Paket FileSnapshotInfrastructure implementiert werden kann. Dieses Paket implementiert teilweise die Abstraktionsschicht von Storm Petrel.
Technischer Vergleich: Verify vs. Storm Petrel
Hier werden wir Verify und Storm Petrel vergleichen, um dir die wichtigsten Unterschiede in der Art und Weise aufzuzeigen, wie sie Snapshots, Test-Updates und unterstützte Frameworks behandeln.
Refactoring-Anforderungen für Tests
Entwickler müssen traditionelle Assertion-Tests in Snapshot-Tests mit Verify umwandeln. Unten sind Beispiele, wie man von traditionellen Tests zu Verify-Style-Tests übergeht.
Beispiel für einen traditionellen Assertion-Test
[Fact]
public void TraditionalTest()
{
var person = ClassBeingTested.FindPerson();
Assert.Equal(new("ebced679-45d3-4653-8791-3d969c4a986c"), person.Id);
Assert.Equal(Title.Mr, person.Title);
Assert.Equal("John", person.GivenNames);
Assert.Equal("Smith", person.FamilyName);
Assert.Equal("Jill", person.Spouse);
Assert.Equal(2, person.Children.Count);
Assert.Equal("Sam", person.Children[0]);
Assert.Equal("Mary", person.Children[1]);
Assert.Equal("4 Puddle Lane", person.Address.Street);
Assert.Equal("USA", person.Address.Country);
}
Traditioneller Test mit FluentAssertions
[Fact]
public void TraditionalTestViaAssertionLibrary()
{
var person = ClassBeingTested.FindPerson();
person.Should().BeEquivalentTo(new Person
{
Id = new("ebced679-45d3-4653-8791-3d969c4a986c"),
Title = Title.Mr,
GivenNames = "John",
FamilyName = "Smith",
Spouse = "Jill",
Children = new List<string>
{
"Sam",
"Mary"
},
Address = new Address
{
Country = "USA",
Street = "4 Puddle Lane",
}
});
}
[Fact]
public Task SnapshotTest()
{
var person = ClassBeingTested.FindPerson();
return Verify(person);
}
In Verify wird die Personen-Baseline serialisiert und in einer Datei gespeichert, um den Abläufen der Erstverifizierung und der Folgeverifizierung von Verify zu folgen.


Storm Petrel erfordert nicht, dass Entwickler traditionelle Tests ändern. Wie im Abschnitt „Snapshot Testing mit Scand.StormPetrel.Generator ohne Serialisierung“ erklärt, behalten traditionelle Tests ihre wesentlichen Vorteile gegenüber Snapshot-Tests.
Für Datei-Snapshot-Tests folgt Storm Petrel ebenfalls dem traditionellen Ansatz mit einer natürlichen Anforderung:
Entwickler müssen Methoden wie
`Scand.StormPetrel.FileSnapshotInfrastructure.SnapshotProvider.ReadAllText()`
or
`SnapshotProvider.ReadAllBytes()`
basierend auf den Anwendungsfällen.
Snapshot-Speicherung & -Verwaltung
Verify unterstützt Tools wie ReSharper und Rider Test Runner Verify Plugins. Storm Petrel .NET hingegen erfordert diese Tools nicht.
Stattdessen nutzt es die .NET/IDE-Infrastruktur, um automatisch generierte Tests auszuführen und Baselines zu aktualisieren. Nach dem Aktualisieren der Baselines können Entwickler diese mit einem beliebigen Drittanbieter-Tool vergleichen, um zu überprüfen, ob die Aktualisierungen korrekt sind.
Verify bietet zahlreiche Erweiterungen (z. B. Verify.AspNetCore, Verify.WinForms, Verify.Xaml), um Objekte aus bestimmten Bibliotheken zu verifizieren. Storm Petrel eliminiert die Notwendigkeit solcher Erweiterungen, indem es Baselines als C#-Code darstellt, entweder über Drittanbieter-Dumper oder durch die Verwendung einer beliebigen Serialisierung/Darstellung von Objekten für Datei-Snapshots.
Unterstützte Test-Frameworks
Verify unterstützt etwa sechs Test-Frameworks, einschließlich xUnit, NUnit und MSTest. Storm Petrel unterstützt derzeit nur diese drei beliebtesten Frameworks.
Diff- und Update-Mechanismen
Verify enthält eine Diff-Engine mit Unterstützung für verschiedene Tools. Storm Petrel hingegen aktualisiert Baselines direkt und ermöglicht es Entwicklern, jedes beliebige Diff-/Merge-Tool ihrer Wahl für den Vergleich zu verwenden.
Vorteile und Nachteile beider Ansätze
Nachfolgend sind die bemerkenswertesten Vorteile und Nachteile jedes Ansatzes aufgeführt (obwohl dies keine vollständige Liste ist).

Vorteile von Verify
- Integrierte Interaktivität: Entwickler können tatsächliche/erwartete Snapshot-Unterschiede interaktiv verwalten, während sie Tests ausführen oder Snapshots nach der Ausführung vergleichen.
- Spezialisierte Erweiterungen: Bietet Erweiterungen wie Verify.AspNetCore, Verify.WinForms und Verify.Xaml, um Objekte aus beliebten Bibliotheken darzustellen, die für Snapshot-Tests sofort einsatzbereit sind.
- Breitere Framework-Unterstützung: Unterstützt mehr Test-Frameworks, einschließlich derjenigen für F#.
Nachteile von Verify
- Keine Unterstützung für C#-Code-Baselines: Verify unterstützt keine erwarteten Baselines, die direkt im C#-Code gespeichert sind, was ein Hauptanwendungsfall in traditionellen Tests ist.
- Testrefactoring erforderlich: Es sind erhebliche Änderungen an traditionellen Tests erforderlich, um den Snapshot-Testansatz von Verify zu übernehmen.
- Komplexität: Die Vielzahl an Interaktivitätsoptionen und spezialisierten Erweiterungen kann zusätzlichen Aufwand für das Erlernen und die Konfiguration erfordern. Einige Objekt-Darstellungen sind möglicherweise nicht sofort einsatzbereit.
Vorteile von Storm Petrel
- Traditioneller Testansatz: Beibehaltung des traditionellen Testansatzes, ohne dass wesentliche Änderungen erforderlich sind. Siehe die Konfiguration für spezifische Standard-/Benutzerdefinierte Namenskonventionen für tatsächliche/erwartete Variablen und FAQs für weitere Details.
- Flexibilität: Unterstützt sowohl „erwartete Baselines im C#-Code“ als auch „erwartete Baselines in Snapshot-Dateien“-Szenarien.
- Einfachheit: Keine Notwendigkeit für spezialisierte Erweiterungen oder integrierte Interaktivitätstools. Es können hier beliebige Drittanbieter-Lösungen verwendet werden.
Nachteile von Storm Petrel
- Keine integrierte Interaktivität: Entwickler müssen Drittanbieter-Diff-Tools verwenden, um die tatsächlichen und erwarteten Baselines zu vergleichen, nachdem Storm Petrel .NET diese aktualisiert hat.
- Begrenzte Framework-Unterstützung: Unterstützt derzeit nur xUnit, NUnit und MSTest. Keine Unterstützung für weniger beliebte Frameworks oder F#.
Anwendungsfälle
In diesem Abschnitt untersuchen wir, wie Verify und Storm Petrel in realen Szenarien eingesetzt werden. Jedes Tool dient spezifischen Bedürfnissen, daher werden wir aufschlüsseln, wann und warum Sie das eine oder das andere wählen sollten.
Initiale und nachfolgende Verifizierung mit Verify
Verify eignet sich nur für Projekte, bei denen Sie Snapshot-Tests über externe Dateien verwalten möchten. Sie verwenden Verify sowohl zur Verifizierung als auch zum Umschreiben erwarteter Baselines für Verify-Style-Snapshot-Tests. Dies ist nützlich, wenn Sie Snapshots außerhalb Ihres Testcodes speichern und sie während der Entwicklung Ihrer Tests problemlos vergleichen möchten.

Beispiel: Sie führen einen Test aus und die Baseline-Snapshot stimmt nicht mit der aktuellen Ausgabe überein. Verify schreibt den Snapshot neu, um den neuen Zustand widerzuspiegeln, wodurch es einfach wird, Änderungen im Laufe der Zeit nachzuvollziehen.
Visualisierung:
Initiale und nachfolgende Verifizierung mit Verify.
Umschreiben von Baselines mit Storm Petrel
Storm Petrel konzentriert sich auf C#-Code-Baselines für Snapshot-Tests. Es unterstützt auch Snapshot-Tests über externe Dateien, was es zu einer guten Wahl für Entwickler macht. Es bietet zwei Hauptanwendungsfälle für das Umschreiben von Baselines:

- Traditionelle Tests: Mit Storm Petrel können Sie den Prozess des Aktualisierens von Baselines automatisieren, die direkt als C#-Code innerhalb Ihrer Testmethoden gespeichert sind. Dies funktioniert gut, wenn Sie nicht auf externe Snapshot-Dateien angewiesen sein möchten und alles in Ihrem Testcode behalten möchten.
Beispiel:
Storm Petrel passt die Baseline in Ihrem C#-Code an, wann immer sich die Testergebnisse ändern, und hält sie so mit dem neuesten Stand konsistent.
Visualisierung: - Datei-Snapshot-Tests: Storm Petrel unterstützt auch die Automatisierung der Aktualisierung von Baselines für dateibasierte Snapshot-Tests. Sie können das NuGet-Paket FileSnapshotInfrastructure verwenden, um Datei-Snapshots zu verwalten, wodurch Sie die Baseline-Aktualisierungen für traditionelle Snapshot-Tests ebenfalls automatisieren können.
Beispiel:
Wenn sich ein Test ändert, kann Storm Petrel automatisch die entsprechende Snapshot-Datei basierend auf Ihrem definierten Anwendungsfall aktualisieren.
Visualisierung:

Fazit: Welches Tool sollten Sie verwenden?
Im Großen und Ganzen hängt Ihre Wahl von den Umständen Ihres Projekts ab:
- Wenn Sie mit Baselines arbeiten müssen, die im C#-Code gespeichert sind, ist Storm Petrel Ihre beste Wahl.
- Wenn Sie Baselines in externen Dateien speichern müssen, wählen Sie zwischen Verify .NET und Storm Petrel. Beziehen Sie sich auf die obenstehenden Abschnitte, um die beste Option basierend auf Ihren spezifischen Anforderungen und Szenariodetails zu ermitteln.
Beide Tools bieten starke Lösungen für Snapshot-Tests in .NET. Der Vergleich zwischen Verify und Storm Petrel kommt darauf an, ob Sie das Baseline-Management durch Code oder externe Dateien priorisieren.
Für detailliertere Informationen können Sie sich gerne an uns wenden und mehr über diese leistungsstarken .NET-Testtools erfahren.