Webframeworkk/ASP.NET Core/Erweiterter Unit-Test: Unterschied zwischen den Versionen

Aus Dokument
Zur Navigation springen Zur Suche springen
imported>Import
Version 201
 
Die Seite wurde neu angelegt: „Dieses Tutorial bietet einen umfassenden Überblick über moderne Tools und Techniken für Unit- und Integrationstests in der .NET-Entwicklung. Wir konzentrieren uns auf '''Fluent Assertions''', '''AutoFixture''', '''Mocking mit Moq''' und '''Integrationstests'''. ---- == 1. Fluent Assertions == Fluent Assertions ist eine Bibliothek, die Unit-Tests durch eine natürlichere, flüssige Syntax lesbarer macht. === Vorteile === * '''Lesbarkeit:''' Tests les…“
 
Zeile 4: Zeile 4:
Dieses Tutorial bietet einen umfassenden Überblick über moderne Tools und Techniken für Unit- und Integrationstests in der .NET-Entwicklung. Wir konzentrieren uns auf '''Fluent Assertions''', '''AutoFixture''', '''Mocking mit Moq''' und '''Integrationstests'''.
Dieses Tutorial bietet einen umfassenden Überblick über moderne Tools und Techniken für Unit- und Integrationstests in der .NET-Entwicklung. Wir konzentrieren uns auf '''Fluent Assertions''', '''AutoFixture''', '''Mocking mit Moq''' und '''Integrationstests'''.


 
----
-----


== 1. Fluent Assertions ==
== 1. Fluent Assertions ==
Fluent Assertions ist eine Bibliothek, die Unit-Tests durch eine natürlichere, flüssige Syntax lesbarer macht.
Fluent Assertions ist eine Bibliothek, die Unit-Tests durch eine natürlichere, flüssige Syntax lesbarer macht.


=== Vorteile ===
=== Vorteile ===
* '''Lesbarkeit:''' Tests lesen sich wie normales Englisch.
* '''Lesbarkeit:''' Tests lesen sich wie normales Englisch.
* '''Wartbarkeit:''' Klare Fehlermeldungen erleichtern die Fehlersuche.
* '''Wartbarkeit:''' Klare Fehlermeldungen erleichtern die Fehlersuche.
Zeile 18: Zeile 15:


=== Beispiele ===
=== Beispiele ===
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">// Einfache Assertions
// Einfache Assertions
result.Should().Be(5);
result.Should().Be(5);
result.Should().NotBeNull();
result.Should().NotBeNull();
Zeile 31: Zeile 28:
// Exception Assertions
// Exception Assertions
Action act = () => someMethod();
Action act = () => someMethod();
act.Should().Throw<ArgumentException>().WithMessage("Invalid operation");</syntaxhighlight>
act.Should().Throw<ArgumentException>().WithMessage("Invalid operation");
</syntaxhighlight>


-----
----


== 2. AutoFixture ==
== 2. AutoFixture ==
AutoFixture automatisiert die Erstellung von Testdaten, was besonders bei komplexen Objekten mit vielen Abhängigkeiten wertvoll ist.
AutoFixture automatisiert die Erstellung von Testdaten, was besonders bei komplexen Objekten mit vielen Abhängigkeiten wertvoll ist.


=== Integration mit xUnit ===
=== Integration mit xUnit ===
Installieren Sie das Paket <code>AutoFixture.Xunit2</code> und nutzen Sie das <code>[AutoData]</code> Attribut:
Installieren Sie das Paket <code>AutoFixture.Xunit2</code> und nutzen Sie das <code>[AutoData]</code> Attribut:


