AIDE .NET

AutoFixture C# (Comment ça marche pour les développeurs)

Publié août 13, 2024
Partager:

AutoFixture est une bibliothèque open-source pour.NET vise à minimiser la phase "Arrangement" de l'écriture des tests unitaires, améliorant ainsi la gestion des tests. Son principal objectif est de permettre aux développeurs de se concentrer sur ce qu'ils testent, plutôt que sur le processus de configuration, en leur permettant de créer des graphiques d'objets avec des données de test. Cet article explore comment AutoFixture peut être utilisé pour faciliter le développement piloté par les tests grâce à une génération efficace des données de test.

Introduction

AutoFixture est une puissante bibliothèque en C# conçue pour rationaliser le processus de création de données de test pour les tests unitaires. Il aide les développeurs à éviter d'écrire du code de configuration répétitif en générant automatiquement des données pour les cas de test. Dans les tests unitaires, AutoFixture fournit une approche rationalisée pour générer des données de test, garantissant que chaque test unitaire est exécuté avec des données d'entrée variées et réalistes. AutoFixture rend les tests en C# plus efficaces en générant automatiquement des données de test, réduisant ainsi la nécessité d'une configuration manuelle.

AutoFixture C#(Comment ça marche pour les développeurs) : Figure 1 - AutoFixture

Installation et configuration d'AutoFixture

AutoFixture est disponible sous la forme d'un package NuGet et peut être installé. Cette opération peut être effectuée à l'aide de la console NuGet Package Manager ou de l'interface utilisateur NuGet Package Manager de Visual Studio pour les paquets d'ajout .NET.

Install-Package AutoFixture
Install-Package AutoFixture
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

NuGet téléchargera et installera la dernière version d'AutoFixture et ses dépendances dans votre projet.

Exemple de création de données de test pour une classe

Supposons que nous ayons une classe d'instance de fixation d'employé simple avec des propriétés telles que FirstName, LastName et Age. Au lieu de créer manuellement des instances de cette nouvelle classe de fixation dans nos tests unitaires, nous pouvons utiliser AutoFixture pour générer des données aléatoires pour nous.

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}";
  }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Description du code

Maintenant, la classe Employé encapsule les détails essentiels d'un employé, y compris son prénom, son nom et son âge, représentés par les propriétés Prénom, Nom et Âge respectivement. Son constructeur facilite l'instanciation d'un objet salarié en acceptant ces détails en tant que paramètres et en les assignant aux propriétés correspondantes. En outre, la méthode GetFullName concatène le prénom et le nom de famille de l'employé et renvoie le nom complet sous forme de chaîne de caractères.

Mise en place du code pour notre scénario de test

Ensuite, nous allons créer le code à tester :

using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Description du code

Cet extrait de code intègre AutoFixture dans les tests unitaires de la classe Employee. En important l'espace de noms AutoFixture, les développeurs accèdent à la fonctionnalité de génération de données. Le champ _fixture initialisé avec une nouvelle instance Fixture dans le constructeur, rationalise la création des données de test. Cette configuration améliore l'efficacité et la fiabilité des tests pour une couverture complète de la classe Salarié.

Exemple 1 : Validation des valeurs de l'objet du cas de test du salarié

[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);
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Description du code

La méthode de test Employee_ShouldHaveValidValues valide le fait que la classe Employee initialise correctement ses propriétés avec les valeurs fournies. En utilisant un dispositif de test pour générer des données aléatoires pour le prénom, le nom et l'âge, le test crée une instance d'employé. Il affirme ensuite que les propriétés FirstName, LastName et Age de l'objet Employee correspondent aux valeurs générées, en s'assurant que le constructeur définit ces propriétés avec précision.

Exemple 2 : Validation de l'employé lors de l'invocation du constructeur

[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);
        }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Description du code

Cet extrait de code de test comprend des assertions de test qui vérifient si les propriétés d'un objet Employee correspondent à des valeurs générées de manière aléatoire. Il vérifie si les propriétés de type chaîne de caractères (string FirstName, string LastName et int Age) correspondent aux valeurs générées aléatoirement et attribuées aux variables firstName, lastName et age. Les assertions qui échouent signalent une inadéquation entre les valeurs attendues et les valeurs aléatoires générées par les données relatives aux salariés.

