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 artykule 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 programistó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ę Employee 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 zawiera podstawowe informacje o pracowniku, w tym imię, nazwisko i wiek, reprezentowane odpowiednio przez właściwości FirstName, LastName i Age. 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 łączy imię i nazwisko pracownika, zwracając pełne imię i nazwisko jako ciąg znaków.

Konfiguracja kodu dla naszego scenariusza testowego

Następnie utworzymy klasę testową w celu przetestowania 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 wykorzystuje AutoFixture w testach jednostkowych dla klasy Employee. Importując przestrzeń nazw AutoFixture, programiści uzyskują dostęp do funkcji generowania danych. Pole _fixture, zainicjowane nową instancją Fixture, usprawnia tworzenie danych testowych. Takie ustawienie zwiększa wydajność i niezawodność testów, zapewniając kompleksowe pokrycie 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 sprawdza, czy klasa Employee poprawnie inicjuje swoje właściwości przy użyciu podanych wartości. Wykorzystując zestaw testowy 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 są zgodne z wygenerowanymi wartościami, zapewniając, że konstruktor ustawia te właściwości poprawnie.

Przykład 2: Sprawdzanie poprawności danych pracownika przy wywołaniu konstruktora

[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. Sprawdza, czy właściwości typu string FirstName oraz LastName, int i Age są poprawnie ustawione i prawidłowe. 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 programistów): Rysunek 2 – Test jednostkowy poprawnych 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 programistó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 programistów): Rysunek 4 – Autofixture z wyjściem 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 oraz ścieżkę do pliku. Wewnętrznie tworzy zawartość HTML za pomocą metody GenerateHtml, a następnie wykorzystuje klasę HtmlToPdf biblioteki IronPDF do renderowania tego kodu HTML jako pliku PDF, który jest zapisywany w określonej ścieżce. Ulepszenia obejmują użycie StringBuilder do generowania kodu HTML oraz dodanie podstawowej obsługi błędów podczas generowania plików PDF i zapisywania plików.

Pisanie metody testowej

W poniższej konfiguracji AutoFixture służy do tworzenia instancji klasy Employee, umożliwiając generowanie losowych 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 koordynuje te procesy, efektywnie zarządzając zarówno generowaniem danych, jak i konwersją do formatu PDF. Tymczasem klasa testowa EmployeePdfGeneratorTests XUnit zapewnia prawidłowe działanie generowania plików 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

W tym przypadku klasa EmployeePdfGeneratorTests zawiera przypadek testowy, który weryfikuje utworzenie pliku PDF w określonej ścieżce, zapewniając prawidłowe działanie metody GeneratePdf.

AutoFixture C# (Jak to działa dla programistó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

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie