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





5.00/5 (2投票s)
如何将 RelationAssert 定义为 VisualStudio Assert 类的扩展。
引言
本文详细介绍了如何扩展 Microsoft Visual Studio 单元测试框架提供的现有单元测试断言(请参阅 Assert
和 StringAssert
)。
我首先给出一些编写简洁和有表现力的断言的指导方针,然后探讨当前 Assert 类的局限性,最终提出关于如何克服这些局限性的建议。
编写有表现力的断言
可用的断言类包含一些用于断言特定条件的特定方法。应用断言的挑战在于,
- 调用适当的断言方法,报告期望值和实际值
- 提供有意义的断言消息
- 克服通过重复来自 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 元素太少 |
幕后
这个概念非常简单
- 定义一个 "ok" 字符串,例如
"(a > b)"
- 提供一个检查函数,如果检查通过则返回 "ok" 字符串,如果失败则返回实际值关系,例如
"(a > b)"
vs"(1 < 4)"
- 将检查的结果与 "ok" 字符串进行比较:
Assert.AreEqual(ok, check, ...)
此概念在随附的代码中针对关系断言的情况进行了实现。 可以按照 ExtAssert 中指示的方式扩展断言,以进行 NullOrEmpty 检查等。
如果您喜欢这篇文章,请对其进行评分。
欢迎任何评论,例如它是否有用或改进建议等。谢谢!
历史
- 版本 1.0:2012-01-29:初始版本。
- 版本 1.1:2012-03-11:添加了对评分和评论的请求。