65

NUnit 支持一项功能,您可以在其中指定一组数据输入,以便多次运行单元测试。

[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
   ...
}

使用 MSTest 完成相同类型的事情的最佳方法是什么?我找不到类似的属性集。

4

6 回答 6

83

对于那些使用 MSTest2 的人,DataRow + DataTestMethod 可以做到这一点:

[DataRow(Enum.Item1, "Name1", 123)]
[DataRow(Enum.Item2, "Name2", 123)]
[DataRow(Enum.Item3, "Name3", 456)]
[DataTestMethod]
public void FooTest(EnumType item, string name, string number)
{
    var response = ExecuteYourCode(item, name, number);

    Assert.AreEqual(item, response.item);
}

更多关于它在这里

于 2018-01-19T18:30:37.570 回答
21

会有帮助吗?

本周我在一个由 TFS 管理的项目中添加了一些单元测试,所以我决定使用 VS2008 提供的“核心”单元测试框架,不幸的是它不支持 RowTests。但它有一个类似的功能,称为数据驱动单元测试。使用这种方法,实现“简单”的 RowTest 场景会稍微复杂一些,但它也允许实现更复杂的场景。

于 2010-03-02T21:54:34.457 回答
10

您可以通过编写 mstest 的小扩展来获得此功能,如下所示。

http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx

于 2012-02-21T10:39:17.133 回答
1

我的回答与@oscar-e-fraxedas-tormo 类似。
您可以从其中具有 1 到 100 个测试方法的生成类之一进行子类化,并在派生类中提供所有测试逻辑。在下面的示例中:

[TestClass]
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string>
{
    public override void TestMethod(string dataRow, int rowNumber)
    {
        Console.WriteLine(dataRow);
        Assert.IsFalse(dataRow.Contains("3"));
    }

    public override string GetNextDataRow(int rowNumber)
    {
        return "data" + rowNumber;
    }
}

该类Ha_ha_ha_Test将包含42生成的行(方法)。对于此行中的每一行,GetNextDataRow将调用自定义方法以提供所需的测试数据。

更多细节:

https://github.com/dzhariy/mstest-rows

于 2013-09-05T00:19:00.667 回答
1

实际上,参数化单元测试(PUT)是单元测试的自然概括。Microsoft Research 有一个名为 Pex 的项目,它将自动为您的被测类 (CUT) 生成 PUT。Pex 是一个自动测试输入生成工具。Pex 工具不是自己准备测试数据,而是为 CUT 的参数找到感兴趣的输入,并相应地生成单元测试用例。请在此处查看

于 2013-12-13T08:35:25.430 回答
-3

您可以使用测试方法和参数作为虚拟属性创建基类。当您从此类继承时,您只需要使用所需的值覆盖属性。请看示例代码:

public class Operation
{
    public static int Add(int x, int y)
    {
        return x + y;
    }
}

[TestClass]
public class AddTests : WorkItemTest
{
    protected virtual int First{get { return 0; }}
    protected virtual int Second{get { return 0; }}

    [TestInitialize]
    public virtual void Init()
    {
        //Init code
    }

    [TestCleanup]
    public virtual void Clean()
    {
        //Clean code
    }

    [TestMethod]
    [Description("x+y = y+x")]
    public virtual void Test_operation_commutativity()
    {
        Assert.AreEqual(Operation.Add(Second, First), Operation.Add(First, Second));
    }
}

[TestClass]
public class AddPositiveTest : AddTests
{
    protected override int First { get { return 1; } }
    protected override int Second { get { return 2; } }
}

[TestClass]
public class AddNegativeTest : AddTests
{
    protected override int First { get { return -1; } }
    protected override int Second { get { return -2; } }
}
于 2013-02-25T21:21:18.947 回答