Zum Fußzeileninhalt springen
.NET HILFE

AutoFixture C# (Wie es für Entwickler funktioniert)

AutoFixture ist eine Open-Source-Bibliothek für .NET, die darauf abzielt, die 'Arrange'-Phase des Schreibens von Unit-Tests zu minimieren, um so das Testmanagement zu verbessern. Ihr Hauptziel ist es, Entwicklern zu ermöglichen, sich auf das zu konzentrieren, was sie testen, anstatt auf den Einrichtungsprozess, indem sie Objektstrukturen mit Testdaten erstellen können. Dieser Artikel untersucht, wie AutoFixture verwendet werden kann, um testgetriebene Entwicklung durch effiziente Testdatengenerierung zu erleichtern.

AutoFixture ist eine leistungsstarke Bibliothek in C#, die darauf ausgelegt ist, den Prozess der Erstellung von Testdaten für Unit-Tests zu optimieren. Sie hilft Entwicklern, das Schreiben von sich wiederholendem Einrichtungscode zu vermeiden, indem automatisch Daten für Testfälle generiert werden. Im Unit-Testing bietet AutoFixture einen optimierten Ansatz zur Generierung von Testdaten, der sicherstellt, dass jeder Unit-Test mit verschiedenen und realistischen Eingaben ausgeführt wird. AutoFixture macht das Testen in C# effizienter, indem es automatisch Testdaten generiert und den Bedarf an manueller Einrichtung reduziert.

AutoFixture C# (So funktioniert es für Entwickler): Abbildung 1 - AutoFixture

Installieren und Einrichten von AutoFixture

AutoFixture ist als NuGet-Paket verfügbar und kann mithilfe der NuGet-Paket-Manager-Konsole oder des .NET-Paket-Hinzufügens in der NuGet-Paket-Manager-Benutzeroberfläche von Visual Studio installiert werden.

Install-Package AutoFixture

NuGet lädt die neueste Version von AutoFixture und seinen Abhängigkeiten in Ihr Projekt herunter und installiert sie.

Beispiel für die Erstellung von Testdaten für eine Klasse

Angenommen, wir haben eine einfache Mitarbeiterklasse mit Eigenschaften wie FirstName, LastName und Age. Anstatt Instanzen dieser Klasse in unseren Unit-Tests manuell zu erstellen, können wir AutoFixture nutzen, um für uns zufällige Daten zu generieren.

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

    public Employee(string firstName, string lastName, int age)
    {
        FirstName = firstName;
        LastName = lastName;
        Age = age;
    }

    public string GetFullName() => $"{FirstName} {LastName}";
}
public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

    public Employee(string firstName, string lastName, int age)
    {
        FirstName = firstName;
        LastName = lastName;
        Age = age;
    }

    public string GetFullName() => $"{FirstName} {LastName}";
}
Public Class Employee
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer

	Public Sub New(ByVal firstName As String, ByVal lastName As String, ByVal age As Integer)
		Me.FirstName = firstName
		Me.LastName = lastName
		Me.Age = age
	End Sub

	Public Function GetFullName() As String
		Return $"{FirstName} {LastName}"
	End Function
End Class
$vbLabelText   $csharpLabel

Beschreibung des Codes

Die Klasse Employee kapselt wesentliche Details eines Mitarbeiters, einschließlich Vorname, Nachname und Alter, dargestellt durch die Eigenschaften FirstName, LastName bzw. Age. Ihr Konstruktor ermöglicht die Instanziierung eines Mitarbeiterobjekts, indem er diese Details als Parameter akzeptiert und sie den entsprechenden Eigenschaften zuweist. Zusätzlich verknüpft die Methode GetFullName den Vor- und Nachnamen des Mitarbeiters und gibt den vollständigen Namen als Zeichenkette zurück.

Einrichten des Codes für unser Testszenario

Als Nächstes erstellen wir eine Testklasse, um die Klasse Employee zu testen:

using AutoFixture;

public class EmployeeTests
{
    private readonly IFixture _fixture;

    public EmployeeTests()
    {
        // Using AutoFixture's Fixture to create test data
        _fixture = new Fixture();
    }
}
using AutoFixture;

public class EmployeeTests
{
    private readonly IFixture _fixture;

    public EmployeeTests()
    {
        // Using AutoFixture's Fixture to create test data
        _fixture = new Fixture();
    }
}
Imports AutoFixture

Public Class EmployeeTests
	Private ReadOnly _fixture As IFixture

	Public Sub New()
		' Using AutoFixture's Fixture to create test data
		_fixture = New Fixture()
	End Sub
