如何在MSTest中使用多个参数运行testing方法?
NUnit有一个名为Values的function,如下所示:
[Test] public void MyTest( [Values(1,2,3)] int x, [Values("A","B")] string s) { // ... }
这意味着testing方法将运行6次:
MyTest(1, "A") MyTest(1, "B") MyTest(2, "A") MyTest(2, "B") MyTest(3, "A") MyTest(3, "B")
我们现在正在使用MSTest,是否有这样的等价物,以便我可以使用多个参数运行相同的testing?
[TestMethod] public void Mytest() { // ... }
不幸的是在MSTest中不支持。 显然有一个可扩展性模型,你可以自己实现它 。 另一个select是使用数据驱动的testing 。
我个人的观点是坚持NUnit,但…
编辑:从Visual Studio 2012,更新1,MSTest具有类似的function。 见@麦卡登的答案在下面。
编辑4 :看起来像这样在MSTest V2 2016年6月17日完成: https ://blogs.msdn.microsoft.com/visualstudioalm/2016/06/17/taking-the-mstest-framework-forward-with-mstest- V2 /
原始答案 :
截至一周前,在Visual Studio 2012 Update 1中,现在可能有类似的情况:
[DataTestMethod] [DataRow(12,3,4)] [DataRow(12,2,6)] [DataRow(12,4,3)] public void DivideTest(int n, int d, int q) { Assert.AreEqual( q, n / d ); }
编辑 :这似乎只有在WinRT / Metro的unit testing项目中可用。 长号
编辑2 :以下是使用Visual Studio中的“转到定义”find的元数据:
#region Assembly Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll, v11.0.0.0 // C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration\neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll #endregion using System; namespace Microsoft.VisualStudio.TestPlatform.UnitTestFramework { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class DataTestMethodAttribute : TestMethodAttribute { public DataTestMethodAttribute(); public override TestResult[] Execute(ITestMethod testMethod); } }
编辑3 :这个问题是在Visual Studio的UserVoice论坛中提出的。 最后更新指出:
开始·Visual Studio团队pipe理员Visual Studio团队(产品团队,Microsoft Visual Studio)回应·2016年4月25日感谢您的反馈。 我们已经开始研究这个了。
Pratap Lakshman Visual Studio
由于没有人提到 – 与NUnit的Value
(或TestCase
)属性不完全相同,但MSTest具有DataSource
属性,它允许您执行类似的操作。 你可以把它连接到数据库或者XML文件 – 不像NUnit的特性那么简单,但是完成这个工作。
此function现已发布 ,可与VS 2015一起使用。
例如:
[TestClass] public class UnitTest1 { [DataTestMethod] [DataRow(1, 2, 2)] [DataRow(2, 3, 5)] [DataRow(3, 5, 8)] public void AdditionTest(int a, int b, int result) { Assert.AreEqual(result, a + b); } }
MSTest有一个强大的属性叫做DataSource ,使用它你可以按照你的要求执行数据驱动的testing。 您可以将testing数据以XML,CSV或数据库的forms存储。 这里有几个链接将引导你
http://visualstudiomagazine.com/articles/2009/09/15/unit-testing-with-vsts2008-part-3.aspx http://msdn.microsoft.com/en-us/library/ms182527.aspx
http://msdn.microsoft.com/en-us/library/ms243192.aspx
希望这会帮助你。
当然,还有另外一种方法可以做到这一点,在这个线程中没有讨论过,也就是通过inheritance包含TestMethod的类。 在以下示例中,只定义了一个TestMethod,但已经创build了两个testing用例。
在Visual Studio 2012中,它在TestExplorer中创build两个testing:
- DemoTest_B10_A5.test
-
DemoTest_A12_B4.test
public class Demo { int a, b; public Demo(int _a, int _b) { this.a = _a; this.b = _b; } public int Sum() { return this.a + this.b; } } public abstract class DemoTestBase { Demo objUnderTest; int expectedSum; public DemoTestBase(int _a, int _b, int _expectedSum) { objUnderTest = new Demo(_a, _b); this.expectedSum = _expectedSum; } [TestMethod] public void test() { Assert.AreEqual(this.expectedSum, this.objUnderTest.Sum()); } } [TestClass] public class DemoTest_A12_B4 : DemoTestBase { public DemoTest_A12_B4() : base(12, 4, 16) { } } public abstract class DemoTest_B10_Base : DemoTestBase { public DemoTest_B10_Base(int _a) : base(_a, 10, _a + 10) { } } [TestClass] public class DemoTest_B10_A5 : DemoTest_B10_Base { public DemoTest_B10_A5() : base(5) { } }
MsTest不支持该function,但您可以实现自己的属性来实现这一点。 看看下面的内容:
http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html
这是非常简单的实现 – 你应该使用TestContext
属性和TestPropertyAttribute
。
例
public TestContext TestContext { get; set; } private List<string> GetProperties() { return TestContext.Properties .Cast<KeyValuePair<string, object>>() .Where(_ => _.Key.StartsWith("par")) .Select(_ => _.Value as string) .ToList(); } //usage [TestMethod] [TestProperty("par1", "http://getbootstrap.com/components/")] [TestProperty("par2", "http://www.wsj.com/europe")] public void SomeTest() { var pars = GetProperties(); //... }
我无法让DataRowAttribute
在Visual Studio 2015中工作,这是我最终的结果:
[TestClass] public class Tests { private Foo _toTest; [TestInitialize] public void Setup() { this._toTest = new Foo(); } [TestMethod] public void ATest() { this.Perform_ATest(1, 1, 2); this.Setup(); this.Perform_ATest(100, 200, 300); this.Setup(); this.Perform_ATest(817001, 212, 817213); this.Setup(); } private void Perform_ATest(int a, int b, int expected) { //Obviously this would be way more complex... Assert.IsTrue(this._toTest.Add(a,b) == expected); } } public class Foo { public int Add(int a, int b) { return a + b; } }
这里真正的解决scheme是只使用NUnit(除非像在这个特定的实例中一样被困在MSTest中)。
您可以像这里一样实施数据驱动的testing。 我不知道在NUnit中是否有这样一种舒适的方式。