【问题标题】:C# Unit Testing: iterating through expected results listC# 单元测试:遍历预期结果列表
【发布时间】:2013-03-11 16:47:53
【问题描述】:

如何对 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
  • 不需要使用各种参数值运行用例本身,只需要它的断言部分(上面引用的代码)

【问题讨论】:

  • 你使用什么单元测试库?
  • 向问题添加了信息重新单元测试框架。它是 Visual Studio 测试框架。
  • 更新了问题:添加了用例描述;添加了关于 .Net 3.5 的信息。 -- 似乎在 .Net 4.0 中,答案是使用元组列表并遍历它。

标签: c# unit-testing data-structures


【解决方案1】:

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

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

更新:

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

更新

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

Does MSTest have an equivalent to NUnit's TestCase?

【讨论】:

  • MSTest 中似乎有一些对数据驱动测试的支持,我提到了一些资源来证明这一点。
  • 在调用要测试的方法之后,我需要遍历断言检查代码的片段。如果需要重新运行整个测试用例,TestCase 属性会很有帮助,但在这种情况下不会。
  • 感谢您的回答。我对原始问题进行了澄清,解释说只有断言部分需要迭代——如果您对如何进一步澄清问题有任何建议,请告诉我
【解决方案2】:

您似乎只需要提取一个方法来满足您的文字要求:

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,并将其用作测试中的常量,并断言创建了正确的对象。由于实现细节原因,该测试失败,但没关系。如果我破坏了与数据格式的向后兼容性,它会迫使我注意。

【讨论】:

  • 谢谢 - 将断言代码提取到另一个函数使解决方案更加清晰。 -- 但它并没有解决主要问题,即如何定义元素名称和预期值列表以进行迭代。通过定义 Dictionary 并修改 AssertElements* 函数以遍历此字典来解决此问题。
【解决方案3】:

既然您说您使用的是 mstest,这里有几个来自 MSDNindependent blog 的资源,它们说明了使用 Microsoft 的单元测试框架进行数据驱动测试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多