End Class
$vbLabelText   $csharpLabel

Beschreibung des Codes

Dieser Codeausschnitt integriert AutoFixture in die Unit-Tests für die Klasse Employee. Durch den Import des Namespace AutoFixture erhalten Entwickler Zugriff auf die Datengenerierungsfunktionalität. Das Feld _fixture, das mit einer neuen Instanz von Fixture initialisiert wird, vereinfacht die Erstellung von Testdaten. Dieses Setup verbessert die Testeffizienz und -zuverlässigkeit für eine umfassende Employee Klassenabdeckung.

Beispiel 1: Validierung der Werte von Mitarbeiter-Testfall-Objekten

[Fact]
public void Employee_ShouldHaveValidValues()
{
    // Arrange
    var firstName = _fixture.Create<string>();
    var lastName = _fixture.Create<string>();
    var age = _fixture.Create<int>();

    // Act
    var employee = new Employee(firstName, lastName, age);

    // Assert
    Assert.Equal(firstName, employee.FirstName);
    Assert.Equal(lastName, employee.LastName);
    Assert.Equal(age, employee.Age);
}
[Fact]
public void Employee_ShouldHaveValidValues()
{
    // Arrange
    var firstName = _fixture.Create<string>();
    var lastName = _fixture.Create<string>();
    var age = _fixture.Create<int>();

    // Act
    var employee = new Employee(firstName, lastName, age);

    // Assert
    Assert.Equal(firstName, employee.FirstName);
    Assert.Equal(lastName, employee.LastName);
    Assert.Equal(age, employee.Age);
}
<Fact>
Public Sub Employee_ShouldHaveValidValues()
	' Arrange
	Dim firstName = _fixture.Create(Of String)()
	Dim lastName = _fixture.Create(Of String)()
	Dim age = _fixture.Create(Of Integer)()

	' Act
	Dim employee As New Employee(firstName, lastName, age)

	' Assert
	Assert.Equal(firstName, employee.FirstName)
	Assert.Equal(lastName, employee.LastName)
	Assert.Equal(age, employee.Age)
End Sub
$vbLabelText   $csharpLabel

Beschreibung des Codes

Die Testmethode Employee_ShouldHaveValidValues prüft, ob die Klasse Employee ihre Eigenschaften korrekt mit den angegebenen Werten initialisiert. Durch die Verwendung einer Testvorrichtung zur Generierung von Zufallsdaten für die FirstName, LastName und Age erzeugt der Test eine Employee-Instanz. Anschließend wird sichergestellt, dass die Eigenschaften FirstName, LastName und Age des Objekts Employee mit den generierten Werten übereinstimmen, wodurch gewährleistet wird, dass der Konstruktor diese Eigenschaften korrekt setzt.

Beispiel 2: Validierung des Mitarbeiters beim Aufruf des Konstruktors

[Fact]
public void CreateEmployee_ValidData_ReturnsEmployeeObject()
{
    // Arrange
    var employee = _fixture.Create<Employee>();

    // Act 
    // Assert
    Assert.NotNull(employee);
    Assert.False(string.IsNullOrEmpty(employee.FirstName));
    Assert.NotNull(employee.LastName);
    Assert.True(employee.Age > 0);
}
[Fact]
public void CreateEmployee_ValidData_ReturnsEmployeeObject()
{
    // Arrange
    var employee = _fixture.Create<Employee>();

    // Act 
    // Assert
    Assert.NotNull(employee);
    Assert.False(string.IsNullOrEmpty(employee.FirstName));
    Assert.NotNull(employee.LastName);
    Assert.True(employee.Age > 0);
}
<Fact>
Public Sub CreateEmployee_ValidData_ReturnsEmployeeObject()
	' Arrange
	Dim employee = _fixture.Create(Of Employee)()

	' Act 
	' Assert
	Assert.NotNull(employee)
	Assert.False(String.IsNullOrEmpty(employee.FirstName))
	Assert.NotNull(employee.LastName)
	Assert.True(employee.Age > 0)
End Sub
$vbLabelText   $csharpLabel

Beschreibung des Codes

Diese Testmethode beinhaltet Testaussagen, die überprüfen, ob die Eigenschaften eines Employee-Objekts mit zufällig generierten Werten übereinstimmen. Es wird überprüft, ob die Eigenschaften des Typs string, FirstName und LastName sowie int und Age korrekt gesetzt und gültig sind. Alle fehlgeschlagenen Zusicherungen deuten auf eine Diskrepanz zwischen den erwarteten und den zufällig generierten Werten für Mitarbeiterdetails hin.

