.NET ヘルプ

AutoFixture C# (開発者のための仕組み)

公開済み 2024年8月13日
共有:

オートフィクスチャーのオープンソースライブラリである。.NETこれは、単体テスト作成における「手配」フェーズを最小化し、テスト管理を改善することを目的としている。 その主な目的は、テストデータでオブジェクトグラフを作成できるようにすることで、開発者がセットアッププロセスではなく、テスト内容に集中できるようにすることである。 この記事では、効率的なテスト・データ生成によってテスト駆動開発を促進するために、AutoFixture をどのように使用できるかを説明します。

イントロダクション

AutoFixture は、ユニットテストのテストデータを作成するプロセスを効率化するために設計された C# の強力なライブラリです。 テストケースのデータを自動的に生成することで、開発者が繰り返しセットアップコードを書く必要がなくなる。 ユニット・テストにおいて、AutoFixture はテスト・データを生成するための合理化されたアプローチを提供し、各ユニット・テストが多様で現実的な入力で実行されることを保証します。 AutoFixture は、テスト・データを自動的に生成することで、C# におけるテストをより効率的にし、手作業によるセットアップの必要性を減らします。

AutoFixture C#(開発者のための仕組み):図1 - オートフィクスチャ

AutoFixtureのインストールと設定

AutoFixtureはNuGetパッケージとして提供されており、インストールすることができます。 これは、NuGet Package Manager Consoleまたは.NET add package Visual StudioのNuGet Package Manager UIを使用して行うことができます。

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

NuGet は、最新バージョンの AutoFixture とその依存関係をダウンロードしてプロジェクトにインストールします。

クラスのテスト・データの作成例

FirstName、LastName、Ageのようなプロパティを持つ単純な従業員フィクスチャのインスタンスクラスがあるとします。 ユニット・テストでこの新しいフィクスチャ・クラスのインスタンスを手動で作成する代わりに、AutoFixtureを活用してランダムなデータを生成することができます。

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#

コードの説明

さて、Employee クラスは、それぞれ FirstName、LastName、Age というプロパティで表される姓、名、年齢など、従業員の重要な詳細をカプセル化します。 コンストラクタは、これらの詳細をパラメータとして受け取り、対応するプロパティに代入することで、従業員オブジェクトのインスタンス化を容易にする。 さらに、GetFullNameメソッドは、従業員の姓と名を連結し、フルネームを文字列として返します。

テストシナリオのコードを設定する

次に、テスト用のコードを作成する:

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#

コードの説明

このコード・スニペットは、Employee クラスのユニット・テストに AutoFixture を組み込んでいます。 名前空間 AutoFixture をインポートすることで、開発者はデータ生成機能にアクセスできます。 コンストラクタの Fixture 新規インスタンスで初期化された _fixture フィールドにより、テスト・データの作成が効率化されます。 この設定は、包括的な従業員クラスのカバレッジのためのテスト効率と信頼性を向上させます。

例 1: 従業員テストケースのオブジェクト値の検証

[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#

コードの説明

Employee_ShouldHaveValidValues テストメソッドは、Employee クラスが提供された値でプロパティを正しく初期化することを検証します。 テストフィクスチャを使用して、姓、名、年齢のランダムデータを生成し、Employee インスタンスを作成します。 次に、Employee オブジェクトの FirstName、LastName、および Age プロパティが生成された値と一致することを確認し、コンストラクタがこれらのプロパティを正確に設定することを保証します。

例 2: コンストラクタ呼び出し時の Employee の検証

[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#

コードの説明

このテスト・コード・スニペットには、Employee オブジェクトのプロパティがランダムに生成された値と一致するかどうかを検証するテスト・アサーションが含まれています。 これは、文字列 FirstName、文字列 LastName、および int Age プロパティの文字列型プロパティが、firstName、lastName、および age 変数に割り当てられたランダムに生成された値と一致しているかどうかを検証します。 失敗したアサーションは、従業員の詳細によって生成される期待値とランダム値の不一致を示す。

オートフィクスチャ C#(開発者のための仕組み):図 2 - 有効な従業員データ・ユニットテスト

IronPDFの紹介

IronPDF C# PDFライブラリは、Iron Softwareによって開発された堅牢なC# PDFライブラリです。PDFテキストの読み込みおよびHTMLを使用したPDFドキュメントの作成. この汎用性の高いツールは、スタイル情報を含む簡単なフォーマットのドキュメントを高品質のPDFに変換することができます。 IronPDFで、HTMLからPDFを生成するテキストはシームレスなプロセスで、ユーザーはURLからHTMLコンテンツを取り出し、構造化されたPDFファイルに変換することができます。 この機能により、IronPDFはウェブコンテンツから直接プロフェッショナルなPDFドキュメントを自動化、合理化する開発者にとって不可欠なツールとなります。

オートフィクスチャ C#(開発者のための仕組み):図3 - IronPDF

IronPDFのインストール

NuGet Package Managerコンソールを開き、以下のコマンドを実行してください:

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

AutoFixtureの機能をIronPDFで使用したコード例

まず、社員を生成するメソッドを含む EmployeePdfGenerator クラスを作成します。

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#

オートフィクスチャ C#(開発者のための仕組み):図4 - IronPDF出力によるオートフィクスチャ

コードの説明

提供されたC#コードはIronPDFライブラリを利用して従業員とその年齢をリストしたPDFドキュメントを生成します。 EmployeePdfGeneratorクラスを定義し、Employeeオブジェクトのリストとファイルパスを受け取るGeneratePdfメソッドを含んでいます。 内部的には、GenerateHtmlメソッドを通してHTMLコンテンツを構築し、IronPDFのHtmlToPdfクラスを使ってこのHTMLをPDFとしてレンダリングし、指定されたファイルパスに保存します。 HTML生成のためのStringBuilderの使用や、PDF生成とファイル保存のための基本的なエラー処理の追加などが強化されました。

試験方法の作成

以下のセットアップでは、Employee クラスのインスタンスを作成するために AutoFixture が利用され、テスト用にランダムなデータを生成することができます。 IronPDFは従業員情報を含むHTMLコンテンツをシームレスにPDFフォーマットに変換します。 EmployeePdfGeneratorクラスは、これらのプロセスをオーケストレーションし、データ生成とPDF変換の両方を効率的に管理します。 一方、EmployeePdfGeneratorTests XUnitテストクラスは、厳格なテストを通じてPDF生成の適切な機能を保証します。 この統合されたアプローチにより、従業員データの生成と文書化が簡素化され、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#

EmployeePdfGeneratorTestsクラスは、ファイルパス上でPDFを検証したEmployeeクラスのテストケースを含んでいます。

AutoFixture C#(開発者のための仕組み):図5 - オートフィクスチャ C#

結論

AutoFixtureは、.NETで単体テストを書く「アレンジ」フェーズを簡素化し、開発者が複雑なセットアップよりもテストケースに集中できる手段を提供します。 ユニットテストのプロセスを合理化し、テストデータを自動的に生成することで、多様で現実的な入力を保証します。 と連携している。IronPDFライセンス情報継続的な使用とサポートのために。

< 以前
HttpListener C# (開発者のための仕組み)
次へ >
Entity Framework Core (開発者のための仕組み)