4.8 三角形测试用例
前来面试研发职位的同学大部分都觉得“测试”是一个很容易的事情,但是事实并非如此。测试和开发还是有些不一样的。打个比方,看到一杯半满的水,从乐观的角度看,会觉得——杯子一半都满了!而从悲观的角度来看——杯子还有一半是空的!测试工程师必须具备从各种角度看问题,找出可能缺陷的能力。当团队中别的同事欢呼“项目快要完成了”的时候,测试工程师必须能看到杯子里还有什么地方是空的。
我们举一个判定三角形的例子:输入三角形的三条边长,判断是否能构成一个三角形(不考虑退化三角形,即面积为零的三角形),是什么样的三角形(直角、锐角、钝角、等边、等腰)。
函数声明为:byte GetTriangleType(int,int,int)。
1.如何用一个byte来表示各种输出情况?
2.如果你是一名测试工程师,应该如何写测试用例呢?
分析与解法
【问题1的解法】
首先我们把需要考虑的状态可简单分为三角形和非三角形两种,其中三角形又包括直角、锐角、钝角、等边、等腰。题目要求用一个byte来表示各种输出结果,一个byte为8位bit,能够表示0~255,即一个byte可以表示256种状态,自然我们可以穷举所有可能的三角形状态,然后对其一一编号,如将非三角形编号为0、直角三角形编号为1、锐角三角形编号为2,依次类推。但考虑,一个直角三角形同时也可能是等腰三角形,一个等边三角形它同时也是锐角三角形,那么在上述编码的基础上,要想表述更精确的三角形状态,需要继续往后扩展编码。但这样的编码方式使得编码结果没有规律可循,容易造成记忆混淆。有没有更好的表达方式呢?我们可以考虑按标志位编码,将1个byte从右到左(或者从左到右)依次按位赋予含义,如表4-1,第0位表示等腰,第1位表示等边,等等。各位取1表示该状态为真,其中第7位表示该状态是否为三角形,是则为1,非三角形则为0。那么便可很方便地表示几种状态同时存在,如10010001则表示这是一个等腰直角三角形。剩余的第6位和第5位可以留作错误编码,比如用于表示两边之和大于第三边等,读者可自行设计,这里为了简单起见,所有的非三角形我们只将三角形标志位(第7位)设置为0,如表4-1所示。
表4-1
【问题2的解法】
可能很多读者会认为,具备初中数学常识的同学都能比较容易地写出算法。从测试的角度来看,貌似也不会太复杂吧?其实不然,作为一名测试者,要测试一个程序,具体的工作就是要分析程序可能出现的漏洞,并编制测试用例来有针对性地进行尝试,观察程序是否正常工作。通常测试可分为以下三个方面:程序在正常输入下的功能测试,测试程序在非法输入时的表现,测试程序对边界值附近输入的处理。对于“三角形判定”这道题目,测试用例看起来应该是这样的:
预期输入:a,b,c(三个数值,代表三条边的长度)。
预期输出:采用问题1中的编码输出,即非三角形或三角形的具体状态。
1.程序在正常输入下的功能测试,如表4-2所示:
表4-2
备注:需要交换三边长度顺序以确保对每条边的判断,如对用例1还需要测试(1,2,4)及(2,4,1)等5组用例(后面的用例应做相同的操作)。
2.测试程序在非法输入时的表现,如表4-3所示:
表4-3
3.测试程序对边界值附近输入的处理(假设1<=a,b,c<=100),如表4-4所示:
表4-4
提示:中间值通常应该确保能被正确处理,而边界值则往往因为判断语句使用<、>还是<=、>=而引起错误。
因为篇幅关系,以上表格中尚未包括换位枚举。对于一个简单的三角形判定问题,测试用例也远不止这20个。在真正严格的测试中,尤其是在自动化测试中,为了测试充分,这样的做法是有价值而且必要的。
在微软的笔试题里曾出现过不少类似的题目,很多人只能给出4~5个测试用例,事实上,只有给出15~20个测试用例才能得到较高的分数。
扩展问题
1.如果三角形的各个边长是浮点数,测试用例会有什么变化呢?
2.如果你负责测试文本编辑软件Word的“另存为……”(Save As…)的功能,你能写出多少有条理,有组织的测试用例?