严格捕获用于单元测试的测试用例

时间:2020-03-05 18:39:56  来源:igfitidea点击:

假设我们有一个用伪语言定义的简单函数。

List<Numbers> SortNumbers(List<Numbers> unsorted, bool ascending);

我们传入一个未排序的数字列表和一个布尔值,指定升序或者降序排序。作为回报,我们得到一个排序的数字列表。

以我的经验,有些人比其他人更擅长捕捉边界条件。问题是,"如何知道何时'完成'捕获测试用例"?

我们现在就可以开始列出案例,毫无疑问,一些聪明的人会想到以前的案例所没有涵盖的"另一个"案例。

解决方案

回答

不要浪费太多时间试图考虑每个边界条件。测试将无法在第一时间捕获每个错误。这个想法是要进行非常好的测试,然后每次出现错误时,都专门为该错误编写一个新的测试,这样我们就永远不会再听到它了。

我想对代码覆盖率工具做个补充说明。在像Cor Java这样的语言中,我们拥有许多get / set和类似的方法,因此我们不应该争取100%的覆盖率。这意味着我们浪费了太多时间来编写琐碎的代码测试。我们只希望100%覆盖复杂的业务逻辑。如果完整代码库覆盖率接近70-80%,则说明我们做得很好。如果代码覆盖率工具允许多个覆盖率指标,那么最好的一种就是"块覆盖率",它衡量"基本块"的覆盖率。其他类型是类和方法覆盖率(不会给我们太多信息)和行覆盖率(太细粒度)。

回答

一个好的代码覆盖率工具确实会有所帮助。

100%的覆盖率并不意味着它肯定经过了充分的测试,但这是一个很好的指标。

对于.Net NCover来说,它相当不错,但是不再是开源的。

@迈克·斯通
是的,也许应该是"高覆盖率",我们的目标是使最低覆盖率达到80%,超过约95%,通常这会使收益递减,特别是如果我们使用大括号符号。

回答

@基思

我想我们已经明白了,代码覆盖率对于查看自己的"完成情况"很重要,但是我认为100%的目标有点不切实际。争取75-90%的覆盖率会给我们带来不错的回报,而又不会过于冒险...不要仅仅为了达到100%而进行测试,因为那时候我们只是在浪费时间。

回答

How do you know when you are 'done' capturing test cases?

不会,除非是最琐碎的情况,否则无法达到100%。同样,100%的覆盖率(线,路径,条件...)并不表示我们已经达到所有边界条件。

最重要的是,测试用例不是一劳永逸的。每次发现错误时,都要编写一个添加测试。检查原始程序是否失败,检查更正的程序是否通过,然后将其添加到测试集中。

摘自Glenford J. Myers撰写的《软件测试的艺术》:

  • 如果输入条件指定了一个值范围,请为该范围的末尾编写测试用例,为超出范围的末尾编写无效的输入测试用例。
  • 如果输入条件指定了多个值,请编写测试用例,以测试最小和最大数量的值,以及低于和超过这些值的一个。
  • 对每种输出条件使用准则1.
  • 对于每个输出条件,请使用准则2.
  • 如果程序的输入或者输出是有序集合,则将注意力集中在集合的第一个和最后一个元素上。
  • 此外,请发挥独创性来搜索其他边界条件

(出于版权原因,我仅粘贴了最低限度的内容。)

上面的第3点和第4点非常重要。人们往往会忘记输出的边界条件。 5.可以。 6.真的无济于事:-)

短期考试

这比看起来要困难。 Myers提供了此测试:

The program reads three integer values from an input dialog. The three values represent the lengths of the sides of a triangle. The program displays a message that states whether the triangle is scalene, isosceles, or equilateral.
  
  Remember that a scalene triangle is one where no two sides are equal, whereas an isosceles triangle has two equal sides, and an equilateral triangle has three sides of equal length. Moreover, the angles opposite the equal sides in an isosceles triangle also are equal (it also follows that the sides opposite equal angles in a triangle are equal), and all angles in an equilateral triangle are equal.

编写测试用例。你有多少?迈尔斯(Myers)提出了关于测试集的14个问题,并报告说,高素质的专业课程平均有7.8个考试是可能的(14个)。

回答

从实际的角度出发,我创建了一个我认为必须在接受之前通过的测试的列表。我对它们进行测试,并在可能的情况下使其自动化。根据我为任务估计的时间或者获得的时间,我扩展了测试范围,以包括在接受之前应该通过的项目。当然,必须与应该之间的界限是主观的。之后,我会在发现错误后更新自动化测试。