Ir para o conteúdo do rodapé
AJUDA DO .NET

AutoFixture em C# (Como funciona para desenvolvedores)

AutoFixture é uma biblioteca de código aberto para .NET que visa minimizar a fase de "preparação" na escrita de testes unitários, melhorando assim o gerenciamento de testes. Seu principal objetivo é permitir que os desenvolvedores se concentrem no que estão testando, em vez do processo de configuração, permitindo a criação de grafos de objetos com dados de teste. Este artigo explora como o AutoFixture pode ser usado para facilitar o desenvolvimento orientado a testes por meio da geração eficiente de dados de teste.

AutoFixture é uma biblioteca poderosa em C# projetada para simplificar o processo de criação de dados de teste para testes unitários. Isso ajuda os desenvolvedores a evitar a escrita de código de configuração repetitivo, gerando automaticamente dados para casos de teste. Em testes unitários, o AutoFixture oferece uma abordagem simplificada para a geração de dados de teste, garantindo que cada teste unitário seja executado com entradas variadas e realistas. O AutoFixture torna os testes em C# mais eficientes, gerando dados de teste automaticamente e reduzindo a necessidade de configuração manual.

AutoFixture C# (Como funciona para desenvolvedores): Figura 1 - AutoFixture

Instalação e configuração do AutoFixture

O AutoFixture está disponível como um pacote NuGet e pode ser instalado usando o Console do Gerenciador de Pacotes NuGet ou a opção "Adicionar pacote" do .NET na interface do Gerenciador de Pacotes NuGet do Visual Studio.

Install-Package AutoFixture

O NuGet fará o download e instalará a versão mais recente do AutoFixture e suas dependências em seu projeto.

Exemplo: Criando dados de teste para uma turma

Suponha que temos uma classe de funcionário simples com propriedades como FirstName, LastName e Age. Em vez de criarmos manualmente instâncias dessa classe em nossos testes unitários, podemos usar o AutoFixture para gerar dados aleatórios para nós.

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

Descrição do Código

A classe Employee encapsula detalhes essenciais de um funcionário, incluindo seu nome, sobrenome e idade, representados pelas propriedades FirstName, LastName e Age, respectivamente. Seu construtor facilita a instanciação de um objeto funcionário, aceitando esses detalhes como parâmetros e atribuindo-os às propriedades correspondentes. Além disso, o método GetFullName concatena o primeiro e o último nome do funcionário, retornando o nome completo como uma string.

Configurando o código para nosso cenário de teste

Em seguida, criaremos uma classe de teste para testar a classe 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

Descrição do Código

Este trecho de código incorpora o AutoFixture em testes unitários para a classe Employee. Ao importar o namespace AutoFixture, os desenvolvedores acessam a funcionalidade de geração de dados. O campo _fixture, inicializado com uma nova instância de Fixture, simplifica a criação de dados de teste. Essa configuração aprimora a eficiência e a confiabilidade dos testes para uma cobertura abrangente da classe Employee.

Exemplo 1: Validação dos valores do objeto de caso de teste do funcionário

