NUnitで遊んでみた

基本的な書き方

[Test]
public void Test()
{
    Assert.That(1, Is.EqualTo(1));
}

カスタム制約

Is.EqualTo はNUnit標準で用意されている制約ですが、独自の制約を作成する事ができます。

public class CustomConstraint : Constraint
{
    public CustomConstraint(object expected)
    {
    }

    public override ConstraintResult ApplyTo<TActual>(TActual actual)
    {
        return new ConstraintResult(this, actual, ReferenceEquals(actual, Arguments[0]));
    }
}

public class Is : NUnit.Framework.Is
{
    public static CustomConstraint Custom(object expected)
    {
        return new CustomConstraint(expected);
    }
}

NUnitのIsにCustomという拡張メソッドを追加できました。

Assert.That(1, Is.Custom(1));

NUnitのExpressionの拡張メソッドも可能です。

public static class CustomConstraintExtensions
{
    public static CustomConstraint Custom(this ConstraintExpression expression, object expected)
    {
        var constraint = new CustomConstraint(expected);
        expression.Append(constraint);
        return constraint;
    }
}
Assert.That(1, Is.All.Custom(1));

SetUpをテストケース毎に共通化

JUnitではEnclosedと同じような事がしたい場合は以下でできます。

public class Test
{
    [SetUp]
    public virtual void Setup()
    {
        Console.WriteLine("Test SetUp");
    }

    public class Test1 : Test
    {
        [Test]
        public void Test()
        {
            Console.WriteLine("Test1 Test");
        }
    }

    public class Test2 : Test
    {
        [SetUp]
        public override void Setup()
        {
            Console.WriteLine("Test2 SetUp");
        }

        [Test]
        public void Test()
        {
            Console.WriteLine("Test2 Test");
        }
    }
}

TestFixture

クラスにTestFixture属性をつけると、ユニットテストが記述されているとクラスと認識されます。
パラメーター化されていないTestFixture属性はオプションで、Test、TestCase、または TestCaseSource属性が少なくとも1つ含まれていれば、 ユニットテストが記述されているとクラスと認識されます。

こんな感じで使えるみたいです。

[TestFixture(1.0, 2)]
[TestFixture(3, 4.0)]
[TestFixture(5)]
public class DeduceTypeArgsFromArgs<T1, T2>
{
    private readonly T1 t1;
    private readonly T2 t2;

    public DeduceTypeArgsFromArgs(T1 t1) : this(t1, default(T2)) { }

    public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
    {
        this.t1 = t1;
        this.t2 = t2;
    }

    [TestCase(5, 7)]
    public void TestMyArgTypes(T1 t1, T2 t2)
    {
        Assert.That(t1, Is.TypeOf<T1>());
        Assert.That(t2, Is.TypeOf<T2>());
    }
}

assume

public class Test
{
    [Test]
    public void AssumeTest1()
    {
        Assume.That(1, Is.EqualTo(1), "message");
        Assert.Fail("この行は実行される");
    }

    [Test]
    public void AssumeTest()
    {
        Assume.That(1, Is.EqualTo(2), "message");
        Assert.Fail("この行は実行されない");
    }
}

パラメータのクラス化

Parameterクラスを1つのオブジェクトにまとめたい場合、TestCaseSource属性を使用すると実現可能です。

public class Test
{
    [TestCaseSource(typeof(ParameterFactory), "Parameters")]
    public void TestMyArgTypes(Parameter param)
    {
        Assert.That(1, Is.EqualTo(1));
    }
}

public class ParameterFactory
{
    public static List<Parameter> Parameters()
    {
        return new List<Parameter>()
    {
      new Parameter { Value = 1 },
      new Parameter { Value = 2 },
    };
    }
}

public class Parameter
{
    public int Value { get; set; }
}

参考

https://www.automatetheplanet.com/nunit-cheat-sheet/

未分類C#

Posted by ababa