LoginSignup
4
3

More than 3 years have passed since last update.

C# xUnit

Last updated at Posted at 2019-12-15

こういうのって実際のやつで試してみた方がいいんだろうけどとりあえず簡単なまとめ。
今回macでやっているのでxUnitを使っていきます。

まずはコンソールアプリのプロジェクトを作る。
スクリーンショット 2019-12-14 0.20.35.png

次にソリューションから追加で新しいプロジェクトを追加でxUnitを追加する。

スクリーンショット 2019-12-14 0.25.26.png

テストコード

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}

実行は右にある単体テストのところから行う。

スクリーンショット 2019-12-15 0.01.49.png

DisplayName

[Fact]にDisplayNameを加えると下の実行の所にDisplayNameが出てくる。

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}

実行結果 左下のところにDisplayNameで設定したものが出ている。

スクリーンショット 2019-12-15 1.07.00.png

Skip

[Fact]にSkipを加えるとそのテストはSkipされる。

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }

        [Fact(Skip = "無視する")]
        public void Test2()
        {
            Assert.True(true);
        }
    }
}

Timeout

[Fact]にTimeoutを設定してあげると時間の上限を定めることができる。

UnitTest1.cs
using System.Threading.Tasks;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }

        [Fact(Timeout = 3000)]
        public async Task Test2()
        {
            await Task.Delay(4000);
            Assert.True(true);
        }
    }
}

Theory

メソッド一つで複数回の実行も可能
下記例であれば、aに1,0,-1がそれぞれ代入され実行される。

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Theory]
        [InlineData(1)]
        [InlineData(0)]
        [InlineData(-1)]
        public void Test1(int a)
        {
            Assert.InRange(a, -2, 2);
        }
    }
}

以下Assertの使い方。

分からないものが結構あったので学んでいきたいところ...
最初のTrueだとか以外はABCの順番でやっていったので
後で同系統のものをまとめたい。

tureであるかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}

falseかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.False(false);
        }
    }
}

Listが空かどうか

UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Empty(new List<string>());
        }
    }
}

文字列の後ろにxxxが含まれているかどうか

引数1がxxxで引数2が対象の文字列

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.EndsWith("es", "studies");
        }
    }
}

AとBが同じかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Equal("aaa", "aaa");
        }
    }
}

範囲に入っているかどうか

第一引数が実際のやつ
第二引数が下限
第三引数が上限

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.InRange(3, 1, 4);
        }
    }
}

文字列もできるが使い道はないか。
下の例だとb,c,d,eが範囲となる

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.InRange("c", "b", "e");
        }
    }
}

型の一致確認

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            int a = 22;
            Assert.IsType(a.GetType(), 32);
        }
    }
}

型の不一致の確認

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            string a = "a";
            Assert.IsNotType(a.GetType(), 32);
        }
    }
}

正規表現とマッチしているかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Matches("[a-z]", "a");
        }
    }
}

リストが空ではないかどうか

UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotEmpty(new List<string>{ "apple"});
        }
    }
}

AとBが同じではないかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotEqual("aaa", "bbb");
        }
    }
}

範囲に入っていないかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotInRange(5, 1, 4);
        }
    }
}

Nullではないかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            int a = 1;
            Assert.NotNull(a);
        }
    }
}

同じではないかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotSame("a", "b");
        }
    }
}

Nullかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Null(null);
        }
    }
}

同じかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Same("aaa", "aaa");
        }
    }
}

要素が一つかどうか

UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Single(new List<int> {1});
        }
    }
}

最初の文字がxxxで始まるかどうか

UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.StartsWith("red", "redmine");
        }
    }
}
4
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
4
3