2

如何参数化 C# 单元测试,以便测试不是一系列类似的断言语句,而是遍历参数列表(包括预期值)并将结果与​​预期值进行比较?

用例:

  • 这个特定的单元测试需要检查一个 XML 文档并检查一个 XML 元素名称列表,验证文档是否包含这些元素并且它们的值是否符合预期

测试方法的断言部分由一系列断言组成,如下所示:

var width = output.Element(namespace + "width");
Assert.IsNotNull(width);
Assert.AreEqual(width.Value, "600");

我想避免冗余代码,而是用不同的值迭代相同的代码。如何在断言检查中定义要迭代的数据结构?

所需的数据结构是元组列表(在这种情况下包含类型(XName,字符串)的元素)。如何在 C# 中表达它?是否有一些标准的单元测试工具可以在这里提供帮助?

更多信息:

  • 使用 Visual Studio 单元测试框架 (Microsoft.VisualStudio.TestTools.UnitTesting) 和 .Net 3.5
  • 不需要使用各种参数值运行用例本身,只需要它的断言部分(上面引用的代码)
4

3 回答 3

2

Nunit 有一个叫做 TestCases 的东西,你可以通过一个属性访问它。这听起来像你要求的东西:

http://nunit.org/?p=testCase&r=2.5

更新:

此答案是在指定正在使用的框架的问题更新之前提供的

更新

这个问题看起来也有相关性:MS Test Equivalent (or lack of)

MSTest 是否与 NUnit 的 TestCase 等效?

于 2013-03-11T16:50:05.600 回答
1

似乎您只需要提取一种方法即可满足您的文字要求:

public void AssertElementExistsWithValue(XmlElement parent, string nameSpace, string childName, string value)
{
    var child = parent.Element(namespace + childName);
    Assert.IsNotNull(child);
    Assert.AreEqual(child.Value, "600");    
}

我通常使用 Linq Xml 类,所以如果我有编译错误,我深表歉意。你会明白要点的,我敢肯定。

当我测试xml格式时,我通常会写两个测试。第一个是往返测试:将实体写入 xml,读回,断言它们是相同的。这是一个很好的面向值的测试,如果您更改元素的名称,它不会中断。

我编写的第二个测试是准确地固定 XML 格式的测试。我从格式正确的对象中获取 xml,并将其用作测试中的常量,并断言创建了正确的对象。由于实现细节原因,该测试失败,但没关系。如果我破坏了与数据格式的向后兼容性,它会迫使我注意。

于 2013-03-12T03:05:05.133 回答
0

既然您说您正在使用 mstest,这里有一些来自MSDN独立博客的资源,这些资源说明了使用 Microsoft 的单元测试框架进行数据驱动测试。

总之,您需要DataSource在您的中指定一个属性TestMethod并将其指向数据源。它可以是 CSV 或 SQL Server CE。

于 2013-03-11T16:57:41.720 回答