Przejdź do treści stopki
POMOC .NET

AutoFixture C# (Jak to dziala dla programistow)

AutoFixture to biblioteka open source dla platformy .NET, której celem jest zminimalizowanie fazy "Arrange" podczas pisania testów jednostkowych, a tym samym usprawnienie zarządzania testami. Jego głównym celem jest umożliwienie programistom skupienia się na tym, co testują, a nie na procesie konfiguracji, poprzez umożliwienie tworzenia grafów obiektów z danymi testowymi. W tym artykułe omówiono, w jaki sposób AutoFixture może ułatwić programowanie sterowane testami poprzez wydajne generowanie danych testowych.

AutoFixture to potężna biblioteka w języku C# zaprojektowana w celu usprawnienia procesu tworzenia danych testowych dla testów jednostkowych. Pomaga programistom uniknąć pisania powtarzalnego kodu konfiguracyjnego poprzez automatyczne generowanie danych dla przypadków testowych. W testowaniu jednostkowym AutoFixture zapewnia usprawnione podejście do generowania danych testowych, gwarantując, że każdy test jednostkowy jest wykonywany przy użyciu zróżnicowanych i realistycznych danych wejściowych. AutoFixture zwiększa wydajność testowania w języku C# poprzez automatyczne generowanie danych testowych, co ogranicza konieczność ręcznej konfiguracji.

AutoFixture C# (Jak to działa dla deweloperów): Rysunek 1 - AutoFixture

Instalacja i konfiguracja AutoFixture

AutoFixture jest dostępne jako pakiet NuGet i można je zainstalować za pomocą konsoli NuGet Package Manager Console lub opcji dodawania pakietów .NET w interfejsie użytkownika NuGet Package Manager w programie Visual Studio.

Install-Package AutoFixture

NuGet pobierze i zainstaluje najnowszą wersję AutoFixture oraz jej zależności w Twoim projekcie.

Przykład tworzenia danych testowych dla klasy

Załóżmy, że mamy prostą klasę pracownika z właściwościami takimi jak FirstName, LastName i Age. Zamiast ręcznie tworzyć instancje tej klasy w naszych testach jednostkowych, możemy wykorzystać AutoFixture do generowania losowych danych.

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

Opis kodu

Klasa Employee enkapsuluje istotne szczegóły pracownika, w tym jego imię, nazwisko i wiek, reprezentowane przez właściwości FirstName, LastName i Age odpowiednio. Jego konstruktor ułatwia instancjonowanie obiektu pracownika poprzez przyjmowanie tych szczegółów jako parametrów i przypisywanie ich do odpowiednich właściwości. Dodatkowo, metoda GetFullName konkatenuje imię i nazwisko pracownika, zwracając pełne imię i nazwisko jako ciąg tekstowy.

Konfiguracja kodu dla naszego scenariusza testowego

Następnie utworzymy klasę testową do testowania klasy Employee:

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

Opis kodu

Ten fragment kodu integruje AutoFixture z testowaniem jednostkowym dla klasy Employee. Importując przestrzeń nazw AutoFixture, deweloperzy uzyskują dostęp do funkcjonalności generowania danych. Pole _fixture, zainicjowane nową instancją Fixture, usprawnia tworzenie danych testowych. To ustawienie zwiększa efektywność i niezawodność testów dla kompleksowego pokrycia klasy Employee.

Przykład 1: Sprawdzanie poprawności wartości obiektu testowego pracownika

