1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VS CodeでxUnitを使って単体テストを行う

Last updated at Posted at 2025-10-21

はじめに

本記事は、VS CodeでxUnitを使って単体テストを行う手順です。

目次

手順

1. ソリューションを作成する

  1. フォルダを作成して開く

  2. ソリューションを作成する

    dotnet new sln
    

2. コンソールアプリのプロジェクトを作成して、ソリューションに追加する

  1. コンソールアプリを作成する

    dotnet new console -o app
    
  2. 作成したアプリをソリューションに追加する

    dotnet sln add .\app\app.csproj
    

3. テストプロジェクトを作成して、ソリューションに追加する

  1. テストを作成する

    dotnet new xunit -o test
    
  2. 作成したテストをソリューションに追加する

    dotnet sln add .\test\test.csproj
    

4. プロジェクト参照を追加する

  1. テストプロジェクトにアプリへの参照を追加する

    dotnet add .\test\test.csproj reference .\app\app.csproj
    

5. 単体テストを書く

コンソールアプリの例

Program.cs

using System;
namespace Sample
{
    public class App
    {
        public static void Main(string[] args)
        {
            
        }

        // 単体テストの対象となるメソッド
        public int Calc(int a, int b)
        {
            return a + b;
        }
    }
}

テストコードの例

UnitTest1.cs

using Xunit.Abstractions;
namespace test;

public class UnitTest1 : IDisposable
{
    private Sample.App app;
    private ITestOutputHelper outputHelper;

    // コンストラクタがsetupに相当する
    public UnitTest1(ITestOutputHelper _o)
    {
        this.app = new Sample.App();
        this.outputHelper = _o;
    }

    // Disposeがteardownに相当する
    public void Dispose()
    {
    }

    // [Fact]属性
    // 引数なしのテストメソッドを実行する
    [Fact]
    public void TestFact()
    {
        var actual = app.Calc(5, 6);
        Assert.Equal(11, actual);
    }

    // [Theory]属性
    // 引数を指定してテストメソッドを実行する
    // 引数は複数のパターンを指定できる
    [Theory]
    [InlineData(5, 6, 11)]
    [InlineData(1, 3, 4)]
    public void TestTheory(int x, int y, int expected)
    {
        var actual = app.Calc(x, y);
        Assert.Equal(expected, actual);
    }

    [Fact]
    public void TestOutputLog()
    {
        // ITestOutputHelperでログ出力する
        this.outputHelper.WriteLine("hogehogehugahufa");
    }
}

6. 単体テストを実行する

  1. dotnet testコマンドでテスト実行する

初期処理

  • コンストラクタが初期処理、Disposeメソッドが終了処理となる。
  • 初期処理と終了処理は各テストメソッド毎に実行される。

属性

Fact

  • 引数なしのテストメソッドを実行する

    [Fact]
    public void TestFact()
    {
        var actual = app.Calc(5, 6);
        Assert.Equal(11, actual);
    }
    

Theory

  • 引数を指定してテストメソッドを実行する。
  • 引数は複数のパターンを指定できる。

InlineData

  • [Theory]属性と一緒に使用する。

  • テストメソッドの引数に渡す値を直接指定する。

    [Theory]
    [InlineData(5, 6, 11)]
    public void TestTheory(int x, int y, int expected)
    {
        var actual = app.Calc(x, y);
        Assert.Equal(expected, actual);
    }
    

MemberData

  • [Theory]属性と一緒に使用する。

  • テストメソッドの引数に渡す値に、配列やリストのデータを指定する。

    [Theory]
    [MemberData(nameof(GetMemberData))]
    public void TestMemberData(int x, int y, int expected)
    {
        var actual = app.Calc(x, y);
        Assert.Equal(expected, actual);
    }
    
    public static IEnumerable<object[]> GetMemberData()
    {
        yield return new object[] { 3, 4, 7 };
        yield return new object[] { 2, 2, 4 };
    }
    

ClassData

  • [Theory]属性と一緒に使用する。

  • テストメソッドの引数に渡す値に、外部クラスで定義したデータを指定する。

    [Theory]
    [ClassData(typeof(SampleClassData))]
    public void TestClassData(int x, int y, int expected)
    {
        var actual = app.Calc(x, y);
        Assert.Equal(expected, actual);
    }
    
    #SampleClassData.cs
    
    using System.Collections;
    namespace test;
    
    public class SampleClassData : IEnumerable<object[]>
    {
        public IEnumerator<object[]> GetEnumerator()
        {
            yield return new object[] { 5, 2, 7 };
            yield return new object[] { -8, 7, -1 };
        }
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
    

Skip

  • [Fact]属性や[Theory]属性で使用する。

  • [Skip]を記述したテストを実行せずにスキップする。

    [Fact(Skip="仕様変更のためskipする")]
    public void TestFact()
    {
        var actual = app.Calc(5, 6);
        Assert.Equal(11, actual);
    }
    

ログ出力

  • ITestOutputHelperでログ出力する。

  • コンストラクタでロガーを受け取って、メソッドで使用する。

        private ITestOutputHelper outputHelper;
    
        public UnitTest1(ITestOutputHelper _o)
        {
            this.outputHelper = _o;
        }
    
        [Fact]
        public void TestOutputLog()
        {
            this.outputHelper.WriteLine("hogehogehugahufa");
        }
    

ITestOutputHelperの出力結果が表示されない場合

  • VS Codeの[テスト]ビューの上部にある「出力を表示」アイコンをクリックする。
  • パネルのテスト結果に出力結果が表示される。
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?