AutoFixture C# (So funktioniert es für Entwickler): Abbildung 2 - Unit-Test für gültige Mitarbeiterdaten

Einführung in IronPDF

Die IronPDF C# PDF-Bibliothek ist eine robuste C#-PDF-Bibliothek, die von Iron Software entwickelt wurde und das Lesen von PDF-Texten sowie die Erstellung von PDF-Dokumenten mit HTML erleichtert. Dieses vielseitige Tool ermöglicht die Umwandlung von Dokumenten mit einfacher Formatierung und Stilinformationen in hochwertige PDFs. Mit IronPDF ist das Erstellen von PDFs aus HTML-Text ein nahtloser Prozess, der es Benutzern erlaubt, HTML-Inhalte aus URLs zu ziehen und diese in gut strukturierte PDF-Dateien zu transformieren. Diese Fähigkeit macht IronPDF zu einem unverzichtbaren Werkzeug für Entwickler, die die Erstellung von professionellen PDF-Dokumenten direkt aus Webinhalten automatisieren und optimieren möchten.

AutoFixture C# (So funktioniert es für Entwickler): Abbildung 3 - IronPDF

Installation von IronPDF

Öffnen Sie die NuGet-Paket-Manager-Konsole und führen Sie den folgenden Befehl aus:

Install-Package IronPdf

Codebeispiel für die Verwendung der Funktionen von AutoFixture mit IronPDF

Unten ist ein Beispiel, das zeigt, wie AutoFixture zusammen mit IronPDF verwendet wird, um ein PDF mit Mitarbeiterdaten zu generieren:

using DemoAutofixture;
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class EmployeePdfGenerator
{
    private readonly Fixture _fixture;

    public EmployeePdfGenerator()
    {
        _fixture = new Fixture();
    }

    public List<Employee> GenerateEmployees(int count)
    {
        return _fixture.CreateMany<Employee>(count).ToList();
    }

    public void GeneratePdf(List<Employee> employees, string filePath)
    {
        IronPdf.License.LicenseKey = "Your-License-Key-Here";
        var renderer = new ChromePdfRenderer();
        string htmlContent = GenerateHtml(employees);

        try
        {
            renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath);
            Console.WriteLine("PDF Created Successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
        }
    }

    private string GenerateHtml(List<Employee> employees)
    {
        StringBuilder htmlBuilder = new StringBuilder();
        htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>");

        foreach (var employee in employees)
        {
            htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>");
        }

        htmlBuilder.Append("</ul></body></html>");
        return htmlBuilder.ToString();
    }
}
using DemoAutofixture;
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class EmployeePdfGenerator
{
    private readonly Fixture _fixture;

    public EmployeePdfGenerator()
    {
        _fixture = new Fixture();
    }

    public List<Employee> GenerateEmployees(int count)
    {
        return _fixture.CreateMany<Employee>(count).ToList();
    }

    public void GeneratePdf(List<Employee> employees, string filePath)
    {
        IronPdf.License.LicenseKey = "Your-License-Key-Here";
        var renderer = new ChromePdfRenderer();
        string htmlContent = GenerateHtml(employees);

        try
        {
            renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath);
            Console.WriteLine("PDF Created Successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
        }
    }

    private string GenerateHtml(List<Employee> employees)
    {
        StringBuilder htmlBuilder = new StringBuilder();
        htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>");

        foreach (var employee in employees)
        {
            htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>");
        }

        htmlBuilder.Append("</ul></body></html>");
        return htmlBuilder.ToString();
    }
}
Imports DemoAutofixture
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Public Class EmployeePdfGenerator
	Private ReadOnly _fixture As Fixture

	Public Sub New()
		_fixture = New Fixture()
	End Sub

	Public Function GenerateEmployees(ByVal count As Integer) As List(Of Employee)
		Return _fixture.CreateMany(Of Employee)(count).ToList()
	End Function

	Public Sub GeneratePdf(ByVal employees As List(Of Employee), ByVal filePath As String)
		IronPdf.License.LicenseKey = "Your-License-Key-Here"
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent As String = GenerateHtml(employees)

		Try
			renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath)
			Console.WriteLine("PDF Created Successfully!")
		Catch ex As Exception
			Console.WriteLine($"Error generating PDF: {ex.Message}")
		End Try
	End Sub

	Private Function GenerateHtml(ByVal employees As List(Of Employee)) As String
		Dim htmlBuilder As New StringBuilder()
		htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>")

		For Each employee In employees
			htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>")
		Next employee

		htmlBuilder.Append("</ul></body></html>")
		Return htmlBuilder.ToString()
	End Function