<syntaxhighlight lang="csharp">[Theory, AutoData]
<syntaxhighlight lang="csharp">
[Theory, AutoData]
public void CreatePerson_ValidPerson_ReturnsOk(Person person, Mock<IPersonsService> mockPersonsService)
public void CreatePerson_ValidPerson_ReturnsOk(Person person, Mock<IPersonsService> mockPersonsService)
{
{
     // AutoFixture erstellt automatisch eine Instanz von Person
     // AutoFixture erstellt automatisch eine Instanz von Person
     // ... Testlogik
     // ... Testlogik
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== Vorteile ===
=== Vorteile ===
* Reduzierung von Boilerplate-Code.
* Reduzierung von Boilerplate-Code.
* Einfache Anpassung generierter Daten.
* Einfache Anpassung generierter Daten.
* Fokus auf die eigentliche Testlogik statt auf Daten-Setup.
* Fokus auf die eigentliche Testlogik statt auf Daten-Setup.


 
----
-----


== 3. Mocking mit Moq ==
== 3. Mocking mit Moq ==
Mocking ermöglicht es, eine Code-Einheit (Unit) isoliert von ihren Abhängigkeiten (z.B. Datenbanken oder APIs) zu testen.
Mocking ermöglicht es, eine Code-Einheit (Unit) isoliert von ihren Abhängigkeiten (z.B. Datenbanken oder APIs) zu testen.


=== Funktionsweise ===
=== Funktionsweise ===
 
# '''Mock erstellen:''' <code>var mockRepo = new Mock<IPersonsRepository>();</code>
# '''Mock erstellen:''' <code>var mockRepo = new Mock</code><IPersonsRepository><code>();</code>
# '''Verhalten festlegen:''' <code>mockRepo.Setup(r => r.GetAll()).ReturnsAsync(new List<Person>());</code>
# '''Verhalten festlegen:''' <code>mockRepo.Setup(r =&gt; r.GetAll()).ReturnsAsync(new List</code><Person><code>());</code>
# '''Mock injizieren:''' Den Mock an den Konstruktor der zu testenden Klasse übergeben.
# '''Mock injizieren:''' Den Mock an den Konstruktor der zu testenden Klasse übergeben.
# '''Interaktionen verifizieren:''' <code>mockRepo.Verify(r =&gt; r.GetAll(), Times.Once());</code>
# '''Interaktionen verifizieren:''' <code>mockRepo.Verify(r => r.GetAll(), Times.Once());</code>


=== Best Practices beim Mocking ===
=== Best Practices beim Mocking ===
* '''Bedarfsorientiert:''' Nur das mocken, was für den Test notwendig ist.
* '''Bedarfsorientiert:''' Nur das mocken, was für den Test notwendig ist.
* '''Verhalten statt Details:''' Testen Sie, ''was'' passiert, nicht ''wie'' es implementiert ist.
* '''Verhalten statt Details:''' Testen Sie, ''was'' passiert, nicht ''wie'' es implementiert ist.


 
----
-----


== 4. Integrationstests ==
== 4. Integrationstests ==
Integrationstests prüfen das Zusammenspiel verschiedener Komponenten (Controller, Services, Datenbank).
Integrationstests prüfen das Zusammenspiel verschiedener Komponenten (Controller, Services, Datenbank).


=== Key Elements ===
=== Key Elements ===
* '''WebApplicationFactory:''' Simuliert den Webserver im Test.
* '''WebApplicationFactory:''' Simuliert den Webserver im Test.
* '''HttpClient:''' Sendet HTTP-Requests an den Testserver.
* '''HttpClient:''' Sendet HTTP-Requests an den Testserver.
Zeile 88: Zeile 79:


=== Beispiel: CustomWebApplicationFactory ===
=== Beispiel: CustomWebApplicationFactory ===
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">public class CustomWebApplicationFactory : WebApplicationFactory<Program>
public class CustomWebApplicationFactory : WebApplicationFactory<Program>
{
{
     protected override void ConfigureWebHost(IWebHostBuilder builder)
     protected override void ConfigureWebHost(IWebHostBuilder builder)
Zeile 101: Zeile 92:
         });
         });
     }
     }
}</syntaxhighlight>
}
</syntaxhighlight>


-----
----


== 5. Best Practices für Unit Tests ==
== 5. Best Practices für Unit Tests ==
Um effektive Tests zu schreiben, sollten diese folgende Kriterien erfüllen:
Um effektive Tests zu schreiben, sollten diese folgende Kriterien erfüllen:
* '''Isoliert:''' Keine Abhängigkeit von Dateisystem oder echten Datenbanken.
* '''Isoliert:''' Keine Abhängigkeit von Dateisystem oder echten Datenbanken.
* '''Schnell:''' Ausführung in wenigen Millisekunden.
* '''Schnell:''' Ausführung in wenigen Millisekunden.
Zeile 114: Zeile 104:
* '''Eindeutig:''' Nur eine Methode pro Testfall prüfen.
* '''Eindeutig:''' Nur eine Methode pro Testfall prüfen.


 
----
-----


== Interview-Tipps ==
== Interview-Tipps ==
* Erklären Sie den Unterschied zwischen '''Fakes''' (Dummy-Implementierung) und '''Mocks''' (vordefinierte Rückgabewerte).
* Erklären Sie den Unterschied zwischen '''Fakes''' (Dummy-Implementierung) und '''Mocks''' (vordefinierte Rückgabewerte).
* Kennen Sie die Vorteile von <code>[Theory]</code> gegenüber <code>[Fact]</code> in xUnit.
* Kennen Sie die Vorteile von <code>[Theory]</code> gegenüber <code>[Fact]</code> in xUnit.

