もくじ
目次(WPF/xaml/C#/C++関連メモ) - tera1707’s blog
やりたいこと
以前、同じTestメソッドに複数のパラメータを渡してテスト実行する方法を調べた。
そこで使った[DataTestMethod]
と[DataRow()]
で、テストメソッドに好きなパラメータを渡して、同じコードでパラメータを切り替えてテストできたが、[DataRow()]
には、固定の値(固定の文字列とかenumとか)しか渡せず、new MyClass(1)
とかはエラーになり渡せない。
パラメータに、固定値だけではなく計算結果とかなにかを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上
vstest.console.exeから実施
ちゃんと、DynamicDataに渡したプロパティの中身が、テスト結果に出てくれている。
参考
このページを参考にさせて頂きました。ありがとうございます。