[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

Descrição do Código

O método de teste Employee_ShouldHaveValidValues valida se a classe Employee inicializa corretamente suas propriedades com os valores fornecidos. Usando um conjunto de testes para gerar dados aleatórios para FirstName, LastName e Age, o teste cria uma instância de Employee. Em seguida, afirma que as propriedades FirstName, LastName e Age do objeto Employee correspondem aos valores gerados, garantindo que o construtor defina essas propriedades com precisão.

Exemplo 2: Validação do funcionário quando o construtor é invocado

[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

Descrição do Código

Este método de teste inclui asserções de teste que validam se as propriedades de um objeto Employee correspondem a valores gerados aleatoriamente. Verifica se as propriedades do tipo string, FirstName, LastName, e int Age estão configuradas corretamente e são válidas. Qualquer falha nas asserções indica uma discrepância entre os valores esperados e os valores aleatórios gerados para os dados dos funcionários.

AutoFixture C# (Como funciona para desenvolvedores): Figura 2 - Teste unitário de dados válidos de funcionários

Apresentando o IronPDF

IronPDF C# PDF Library é uma biblioteca robusta em C# desenvolvida pela Iron Software que facilita a leitura de texto em PDF e a criação de documentos PDF usando HTML . Esta ferramenta versátil permite a conversão de documentos fáceis de formatar, incluindo informações de estilo, em PDFs de alta qualidade. Com o IronPDF, gerar PDFs a partir de texto HTML é um processo simples, permitindo que os usuários extraiam conteúdo HTML de URLs e o transformem em arquivos PDF bem estruturados. Essa funcionalidade torna o IronPDF uma ferramenta essencial para desenvolvedores que buscam automatizar e agilizar a criação de documentos PDF profissionais diretamente a partir de conteúdo da web.

AutoFixture C# (Como funciona para desenvolvedores): Figura 3 - IronPDF

Instalando o IronPDF

Abra o console do Gerenciador de Pacotes NuGet e execute o seguinte comando:

Install-Package IronPdf

Exemplo de código usando os recursos do AutoFixture com o IronPDF

Abaixo, segue um exemplo que demonstra o uso do AutoFixture em conjunto com o IronPDF para gerar um PDF com dados de funcionários:

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

Para usar esta classe, você instanciaria EmployeePdfGenerator, geraria uma lista de funcionários e, em seguida, chamaria 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# (Como funciona para desenvolvedores): Figura 4 - Autofixture com saída IronPDF

Descrição do Código

O código C# fornecido utiliza a biblioteca IronPDF para gerar um documento PDF listando os funcionários e suas idades. Define uma classe EmployeePdfGenerator que inclui o método GeneratePdf, que recebe uma lista de objetos Employee e um caminho de arquivo. Internamente, ele constrói o conteúdo HTML através do método GenerateHtml e, em seguida, usa a classe HtmlToPdf do IronPDF para renderizar esse HTML como um PDF, salvo no caminho de arquivo especificado. As melhorias incluem o uso de StringBuilder para geração de HTML e a adição de tratamento básico de erros para geração de PDF e salvamento de arquivos.

Como escrever um método de teste

Na configuração abaixo, o AutoFixture é utilizado para criar instâncias da classe Employee, permitindo a geração de dados aleatórios para teste. O IronPDF é utilizado para converter, de forma integrada, conteúdo HTML, incluindo informações de funcionários, em formato PDF. A classe EmployeePdfGenerator orquestra esses processos, gerenciando de forma eficiente tanto a geração de dados quanto a conversão para PDF. Entretanto, a classe de teste XUnit EmployeePdfGeneratorTests garante o funcionamento adequado da geração de PDF por meio de testes rigorosos. Essa abordagem integrada simplifica a geração e a documentação de dados de funcionários, garantindo robustez e confiabilidade no processo de geração de PDFs.

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

Aqui, a classe EmployeePdfGeneratorTests contém um caso de teste que valida a criação de um arquivo PDF no caminho de arquivo especificado, garantindo que o método GeneratePdf funcione corretamente.

AutoFixture C# (Como funciona para desenvolvedores): Figura 5 - AutoFixture C#

Conclusão

O AutoFixture simplifica a fase de "Organização" da escrita de testes unitários em .NET, oferecendo aos desenvolvedores uma maneira de se concentrarem nos casos de teste em vez das complexidades da configuração. Simplifica o processo de teste de unidade, garantindo entradas variadas e realistas através da geração automática de dados de teste. Em conjunto com as informações de licenciamento do IronPDF , oferece uma combinação poderosa para uso contínuo e suporte.

Perguntas frequentes

Como posso gerar dados de teste em C# usando o AutoFixture?

Você pode usar o AutoFixture para gerar dados de teste em C# utilizando sua classe 'Fixture'. Essa classe permite criar automaticamente instâncias de classes com dados aleatórios, que podem ser usadas para configurar diversos cenários de teste de forma eficiente.

Quais são os passos para instalar o AutoFixture em um projeto .NET?

Para instalar o AutoFixture em um projeto .NET, você pode usar o Console do Gerenciador de Pacotes NuGet com o comando Install-Package AutoFixture . Ele também está disponível na interface do Gerenciador de Pacotes NuGet do Visual Studio, onde você pode pesquisar por AutoFixture e adicioná-lo ao seu projeto.

Como o AutoFixture melhora o processo de teste de unidade?

O AutoFixture aprimora o processo de teste de unidade, gerando automaticamente dados de teste realistas e diversificados. Isso reduz a necessidade de configuração manual e garante que os testes sejam realizados com uma ampla gama de entradas, melhorando a cobertura e a confiabilidade dos testes.

É possível integrar o AutoFixture com bibliotecas de geração de PDF no .NET?

Sim, o AutoFixture pode ser integrado a bibliotecas de geração de PDF como o IronPDF no .NET. Ao usar o AutoFixture para gerar dados, você pode criar PDFs que contenham conteúdo dinâmico, como dados de funcionários, aproveitando os recursos do IronPDF para converter HTML em PDF.

Qual é a finalidade da classe 'Fixture' no AutoFixture?

A classe 'Fixture' do AutoFixture foi projetada para simplificar a configuração de testes, criando dados de teste automaticamente. Ela gera instâncias de classes com dados aleatórios, permitindo que os desenvolvedores se concentrem mais em testar a lógica em vez de configurar os dados manualmente.

Como o AutoFixture facilita o Desenvolvimento Orientado a Testes (TDD)?

O AutoFixture auxilia o Desenvolvimento Orientado a Testes (TDD) ao fornecer uma maneira fácil de gerar dados de teste, permitindo que os desenvolvedores escrevam testes e implementem funcionalidades sem gastar muito tempo com a configuração de dados. Isso agiliza o processo de TDD, tornando-o mais eficiente.

Como posso automatizar a criação de documentos em C# usando as bibliotecas AutoFixture e PDF?

Você pode automatizar a criação de documentos em C# combinando o AutoFixture com uma biblioteca PDF como o IronPDF. O AutoFixture pode gerar os dados necessários para o documento, e o IronPDF pode converter esses dados, formatados em HTML, em um documento PDF de forma eficiente.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim