はじめに
本記事は、VS CodeでxUnitを使って単体テストを行う手順です。
目次
手順
1. ソリューションを作成する
-
フォルダを作成して開く
-
ソリューションを作成する
dotnet new sln
2. コンソールアプリのプロジェクトを作成して、ソリューションに追加する
-
コンソールアプリを作成する
dotnet new console -o app -
作成したアプリをソリューションに追加する
dotnet sln add .\app\app.csproj
3. テストプロジェクトを作成して、ソリューションに追加する
-
テストを作成する
dotnet new xunit -o test -
作成したテストをソリューションに追加する
dotnet sln add .\test\test.csproj
4. プロジェクト参照を追加する
-
テストプロジェクトにアプリへの参照を追加する
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. 単体テストを実行する
-
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の[テスト]ビューの上部にある「出力を表示」アイコンをクリックする。
- パネルのテスト結果に出力結果が表示される。