严格捕获测试用例以进行单元测试
Posted
技术标签:
【中文标题】严格捕获测试用例以进行单元测试【英文标题】:Rigor in capturing test cases for unit testing 【发布时间】:2010-09-05 23:15:10 【问题描述】:假设我们有一个用伪语言定义的简单函数。
List<Numbers> SortNumbers(List<Numbers> unsorted, bool ascending);
我们传入一个未排序的数字列表和一个指定升序或降序排序的布尔值。作为回报,我们得到一个排序后的数字列表。
根据我的经验,有些人比其他人更擅长捕捉边界条件。问题是,“你怎么知道你什么时候'完成'了测试用例的捕获”?
我们现在可以开始列出案例了,一些聪明的人无疑会想到之前没有涵盖的“再一个”案例。
【问题讨论】:
使用简单的自包含方法,尝试通过 Pex 运行它。你可能会惊讶它能找到什么。 research.microsoft.com/en-us/projects/pex 【参考方案1】:不要浪费太多时间去考虑每个边界条件。您的测试将无法在第一时间捕获每一个错误。我们的想法是让测试非常好,然后每次出现确实的错误时,专门为该错误编写一个新测试,这样你就再也不会收到它的消息了.
我想对代码覆盖工具做另外一点说明。在诸如 C# 或 Java 之类的语言中,您有许多 get/set 和类似方法,您应该不追求 100% 的覆盖率。这意味着您浪费了太多时间为琐碎的代码编写测试。您只希望 100% 覆盖您的复杂业务逻辑。如果您的完整代码库覆盖率接近 70-80%,那么您做得很好。如果您的代码覆盖率工具允许多个覆盖率指标,那么最好的一个是“块覆盖率”,它测量“基本块”的覆盖率。其他类型是类和方法覆盖(不会给你太多信息)和行覆盖(太细了)。
【讨论】:
【参考方案2】:你怎么知道你什么时候“完成”了捕获测试用例?
你没有。除了最微不足道的情况外,你无法达到 100%。此外,100% 的覆盖率(线、路径、条件...)并不能告诉您您已经达到所有边界条件。
最重要的是,测试用例不是“一写即忘”。 每次发现错误时,编写一个额外的测试。检查原始程序是否失败,检查更正程序是否通过并将其添加到您的测试集。
Glenford J. Myers 摘自The Art of Software Testing:
-
如果输入条件指定了一个值范围,则为范围的末端编写测试用例,并为超出末端的情况编写无效输入测试用例。
如果输入条件指定了多个值,请为最小和最大数量的值以及低于和超出这些值的值编写测试用例。
对每个输出条件使用准则 1。
对每个输出条件使用准则 2。
如果程序的输入或输出是有序集合,则将注意力集中在集合的第一个和最后一个元素上。
另外,用你的聪明才智去寻找其他的边界条件
(出于版权原因,我只粘贴了最低限度的内容。)
以上第 3 点和第 4 点非常重要。人们倾向于忘记输出的边界条件。 5.没问题。 6. 真的没有帮助:-)
短期考试
这比看起来更难。 Myers 提供此测试:
程序从输入对话框中读取三个整数值。这三个值表示三角形边的长度。程序会显示一条消息,说明三角形是不等边三角形、等腰三角形还是等边三角形。
请记住,不等边三角形是没有两条边相等的三角形,而等腰三角形有两条相等的边,而等边三角形有三条等长的边。另外,等腰三角形等边的对边也相等(由此可知三角形等角的对边相等),等边三角形的所有内角都相等。
编写您的测试用例。你有多少? Myers 就您的测试集提出了 14 个问题,并报告说,高素质的专业课程平均 7.8 分(满分 14 分)。
【讨论】:
【参考方案3】:从实际的角度来看,我创建了一个我认为在接受之前必须通过的测试列表。我测试这些并尽可能自动化。根据我为任务估计的时间或给了我多少时间,我将测试范围扩大到包括在接受之前应该通过的项目。当然,必须和应该之间的界限是主观的。之后,我会在发现错误时更新自动化测试。
【讨论】:
【参考方案4】:@基思
我认为您做到了,如果您想了解自己的“完成”程度,代码覆盖率很重要,但我认为 100% 的目标有点不切实际。争取 75-90% 会为您提供相当好的覆盖率而不会过火……不要为了达到 100% 而进行测试,因为那时您只是在浪费时间。
【讨论】:
【参考方案5】:一个好的代码覆盖工具真的很有帮助。
100% 的覆盖率并不意味着它肯定经过充分测试,但它是一个很好的指标。
对于.Net NCover 相当不错,但不再开源。
@迈克·斯通- 是的,也许这应该是“高覆盖率”——我们的目标是最低 80%,超过 95% 通常是收益递减,特别是如果你有带“n”大括号的代码。
【讨论】:
以上是关于严格捕获测试用例以进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
如何编写测试用例以使用r中的testthat检查函数是否正常工作?