同じTestに複数のパラメータを渡してテスト実行する その2

もくじ

目次(WPF/xaml/C#/C++関連メモ) - tera1707’s blog

やりたいこと

以前、同じTestメソッドに複数のパラメータを渡してテスト実行する方法を調べた。

そこで使った[DataTestMethod][DataRow()]で、テストメソッドに好きなパラメータを渡して、同じコードでパラメータを切り替えてテストできたが、[DataRow()]には、固定の値(固定の文字列とかenumとか)しか渡せず、new MyClass(1)とかはエラーになり渡せない。

f:id:tera1707:20220201215049p:plain

パラメータに、固定値だけではなく計算結果とかなにかをnewしたやつとかを載せたい。

やりかた

[DynamicData()]を使う。

サンプル

実験に使うクラス。
OKNGクラスにboolを渡すと、内部のフラグにそのままbool値を保存するだけ。

また、そのOKNGクラスをnewして返すだけのMyClassと‘GetOKNG()‘メソッドを作った。

namespace UnitTestJikken
{
    public static class MyClass
    {
        public static OKNG GetOKNG(bool flag1) => flag1 ? new OKNG(true) : new OKNG(false);
    }

    public record OKNG
    {
        public OKNG(bool flag) { Flag = flag; }
        public bool Flag { get; set; } = false;
    }
}

TestMethodTest()でやってるテストと同じ内容を、DataTestMethodDynamicDataTest()でパラメータを同じテストメソッドに複数渡す形でやっている。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using UnitTestJikken;

namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethodTest()
        {
            OKNG ret = new OKNG(false);

            ret = MyClass.GetOKNG(true);
            Assert.AreEqual(new OKNG(true), ret);

            ret = MyClass.GetOKNG(false);
            Assert.AreEqual(new OKNG(false), ret);
        }

        private static IEnumerable<object[]> Args => new List<object[]>()
        {
            new object[] { true, new OKNG(true) },
            new object[] { false, new OKNG(false) },
        };

        [DataTestMethod]
        [DynamicData(nameof(Args))]
        public void DataTestMethodDynamicDataTest(bool flag, OKNG expect)
        {
            var ret = MyClass.GetOKNG(flag);
            Assert.AreEqual(expect, ret);
        }

        // これはエラーになる!
        //[DataTestMethod]
        //[DataRow(true, new OKNG(true))]
        //[DataRow(false, new OKNG(false))]
        //public void DataTestMethodTest(bool flag, bool expect)
        //{
        //    var ret = MyClass.GetOKNG(flag);
        //    Assert.AreEqual(expect, ret);
        //}
    }
}

実行結果

上記のUnitTestを実施すると、このように見える。

VisualStudio2022上

f:id:tera1707:20220201222354p:plain

vstest.console.exeから実施

f:id:tera1707:20220201222429p:plain

ちゃんと、DynamicDataに渡したプロパティの中身が、テスト結果に出てくれている。

参考

このページを参考にさせて頂きました。ありがとうございます。

qiita.com

docs.microsoft.com