End Class
$vbLabelText   $csharpLabel

Um diese Klasse zu verwenden, würden Sie EmployeePdfGenerator instanziieren, eine Liste von Mitarbeitern generieren und dann GeneratePdf aufrufen:

List<Employee> employees = new()
{
    new Employee("John", "Smith", 32),
    new Employee("Emily", "Davis", 18),
    new Employee("David", "Brown", 24),
    new Employee("Jane", "Doe", 16),
    new Employee("Michael", "Johnson", 49),
};

EmployeePdfGenerator pdfGenerator = new();
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf");
List<Employee> employees = new()
{
    new Employee("John", "Smith", 32),
    new Employee("Emily", "Davis", 18),
    new Employee("David", "Brown", 24),
    new Employee("Jane", "Doe", 16),
    new Employee("Michael", "Johnson", 49),
};

EmployeePdfGenerator pdfGenerator = new();
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf");
Dim employees As New List(Of Employee)() From {
	New Employee("John", "Smith", 32),
	New Employee("Emily", "Davis", 18),
	New Employee("David", "Brown", 24),
	New Employee("Jane", "Doe", 16),
	New Employee("Michael", "Johnson", 49)
}

Dim pdfGenerator As New EmployeePdfGenerator()
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf")
$vbLabelText   $csharpLabel

AutoFixture C# (So funktioniert es für Entwickler): Abbildung 4 - Autofixture mit IronPDF Ausgabe

Beschreibung des Codes

Der bereitgestellte C#-Code verwendet die IronPDF-Bibliothek, um ein PDF-Dokument zu generieren, das Mitarbeiter und deren Alter auflistet. Es definiert eine EmployeePdfGenerator Klasse, die die Methode GeneratePdf enthält, welche eine Liste von Employee Objekten und einen Dateipfad entgegennimmt. Intern erstellt es HTML-Inhalte mithilfe der Methode GenerateHtml und verwendet dann die Klasse HtmlToPdf von IronPDF, um dieses HTML als PDF zu rendern und unter dem angegebenen Dateipfad zu speichern. Zu den Verbesserungen gehören die Verwendung von StringBuilder für die HTML-Generierung und das Hinzufügen einer grundlegenden Fehlerbehandlung für die PDF-Generierung und das Speichern von Dateien.

Schreiben einer Testmethode

Im folgenden Setup wird AutoFixture verwendet, um Instanzen der Klasse Employee zu erstellen und so die Generierung von randomisierten Daten für Testzwecke zu ermöglichen. IronPDF wird verwendet, um HTML-Inhalte, einschließlich Mitarbeiterinformationen, nahtlos in PDF-Format zu konvertieren. Die Klasse EmployeePdfGenerator orchestriert diese Prozesse und verwaltet sowohl die Datengenerierung als auch die PDF-Konvertierung effizient. Die EmployeePdfGeneratorTests XUnit-Testklasse gewährleistet derweil durch strenge Tests die korrekte Funktionalität der PDF-Generierung. Dieser integrierte Ansatz vereinfacht die Generierung und Dokumentation von Mitarbeiterdaten und stellt Robustheit und Zuverlässigkeit im PDF-Generierungsprozess sicher.

using System.IO;
using Xunit;

public class EmployeePdfGeneratorTests
{
    [Fact]
    public void GeneratePdf_GeneratesPdfFile()
    {
        // Arrange
        var generator = new EmployeePdfGenerator();
        var employees = generator.GenerateEmployees(5);
        string filePath = "EmployeeList.pdf";

        // Act
        generator.GeneratePdf(employees, filePath);

        // Assert
        Assert.True(File.Exists(filePath));
    }
}
using System.IO;
using Xunit;

public class EmployeePdfGeneratorTests
{
    [Fact]
    public void GeneratePdf_GeneratesPdfFile()
    {
        // Arrange
        var generator = new EmployeePdfGenerator();
        var employees = generator.GenerateEmployees(5);
        string filePath = "EmployeeList.pdf";

        // Act
        generator.GeneratePdf(employees, filePath);

        // Assert
        Assert.True(File.Exists(filePath));
    }
}
Imports System.IO
Imports Xunit

Public Class EmployeePdfGeneratorTests
	<Fact>
	Public Sub GeneratePdf_GeneratesPdfFile()
		' Arrange
		Dim generator = New EmployeePdfGenerator()
		Dim employees = generator.GenerateEmployees(5)
		Dim filePath As String = "EmployeeList.pdf"

		' Act
		generator.GeneratePdf(employees, filePath)

		' Assert
		Assert.True(File.Exists(filePath))
	End Sub
