Testen in C# (.NET): Überblick über wichtige Frameworks und Tools
Qualitatives Testen ist ein wesentlicher Bestandteil der Entwicklung zuverlässiger Software auf der .NET-Plattform. Im C#-Ökosystem gibt es zahlreiche ausgereifte Frameworks und Hilfsprogramme, die helfen, die Code-Überprüfung auf allen Ebenen zu automatisieren: von Modultests über Integrationstests bis hin zu UI-Tests. In diesem Artikel betrachten wir die wichtigsten Werkzeuge, ihre Besonderheiten und geben praktische Anwendungsbeispiele.
Wichtige Frameworks für Komponententests
Die Wahl des Frameworks für Modultests in .NET beschränkt sich oft auf drei Hauptkandidaten: xUnit, NUnit und MSTest. Alle unterstützen Attribute zur Definition von Tests, Assertions und die Ausführung über die Kommandozeile oder IDE.
xUnit.net
Ein modernes, aktiv weiterentwickeltes Framework, erstellt vom Autor von NUnit. Es zeichnet sich durch ein minimalistisches Design aus und verzichtet auf das Attribut [TestFixture] zugunsten von Konstruktoren für die Initialisierung. Es lässt sich ideal mit .NET Core und .NET 5+ integrieren.
using Xunit;
public class CalculatorTests{ [Fact] public void Add_ShouldReturnSum_WhenTwoNumbersAreProvided() { // Arrange var calculator = new Calculator(); int a = 5, b = 3;
// Act int result = calculator.Add(a, b);
// Assert Assert.Equal(8, result); }
[Theory] [InlineData(2, 3, 5)] [InlineData(0, 0, 0)] [InlineData(-1, 1, 0)] public void Add_ShouldHandleVariousCases(int a, int b, int expected) { var calculator = new Calculator(); int result = calculator.Add(a, b); Assert.Equal(expected, result); }}Wichtige Merkmale: [Fact] für normale Tests, [Theory] mit [InlineData] für parametrisierte Tests, integrierte Unterstützung für asynchrone Tests.
NUnit
Eines der ältesten Frameworks, weit verbreitet in Unternehmensprojekten. Es bietet eine umfangreiche Sammlung von Attributen ([SetUp], [TearDown], [TestCase]) und flexible Mechanismen zur Verwaltung des Testkontexts.
using NUnit.Framework;
[TestFixture]public class CalculatorTests{ private Calculator _calculator;
[SetUp] public void Setup() { _calculator = new Calculator(); }
[Test] [TestCase(1, 2, 3)] [TestCase(10, -5, 5)] public void Add_ShouldReturnCorrectSum(int a, int b, int expected) { int result = _calculator.Add(a, b); Assert.That(result, Is.EqualTo(expected)); }}Unterschiede: Erfordert das Attribut [TestFixture] für die Klasse, verwendet Assert.That(...) mit einem Constraint-Modell, was die Aussagen lesbarer macht.
MSTest
Framework von Microsoft, integriert in Visual Studio. Einfach zu erlernen, aber weniger flexibel als xUnit oder NUnit. Wird oft in Projekten verwendet, bei denen eine unternehmensweite Standardisierung wichtig ist.
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]public class CalculatorTests{ [TestMethod] public void Add_ShouldReturnSum() { var calculator = new Calculator(); int result = calculator.Add(2, 3); Assert.AreEqual(5, result); }}Bibliotheken für Mock-Objekte und Stubs
Zur Isolierung des zu testenden Codes von externen Abhängigkeiten (DB, API, Dateisystem) werden Mock-Frameworks verwendet. In .NET sind Moq, NSubstitute und FakeItEasy am beliebtesten.
Moq
Marktführer in Bezug auf Popularität. Ermöglicht das einfache Erstellen dynamischer Mock-Objekte über Lambda-Ausdrücke.
using Moq;using Xunit;
public class OrderServiceTests{ [Fact] public void PlaceOrder_ShouldCallRepository_WhenVali