Aktuelle Version vom 27. Februar 2026, 13:26 Uhr

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).


Dieses Tutorial bietet einen umfassenden Überblick über moderne Tools und Techniken für Unit- und Integrationstests in der .NET-Entwicklung. Wir konzentrieren uns auf Fluent Assertions, AutoFixture, Mocking mit Moq und Integrationstests.


1. Fluent Assertions

Fluent Assertions ist eine Bibliothek, die Unit-Tests durch eine natürlichere, flüssige Syntax lesbarer macht.

Vorteile

  • Lesbarkeit: Tests lesen sich wie normales Englisch.
  • Wartbarkeit: Klare Fehlermeldungen erleichtern die Fehlersuche.
  • Umfangreiches API: Deckt Collections, Strings, Exceptions und mehr ab.

Beispiele

// Einfache Assertions
result.Should().Be(5);
result.Should().NotBeNull();

// String Assertions
name.Should().StartWith("John").And.EndWith("Doe");

// Collection Assertions
list.Should().HaveCount(3).And.Contain("apple");

// Exception Assertions
Action act = () => someMethod();
act.Should().Throw<ArgumentException>().WithMessage("Invalid operation");

2. AutoFixture

AutoFixture automatisiert die Erstellung von Testdaten, was besonders bei komplexen Objekten mit vielen Abhängigkeiten wertvoll ist.

Integration mit xUnit

Installieren Sie das Paket AutoFixture.Xunit2 und nutzen Sie das [AutoData] Attribut:

[Theory, AutoData]
public void CreatePerson_ValidPerson_ReturnsOk(Person person, Mock<IPersonsService> mockPersonsService)
{
    // AutoFixture erstellt automatisch eine Instanz von Person
    // ... Testlogik
}

Vorteile

  • Reduzierung von Boilerplate-Code.
  • Einfache Anpassung generierter Daten.
  • Fokus auf die eigentliche Testlogik statt auf Daten-Setup.

3. Mocking mit Moq

Mocking ermöglicht es, eine Code-Einheit (Unit) isoliert von ihren Abhängigkeiten (z.B. Datenbanken oder APIs) zu testen.

Funktionsweise

  1. Mock erstellen: var mockRepo = new Mock<IPersonsRepository>();
  2. Verhalten festlegen: mockRepo.Setup(r => r.GetAll()).ReturnsAsync(new List<Person>());
  3. Mock injizieren: Den Mock an den Konstruktor der zu testenden Klasse übergeben.
  4. Interaktionen verifizieren: mockRepo.Verify(r => r.GetAll(), Times.Once());

Best Practices beim Mocking

  • Bedarfsorientiert: Nur das mocken, was für den Test notwendig ist.
  • Verhalten statt Details: Testen Sie, was passiert, nicht wie es implementiert ist.

4. Integrationstests

Integrationstests prüfen das Zusammenspiel verschiedener Komponenten (Controller, Services, Datenbank).

Key Elements

  • WebApplicationFactory: Simuliert den Webserver im Test.
  • HttpClient: Sendet HTTP-Requests an den Testserver.
  • In-Memory Database: Ermöglicht schnelle Datenbanktests ohne externe Abhängigkeiten.

Beispiel: CustomWebApplicationFactory

public class CustomWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseEnvironment("Test");
        builder.ConfigureServices(services => {
            // DB-Kontext durch In-Memory Datenbank ersetzen
            services.AddDbContext<ApplicationDbContext>(options => {
                options.UseInMemoryDatabase("TestDb");
            });
        });
    }
}

5. Best Practices für Unit Tests

Um effektive Tests zu schreiben, sollten diese folgende Kriterien erfüllen:

  • Isoliert: Keine Abhängigkeit von Dateisystem oder echten Datenbanken.
  • Schnell: Ausführung in wenigen Millisekunden.
  • Wiederholbar: Gleiches Ergebnis bei jedem Durchlauf.
  • Eindeutig: Nur eine Methode pro Testfall prüfen.

Interview-Tipps

  • Erklären Sie den Unterschied zwischen Fakes (Dummy-Implementierung) und Mocks (vordefinierte Rückgabewerte).
  • Kennen Sie die Vorteile von [Theory] gegenüber [Fact] in xUnit.
  • Betonen Sie die Wichtigkeit der Test-Isolierung.

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).