AutoFixture C#(Comment ça marche pour les développeurs) : Figure 2 - Test unitaire sur les données valides des employés

Présentation d'IronPDF

IronPDF C# PDF Library (Bibliothèque PDF C#) est une bibliothèque PDF C# robuste développée par Iron Software qui facilite l'utilisation des outils de développement .NET, Java, Python ou Node jadelecture d'un texte PDF et lecréation de documents PDF à l'aide de HTML. Cet outil polyvalent permet de convertir des documents faciles à formater, avec des informations de style, en PDF de haute qualité. Avec IronPDF,générer des PDF à partir de HTML le processus de traduction du texte HTML est transparent et permet aux utilisateurs d'extraire le contenu HTML des URL et de le transformer en fichiers PDF bien structurés. Cette capacité fait d'IronPDF un outil essentiel pour les développeurs qui cherchent à automatiser et à rationaliser la création de documents PDF professionnels directement à partir de contenus web.

AutoFixture C#(Comment ça marche pour les développeurs) : Figure 3 - IronPDF

Installation d'IronPDF

Ouvrez la console NuGet Package Manager et exécutez la commande suivante :

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

Exemple de code utilisant les fonctionnalités d'AutoFixture avec IronPdf

Nous allons d'abord créer une classe EmployeePdfGenerator qui contient la méthode de génération des employés.

using DemoAutofixture;
List<Employee> employees = new List<Employee>()
{
    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");
Console.WriteLine("PDF Created Successfully!");
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);
        }
        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;
List<Employee> employees = new List<Employee>()
{
    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");
Console.WriteLine("PDF Created Successfully!");
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);
        }
        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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

AutoFixture C#(Comment ça marche pour les développeurs) : Figure 4 - Autofixture avec sortie IronPDF

Description du code

Le code C# fourni utilise la bibliothèque IronPDF pour générer un document PDF contenant la liste des employés et leur âge. Il définit une classe EmployeePdfGenerator et contient la méthode GeneratePdf, qui prend une liste d'objets Employee et un chemin d'accès au fichier. En interne, il construit le contenu HTML à l'aide de la méthode GenerateHtml, puis utilise la classe HtmlToPdf d'IronPDF pour rendre ce HTML sous la forme d'un PDF, enregistré dans le chemin d'accès au fichier spécifié. Les améliorations comprennent l'utilisation de StringBuilder pour la génération HTML et l'ajout d'une gestion de base des erreurs pour la génération PDF et l'enregistrement des fichiers.

Rédaction d'une méthode de test

Dans la configuration ci-dessous, AutoFixture est utilisé pour créer des instances de la classe Employee, ce qui permet de générer des données aléatoires pour les tests. IronPDF est utilisé pour convertir de manière transparente le contenu HTML, y compris les informations sur les employés, au format PDF. La classe EmployeePdfGenerator orchestre ces processus, en gérant efficacement la génération des données et la conversion au format PDF. Par ailleurs, la classe de test XUnit EmployeePdfGeneratorTests garantit le bon fonctionnement de la génération de PDF grâce à des tests rigoureux. Cette approche intégrée simplifie la génération et la documentation des données relatives aux employés, tout en garantissant la robustesse et la fiabilité du processus de génération des PDF.

using System;
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;
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
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
VB   C#

Ici, la classe EmployeePdfGeneratorTests contient des cas de test pour la classe Employee qui a validé le PDF sur le chemin du fichier.

AutoFixture C#(Comment ça marche pour les développeurs) : Figure 5 - AutoFixture C#

Conclusion

AutoFixture simplifie la phase "Arrange" de l'écriture des tests unitaires en .NET, offrant aux développeurs un moyen de se concentrer sur les cas de test plutôt que sur les subtilités de l'installation. Il rationalise le processus de test unitaire en garantissant des entrées variées et réalistes grâce à la génération automatique de données de test. En collaboration avecInformations sur les licences IronPDF pour une utilisation et un soutien continus.

< PRÉCÉDENT
HttpListener C# (Comment ça marche pour les développeurs)
SUIVANT >
Entity Framework Core (Comment ça marche pour les développeurs)