End Class
$vbLabelText   $csharpLabel

Hier enthält die Klasse EmployeePdfGeneratorTests einen Testfall, der die Erstellung einer PDF-Datei unter dem angegebenen Dateipfad validiert und sicherstellt, dass die Methode GeneratePdf korrekt funktioniert.

AutoFixture C# (So funktioniert es für Entwickler): Abbildung 5 - AutoFixture C#

Abschluss

AutoFixture vereinfacht die 'Arrange'-Phase beim Schreiben von Unit-Tests in .NET und bietet den Entwicklern die Möglichkeit, sich auf Testfälle anstatt auf Einrichtungsdetails zu konzentrieren. Es optimiert den Prozess des Unit-Testings und sorgt durch die automatische Generierung von Testdaten für verschiedene und realistische Eingaben. In Verbindung mit IronPDF-Lizenzinformationen bietet es eine leistungsstarke Kombination für den kontinuierlichen Einsatz und Support.

Häufig gestellte Fragen

Wie kann ich Testdaten in C# mit AutoFixture generieren?

Sie können AutoFixture in C# verwenden, indem Sie die 'Fixture' Klasse nutzen. Diese Klasse ermöglicht es Ihnen, automatisch Instanzen von Klassen mit zufälligen Daten zu erstellen, die effizient zur Einrichtung unterschiedlicher Testszenarien genutzt werden können.

Was sind die Installationsschritte für AutoFixture in einem .NET-Projekt?

Um AutoFixture in einem .NET-Projekt zu installieren, können Sie die NuGet-Paket-Manager-Konsole mit dem Befehl Install-Package AutoFixture verwenden. Es ist auch über die NuGet-Paket-Manager-Oberfläche von Visual Studio verfügbar, wo Sie nach AutoFixture suchen und es Ihrem Projekt hinzufügen können.

Wie verbessert AutoFixture den Einheitentestprozess?

AutoFixture verbessert den Einheitentestprozess, indem es realistische und vielfältige Testdaten automatisch generiert. Dies reduziert den Bedarf an manueller Einrichtung und stellt sicher, dass Tests mit einer Vielzahl von Eingaben durchgeführt werden, was die Testabdeckung und Zuverlässigkeit verbessert.

Kann AutoFixture mit PDF-Generierungsbibliotheken in .NET integriert werden?

Ja, AutoFixture kann mit PDF-Generierungsbibliotheken wie IronPDF in .NET integriert werden. Durch die Verwendung von AutoFixture zur Datenbereitstellung können Sie PDFs mit dynamischen Inhalten, wie z.B. Mitarbeiterdaten, erstellen, indem Sie die Fähigkeiten von IronPDF zur Umwandlung von HTML in PDF nutzen.

Was ist der Zweck der 'Fixture' Klasse in AutoFixture?

Die 'Fixture' Klasse in AutoFixture ist dafür konzipiert, die Einrichtung von Tests zu vereinfachen, indem sie automatisch Testdaten erstellt. Sie generiert Instanzen von Klassen mit zufälligen Daten, sodass Entwickler sich mehr auf das Testen der Logik konzentrieren können, anstatt Daten manuell vorzubereiten.

Wie unterstützt AutoFixture die testgetriebene Entwicklung (TDD)?

AutoFixture unterstützt die testgetriebene Entwicklung (TDD), indem es eine einfache Möglichkeit zur Generierung von Testdaten bietet, die es Entwicklern ermöglicht, Tests zu schreiben und Funktionalitäten zu implementieren, ohne übermäßig viel Zeit mit der Dateneinrichtung zu verbringen. Dies vereinfacht den TDD-Prozess und macht ihn effizienter.

Wie kann ich die Dokumentenerstellung in C# mit AutoFixture und PDF-Bibliotheken automatisieren?

Sie können die Dokumentenerstellung in C# automatisieren, indem Sie AutoFixture mit einer PDF-Bibliothek wie IronPDF kombinieren. AutoFixture kann die für das Dokument benötigten Daten generieren, und IronPDF kann diese Daten, die als HTML formatiert sind, effizient in ein PDF-Dokument umwandeln.

Jacob Mellor, Chief Technology Officer @ Team Iron
Chief Technology Officer

Jacob Mellor ist Chief Technology Officer bei Iron Software und ein visionärer Ingenieur, der Pionierarbeit in der C# PDF-Technologie leistet. Als der ursprüngliche Entwickler hinter der Kern-Codebasis von Iron Software hat er die Produktarchitektur des Unternehmens seit seiner Gründung geprägt und es zusammen mit CEO ...

Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an