65.9K
CodeProject 正在变化。 阅读更多。
Home

RelationAssert 作为单元测试 Assert 类的扩展

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2012年1月30日

CPOL

3分钟阅读

viewsIcon

22188

downloadIcon

176

如何将 RelationAssert 定义为 VisualStudio Assert 类的扩展。

引言

本文详细介绍了如何扩展 Microsoft Visual Studio 单元测试框架提供的现有单元测试断言(请参阅 AssertStringAssert)。

我首先给出一些编写简洁和有表现力的断言的指导方针,然后探讨当前 Assert 类的局限性,最终提出关于如何克服这些局限性的建议。

编写有表现力的断言

可用的断言类包含一些用于断言特定条件的特定方法。应用断言的挑战在于,

  1. 调用适当的断言方法,报告期望值和实际值
  2. 提供有意义的断言消息
  3. 克服通过重复来自 1. 的值来格式化消息的诱惑

项目 1. 确保简洁和有意义的断言,项目 2. 使潜在的附加代码注释冗余,项目 3. 没有重新发明轮子。

例如,应重写以下断言

// ensure that the list of xxx contains 6 elements
if (list.Count != 6)
{
    Assert.Fail("Error: list.Count = {0}", list.Count);
}
结果消息 Assert.Fail 失败。 错误:list.Count = 0

第一次尝试替换 if

// ensure that the list of xxx contains 6 elements
Assert.IsTrue(list.Count == 6, "Error: list.Count = {0}", list.Count);
结果消息 Assert.IsTrue 失败。 错误:list.Count = 0

下一次尝试使用适当的 Assert 方法

// ensure that the list of xxx contains 6 elements
Assert.AreEqual(6, list.Count, "Error: list.Count = {0}", list.Count);
结果消息 Assert.AreEqual 失败。 期望值:<6>。 实际值:<0>。 错误:list.Count = 0

最后一次尝试使注释和消息格式冗余

Assert.AreEqual(6, list.Count, "wrong number of xxx");
结果消息 Assert.AreEqual 失败。 期望值:<6>。 实际值:<0>。 错误的 xxx 数量

这个最后的断言是想要的:使用适当的方法来报告值,一条简洁的非格式化消息,没有无用的注释。 保持简单!

缺失的 Assert 方法

那么,如何断言以下内容

  • list.Count > 4

没有像 Assert.Greater(...) 这样的函数。 我们最接近上述指导方针的是 Assert.IsTrue(...)。 例如

Assert.IsTrue(list.Count > 4, "too little xxx elements");
结果消息 Assert.IsTrue 失败。 xxx 元素太少

没有关于期望值和实际值的字眼,也没有关于应用的检查类型的字眼...

那么,是否要退回到注释和格式化消息? 例如(不是我的建议)

// check that the list contains at least one element
Assert.IsTrue(list.Count > 4, "xxx list has only {0} elements instead of more than 4 elements", list.Count);
结果消息 Assert.IsTrue 失败。 xxx 列表只有 1 个元素,而不是 4 个以上的元素

建议的解决方案

随附的代码提供了一个 ExtAssert 类,该类提供了四个缺失的函数

public static void Greater<T>(T a, T b, string message, params object[] args) where T : IComparable<T>
public static void GreaterOrEqual<T>(T a, T b, string message, params object[] args) where T : IComparable<T>
public static void LessOrEqual<T>(T a, T b, string message, params object[] args) where T : IComparable<T>
public static void Less<T>(T a, T b, string message, params object[] args) where T : IComparable<T>

有了这些,您可以根据指导方针重写关系断言

ExtAssert.Greater(list.Count, 4, "too little xxx elements");
结果消息 Assert.AreEqual 失败。 期望值:<(a > b)>。 实际值:<(1 < 4)>。 xxx 元素太少

幕后

这个概念非常简单

  1. 定义一个 "ok" 字符串,例如 "(a > b)"
  2. 提供一个检查函数,如果检查通过则返回 "ok" 字符串,如果失败则返回实际值关系,例如 "(a > b)" vs "(1 < 4)"
  3. 将检查的结果与 "ok" 字符串进行比较:Assert.AreEqual(ok, check, ...)

此概念在随附的代码中针对关系断言的情况进行了实现。 可以按照 ExtAssert 中指示的方式扩展断言,以进行 NullOrEmpty 检查等。

如果您喜欢这篇文章,请对其进行评分。

欢迎任何评论,例如它是否有用或改进建议等。谢谢!

历史

  • 版本 1.0:2012-01-29:初始版本。
  • 版本 1.1:2012-03-11:添加了对评分和评论的请求。
© . All rights reserved.