1、边界值测试的难点
关于边界值测试核心内容(或者说是难点),笔者以为,我们主要需要注意以下4点:
1)如何选择输入域或输出域,以便顺利推进后续的边界值测试用例设计;
2)如何确定输入域或输出域的边界,以便确保所有测试对象的边界值都被覆盖到;
3)如何确定输入域或输出域边界附近的邻域范围,以便我们及时发现边界潜在的问题;
4)如何根据被测对象的边界及其邻域,去设计更为合理和严谨的测试用例。
2、如何确定输入域?
一般情况下,原始输入域通常是由多个输入条件共同构成的,并具有一定实际意义。我们也称之为整体输入域。整体输入域的边界通常很清晰,我们很容易去展开测试。这时,你可能想问:既然如此,确定输入域不是非常简单吗?
还真并非如此。输入域之所以不好确定,是边界点太少,难以覆盖所有隐含边界情况造成的。尤其是当各个输入条件之间,存在较为复杂的约束关系时,此时的输入域将更难确定。
因此,在确定输入域时,我们可将整体输入域拆分成由各个输入条件,分别构成的单个输入域,从而找出这些输入域的集合(以下称,个体输入域)。
3、如何确定边界值?
通过上述描述,我们基本能找出所有个体输入域来。那么,我们如何通过这些个体输入域,从而确定他们的边界呢?下面我们一起来看看。
对于某个输入条件而言,确定边界可参照如下原则:
1)若输入条件规定了取值范围,则以该范围作为边界;2)若输入条件规定了值的个数,则以值的个数为边界;3)若输入域是有序集合(如有序表、顺序文件等),则选取集合中特定次序的数据作为边界,如第一个或最后一个数据等。
在实际工作中,当我们针对某个输入条件,去确定边界点时,我们可以这样去思考:
1)首先,我们可以在需求描述中,寻找最大极限边界。比如:最低XX,最高XX;最多XX,最少XX;等等。像这类凡是可用数值来描述的,无论在SRS中是否明确指出其边界,其极限边界条件已经是固定的了。
所以,你可以根据其变量的特点,找到对应的取值范围。比如,C++中int型变量的取值范围是:−32768~32767,当SRS中未明确规定输入条件的边界时,该取值范围就是其极限边界。
2)其次,我们还可以在需求描述中,寻找其他较为明显的边界。这些边界点的特征比较明确,主要是:当在该点附近一个极小的邻域内分别取小于、等于和大于该点的3个值时,被测对象对这些值的处理方式不完全相同,则该点就是导致被测对象的输出发生本质变化的边界点。
简单点说,就是在输入某个条件的边界时,不仅包含最小值点和最大值点,还可能存在其他非极值性质的边界点。这个问题,我们要留意一下。
3)另外,我们还需要关注软件内部的边界点,或者说是次边界条件或内部边界条件。比如,2的乘方、ASCII字符表等。值得注意的是,测试新手(或者终端的客户)是很难发现这些边界问题的。但如果因为我们是新手,找不到问题就认为没有问题,这就是“埋下隐患”的开始。当然,这也激励着我们努力学习专业知识,努力成长为专业测测试达人。
总之,边界点的确认,既可以针对整体输入域进行,也可通过个体输入域来寻找。两种方法是都可行的。但这些都需要遵循一个原则——独立性假设原则。即当针对某个输入条件确定边界点时,不考虑其他输入条件可能对该输入条件所产生的任何影响。这样,我们的边界值将覆盖的更为全面。
4、如何设置边界点附近的邻域?
我们都知道,一般情况下,边界点及其附近,都可能存在bug。因此,在测试时,我们需要在边界点附近确定大小为1的领域,并应基于所有边界点及其邻域来设计测试用例。(注:这里的“1”是指1个单位长度,并非数字意义上的“1”。邻域应根据测试分析的结果,灵活设置。)
5、如何设计测试用例?
通过上述4条,相信大家都知道如何去寻找测试对象的边界值了。当我们找出所有的边界点集合及其邻域后,我们只需要在这些边界和邻域中,选择适当规模的数据进行测试即可。
那么,我们应该如何选择测试数据、如何选择边界组合方式,来保证测试用例的质量呢?下面,我们来给大家介绍一下。
1)测试数据的选择
主要包括两种方法。一个是穷举法,一个是典型值法。相信大家根据名字也不难理解其中的意思。这里就不赘述了,想了解的小伙伴可自行询问度娘。
2)边界组合方式的选择
主要包括3种方式:强边界法、弱边界法和全边界法。其中,
-
强边界法要求每个测试用例都对应多个输入条件,同时取边界测试数据;
-
弱边界法则是基于单缺陷假设提出来的,即被测对象只要在某个输入条件的某个边界出错,则在任何包含该输入条件的某个边界的情况下一定会出错,那么测试时仅覆盖输入条件的单个边界点即可,无需测试多个输入条件同时取边界测试数据的情况;
-
全边界法是将所有边界组合情况全部纳入测试内容,即强边界+弱边界。优势在于可测试到所有边界,但由此可能会导致的巨大测试量。