如何使用MSTest进行RowTest?

时间:2008-12-07 12:38:55

标签: unit-testing mstest data-driven-tests rowtest

我知道MSTest不支持RowTest和类似的测试。

MSTests个用户做了什么?如果没有RowTest支持,怎么可能生活?

我见过DataDriven测试功能,但听起来有太大的开销,是否有任何第三方补丁或工具允许我在RowTest进行MSTest次类似测试?

6 个答案:

答案 0 :(得分:38)

[TestMethod]
Test1Row1
{
    Test1(1,4,5);
}

[TestMethod]
Test1Row2
{
    Test1(1,7,8);
}

private Test1(int i, int j, int k)
{
   //all code and assertions in here
}

答案 1 :(得分:7)

我知道这是一个迟到的答案,但希望它可以帮助其他人。

我到处寻找一个优雅的解决方案,最后自己写了一个。我们在20多个项目中使用它,进行了数千次单元测试和数十万次迭代。从来没有错过任何一个节拍。

https://github.com/Thwaitesy/MSTestHacks

1)安装NuGet包。

2)从TestBase

继承您的测试类
public class UnitTest1 : TestBase
{ }

3)创建一个返回IEnumerable的属性,字段或方法

public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, get a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

4)将MSTest DataSource属性添加到测试方法,指向上面的IEnumerable名称。这需要完全合格。

[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

结束结果: 3次迭代就像普通的DataSource一样:)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    public class UnitTest1 : TestBase
    {
        private IEnumerable<int> Stuff
        {
            get
            {
                //This could do anything, get a dynamic list from anywhere....
                return new List<int> { 1, 2, 3 };
            }
        }

        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}

答案 2 :(得分:6)

我们在VS2012 Update1中添加了对DataRow的支持。 See this blog for a breif introduction

在VS2012 Update1中,此功能目前仅限于Windows应用商店。在以后的版本中,它不受此限制。

答案 3 :(得分:2)

在我的团队被锁定使用MS Test框架时,我们开发了一种技术,它只依赖于匿名类型来保存测试数据数组,并且LINQ循环并测试每一行。它不需要额外的类或框架,并且往往相当容易阅读和理解。它比使用外部文件或连接数据库的数据驱动测试更容易实现。

例如,假设您有这样的扩展方法:

public static class Extensions
{
    /// <summary>
    /// Get the Qtr with optional offset to add or subtract quarters
    /// </summary>
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
    {
        return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
    }
}

你可以使用和匿名类型的数组组合到LINQ来编写这样的测试:

[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
    // Arrange
    var values = new[] {
        new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
        new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
        // Could add as many rows as you want, or extract to a private method that
        // builds the array of data
    }; 
    values.ToList().ForEach(val => 
    { 
        // Act 
        int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
        // Assert 
        Assert.AreEqual(val.expectedQuarter, actualQuarter, 
            "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
        }); 
    }
}

使用此技术时,使用包含Assert中输入数据的格式化消息有助于您确定哪一行导致测试失败。

我在AgileCoder.net了解了有关此解决方案的更多背景和详细信息。

答案 4 :(得分:0)

与DaTest类似(自2008年以来未更新)使用PostSharp的解决方案在博客http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html中进行了描述

答案 5 :(得分:0)

我通过生成具有不同数量的生成测试方法的测试类代码来解决此问题。您只需下载2个文件并将其包含在项目中即可 然后在测试代码中对具有所需行数的类进行子类化,并实现2个抽象方法:

[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;
    }
}

更多详情:

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