如何在MSTest中运行具有多个参数的测试方法?

The*_*ght 129 c# nunit unit-testing mstest vs-unit-testing-framework

NUnit有一个名为Values的功能,如下所示:

[Test]
public void MyTest(
    [Values(1,2,3)] int x,
    [Values("A","B")] string s)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这意味着测试方法将运行6次:

MyTest(1, "A")
MyTest(1, "B")
MyTest(2, "A")
MyTest(2, "B")
MyTest(3, "A")
MyTest(3, "B")
Run Code Online (Sandbox Code Playgroud)

我们现在正在使用MSTest,是否有任何相同的功能,以便我可以使用多个参数运行相同的测试?

[TestMethod]
public void Mytest()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

McA*_*den 147

编辑4:看起来这是在2016年6月17日的MSTest V2中完成的: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 );
}
Run Code Online (Sandbox Code Playgroud)

编辑:看来这只适用于WinRT/Metro的单元测试项目.长号

编辑2:以下是使用Visual Studio中的"转到定义"找到的元数据:

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑3:这个问题是在Visual Studio的UserVoice论坛中提出的.最后更新说明:

已启动·Visual Studio Team ADMIN Visual Studio团队(产品团队,Microsoft Visual Studio)已回复·2016年4月25日感谢您的反馈.我们已经开始研究这个问题.

Pratap Lakshman Visual Studio

https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/3865310-allow-use-of-datatestmethod-datarow-in-all-unit

  • 我有更新1但DataTestMethod和DataRow无法识别,哪些库是这些属性? (8认同)
  • 我去了我的计算机上的文件路径"C:\ Program Files(x86)\ Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration \neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll"那个文件就在那里.所以我在我的基本单元测试项目中引用了它.在JustDecompile中打开dll表明该库只引用了mscorlib,System和System.Core.它不是Windows Store项目. (5认同)
  • 现在支持Windows Phone,Visual Studio 2012 Update 2(目前为CTP 4) (4认同)
  • 有没有关于DataTestMethod的官方消息来源?它的名称空间是什么,哪个程序集? (3认同)
  • 我发现UnitTestFramework.dll已经安装在我的计算机上,在手动引用它之后,我能够使用[DataTestMethod]属性编写一个带有数据行的方法,但我无法在Visual Studio 2012.3中找到测试资源管理器来查找方法. (2认同)

jer*_*enh 44

遗憾的是,MSTest不支持.显然有一个可扩展性模型,您可以自己实现它.另一种选择是使用数据驱动的测试.

我个人的意见是坚持使用NUnit ......

编辑:从Visual Studio 2012,更新1,MSTest有类似的功能.请参阅@ McAden的答案如下.

  • 我在下面给出了一个示例和我的博客文章链接的答案.它提到了必要的属性以及属性上的"DisplayName"属性,用于区分测试资源管理器中的案例.它也在十月份的CTP公告中提到(现已正式发布)http://blogs.msdn.com/b/visualstudioalm/archive/2012/10/26/final-ctp-for-visual-studio -2012-update-1.aspx我已经将信息添加到这个SO问题,因为我花了很多时间寻找它.希望这会节省一些时间. (6认同)
  • 我发现在Visual Studio 2012 Update 1中现在可以实现类似的功能,仅供参考,以供将来考虑此答案的任何人使用. (4认同)

Pom*_*air 27

此功能现已预发布,可与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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。请注意,使用 [DataRow] 时不必说 [DataTestMethod] (/sf/answers/4141368241/) (3认同)
  • 这是正确答案,必须采纳!真的很适合我!谢谢! (2认同)

k.m*_*k.m 10

由于没有人提到 - 与NUnit的Value(或TestCase)属性不完全相同,但MSTest具有DataSource属性,它允许你做类似的事情.您可以将其连接到数据库或XML文件 - 这不像NUnit的功能那么简单,但可以完成工作.


Pri*_*kar 7

MSTest有一个名为DataSource的强大属性,使用它可以按照你的要求执行数据驱动测试.您可以将测试数据包含在XML,CSV或数据库中.以下是一些指导您的链接

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

希望这会帮助你.


And*_*kin 5

实现非常简单-您应该使用TestContextproperty和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();
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法有效,但不会为每组参数创建单独的测试用例。 (2认同)

Bra*_*don 5

我无法让 TheDataRowAttribute在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里真正的解决方案是仅使用 NUnit(除非您像我在这个特定实例中一样陷入 MSTest)。

  • 您应该将每个测试调用拆分为一个单独的测试,以便在其中一个测试失败时节省时间。(我们都知道这会发生) (4认同)