[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

Opis kodu

Metoda testowa Employee_ShouldHaveValidValues weryfikuje, czy klasa Employee poprawnie inicjuje swoje właściwości z podanymi wartościami. Używając urządzenia testowego do generowania losowych danych dla FirstName, LastName i Age, test tworzy instancję Employee. Następnie sprawdza, czy właściwości FirstName, LastName i Age obiektu Employee odpowiadają wygenerowanym wartościom, zapewniając, że konstruktor poprawnie ustawia te właściwości.

Przykład 2: Sprawdzanie poprawności danych pracownika przy wywołaniu konstruktóra

[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

Opis kodu

Ta metoda testowa zawiera asercje testowe, które sprawdzają, czy właściwości obiektu Employee odpowiadają losowo wygenerowanym wartościom. Weryfikuje, czy właściwości typu string FirstName i LastName, oraz int Age są prawidłowo ustawione i ważne. Wszelkie nieudane asercje sygnalizują niezgodność między wartościami oczekiwanymi a losowymi wartościami wygenerowanymi dla danych pracowników.

AutoFixture C# (Jak to działa dla deweloperów): Rysunek 2 - Jednostkowy Test Danych Pracownika

Przedstawiamy IronPDF

IronPDF C# PDF Library to solidna biblioteka C# do obsługi plików PDF opracowana przez Iron Software, która ułatwia odczytywanie tekstu z plików PDF oraz tworzenie dokumentów PDF przy użyciu HTML. To wszechstronne narzędzie umożliwia konwersję łatwych do formatowania dokumentów, wraz z informacjami o stylu, na wysokiej jakości pliki PDF. Dzięki IronPDF generowanie plików PDF z tekstu HTML jest procesem płynnym, umożliwiającym użytkownikom pobieranie treści HTML z adresów URL i przekształcanie ich w dobrze ustrukturyzowane pliki PDF. Ta funkcja sprawia, że IronPDF jest niezbędnym narzędziem dla programistów, którzy chcą zautomatyzować i usprawnić tworzenie profesjonalnych dokumentów PDF bezpośrednio z treści internetowych.

AutoFixture C# (Jak to działa dla deweloperów): Rysunek 3 - IronPDF

Instalacja IronPDF

Otwórz konsolę NuGet Package Manager i uruchom następujące polecenie:

Install-Package IronPdf

Przykład kodu wykorzystujący funkcje AutoFixture z IronPDF

Poniżej znajduje się przykład ilustrujący wykorzystanie AutoFixture wraz z IronPDF do wygenerowania pliku PDF zawierającego dane pracowników:

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

Aby użyć tej klasy, należy utworzyć instancję EmployeePdfGenerator, wygenerować listę pracowników, a następnie wywołać GeneratePdf:

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# (Jak to działa dla deweloperów): Rysunek 4 - Autofixture z IronPDF

Opis kodu

Podany kod w języku C# wykorzystuje bibliotekę IronPDF do wygenerowania dokumentu PDF zawierającego listę pracowników wraz z ich wiekiem. Definiuje klasę EmployeePdfGenerator, która zawiera metodę GeneratePdf przyjmującą listę obiektów Employee i ścieżkę do pliku. Wewnętrznie konstruuje zawartość HTML za pomocą metody GenerateHtml, a następnie używa klasy HtmlToPdf IronPDF do renderowania tego HTML jako PDF, zapisanego w określonej lokalizacji pliku. Ulepszenia obejmują użycie StringBuilder do generowania HTML i dodanie podstawowego zarządzania błędami do generowania PDF i zapisu plików.

Pisanie metody testowej

W poniższym ustawieniu AutoFixture jest używany do tworzenia instancji klasy Employee, umożliwiając generowanie zrandomizowanych danych do testów. IronPDF służy do płynnej konwersji treści HTML, w tym informacji o pracownikach, do formatu PDF. Klasa EmployeePdfGenerator organizuje te procesy, efektywnie zarządzając zarówno generowaniem danych, jak i konwersją do PDF. Tymczasem klasa testowa XUnit EmployeePdfGeneratorTests zapewnia prawidłowe działanie generowania PDF poprzez rygorystyczne testy. To zintegrowane podejście upraszcza generowanie i dokumentówanie danych pracowników, zapewniając solidność i niezawodność procesu tworzenia plików PDF.

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

Tutaj klasa EmployeePdfGeneratorTests zawiera przypadek testowy, który weryfikuje utworzenie pliku PDF w określonej ścieżce, zapewniając, że metoda GeneratePdf działa poprawnie.

AutoFixture C# (Jak to działa dla deweloperów): Rysunek 5 - AutoFixture C#

Wnioski

AutoFixture upraszcza fazę "Arrange" podczas pisania testów jednostkowych w .NET, oferując programistom możliwość skupienia się na przypadkach testowych, a nie na zawiłościach konfiguracji. Usprawnia proces testowania jednostkowego, zapewniając zróżnicowane i realistyczne dane wejściowe poprzez automatyczne generowanie danych testowych. W połączeniu z informacjami o licencjonowaniu IronPDF stanowi to potężne połączenie zapewniające ciągłość użytkowania i wsparcia.

Często Zadawane Pytania

Jak wygenerować dane testowe w języku C# przy użyciu AutoFixture?

Możesz użyć AutoFixture do generowania danych testowych w C#, korzystając z klasy „Fixture”. Klasa ta pozwala na automatyczne tworzenie instancji klas z losowymi danymi, które można wykorzystać do efektywnego konfigurowania różnorodnych scenariuszy testowych.

Jakie są kroki instalacji AutoFixture w projekcie .NET?

Aby zainstalować AutoFixture w projekcie .NET, można użyć konsoli NuGet Package Manager Console, wpisując polecenie Install-Package AutoFixture. Jest ono również dostępne za pośrednictwem interfejsu użytkownika NuGet Package Manager w programie Visual Studio, gdzie można wyszukać AutoFixture i dodać je do swojego projektu.

W jaki sposób AutoFixture usprawnia proces testowania jednostkowego?

AutoFixture usprawnia proces testowania jednostkowego poprzez automatyczne generowanie realistycznych i zróżnicowanych danych testowych. Zmniejsza to potrzebę ręcznej konfiguracji i zapewnia, że testy są przeprowadzane z wykorzystaniem szerokiego zakresu danych wejściowych, poprawiając pokrycie testowe i niezawodność.

Czy AutoFixture można zintegrować z bibliotekami do generowania plików PDF w środowisku .NET?

Tak, AutoFixture można zintegrować z bibliotekami do generowania plików PDF, takimi jak IronPDF for .NET. Wykorzystując AutoFixture do generowania danych, można tworzyć pliki PDF zawierające treści dynamiczne, takie jak dane pracowników, dzięki możliwościom IronPDF for .NET w zakresie konwersji HTML na PDF.

Jaki jest cel klasy „Fixture” w AutoFixture?

Klasa „Fixture” w AutoFixture została zaprojektowana w celu uproszczenia konfiguracji testów poprzez automatyczne tworzenie danych testowych. Generuje ona instancje klas z losowymi danymi, pozwalając programistom skupić się bardziej na testowaniu logiki niż na ręcznym konfigurowaniu danych.

W jaki sposób AutoFixture ułatwia programowanie sterowane testami (TDD)?

AutoFixture wspomaga programowanie sterowane testami (TDD), zapewniając łatwy sposób generowania danych testowych, co pozwala programistom pisać testy i wdrażać funkcjonalność bez poświęcania nadmiernej ilości czasu na konfigurację danych. Usprawnia to proces TDD, czyniąc go bardziej wydajnym.

Jak mogę zautomatyzować tworzenie dokumentów w języku C# przy użyciu bibliotek AutoFixture i PDF?

Możesz zautomatyzować tworzenie dokumentów w języku C#, łącząc AutoFixture z biblioteką PDF, taką jak IronPDF. AutoFixture może generować dane potrzebne do dokumentu, a IronPDF może efektywnie konwertować te dane, sformatowane jako HTML, na dokument PDF.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie