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完成同类型事物的最佳方法是什么?我找不到类似的属性集。
答案 0 :(得分:19)
this会有帮助吗?
本周我增加了一些单元测试 到由TFS管理的项目, 所以我决定使用“核心”单位 测试框架可用 VS2008,不幸的是它没有 支持RowTests。但它有类似的 称为数据驱动单元测试的功能。 通过这种方法,它会更多一些 复杂化实施“简单” RowTest场景,但它也允许 实现更复杂的。
答案 1 :(得分:18)
对于那些使用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);
}
有关它的更多信息here
答案 2 :(得分:9)
您可以通过编写mstest的小扩展来实现此功能,如此处所示。
答案 3 :(得分:1)
实际上,参数化单元测试(PUT)是单元测试的自然概括。微软研究院有一个名为Pex的项目,它将自动为你的被测试类(CUT)生成PUT。 Pex是自动测试输入生成工具。 Pex工具不会自行准备测试数据,而是为CUT的参数找到感兴趣的输入,并相应地生成单元测试用例。请检查here。
答案 4 :(得分:0)
我对@ 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
以提供所需的测试数据。
答案 5 :(得分:-2)
您可以使用测试方法创建基类,并将参数创建为虚拟属性。 从此类继承时,只需使用所需的值覆盖属性。 请参阅示例代码:
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; } }
}