即使是最好的测试,也无法达到100%的无错误
基于等价类划分的测试:将被测函数的输入域划分为等价类, 从等价类中导出测试用例 针对每个输 入数据需要满足的约束条件,划分等价类 每个等价类代表着对输入约束加以满足/违反的有效 /无效数据的集合 。 而相似的输入,将会展示相似的行为。 故可从每个等价类中选一个代表作为 测试用例即可
可以按照下面的准则划分:
输入数据限定了数值范围输入数据指明了特定的值输入数据确定了一组数输入数据是Y/N案例:对 BigInteger.multiply()的测试:
/** @param val another BigInteger @return a BigInteger whose value is (this * val). */ public BigInteger multiply(BigInteger val) E.g., BigInteger a = ...; BigInteger b = ...; BigInteger ab = a.multiply(b);方法的输入和输出是一个 BigInteger × BigInteger → BigInteger 的映射, 从二维输入空间BigInteger × BigInteger可以对其划分 从正负的角度对二维空间进行 等价类划分
a and b are both positivea and b are both negativea is positive, b is negativea is negative, b is positive同时需要考虑输入数据的特殊情况
a 或 b 是 0, 1, 或 -1考虑输入的上限:很大的数是否仍正确?
a和b都是较小的数a和b都是大数因此可以划分等价类:
01-1small positive integersmall negative integerhuge positive integerhuge negative integer再进行笛卡尔乘积,一共7*7=49 种划分
因此在等 价类划分时,将边界作为等价类之一加入考虑, 不仅要考虑边界,还要考虑边界的两侧 案例:对max函数的测试: max : int × int → int 可以将他们划分为: a与b之间的关系:
a < ba = ba > ba的取值
a = 0a < 0a > 0a = minimum integer 、a = maximum integer对b的取值和a同理 然后选取值来进行全覆盖
(1, 2) covers a < b, a > 0, b > 0(-1, -3) covers a > b, a < 0, b < 0(0, 0) covers a = b, a = 0, b = 0(Integer.MIN_VALUE, Integer.MAX_VALUE) covers a < b, a = minint, b = maxint(Integer.MAX_VALUE, Integer.MIN_VALUE) covers a > b, a = maxint, b = minint…笛卡尔积:全覆盖 多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例 例如对上面的max的测试,有三个维度,分布有 3,3,5个等价类,需要 3 × 5 × 5 = 75测试用例 因此笛卡尔积这种方式测试完备,但用例数量多,测试代价高 但是并非所有组合情况都可能
覆盖每个取值:最少1次即可 每个维度的每个取值至少被1个测试用例覆 盖一次即可 测试用例少,代价低,但测试覆盖度未必高
通常情况下在这两个方案之间选取一个折衷的方案
1.要为某个方法A m(int b,String c)构造黑盒测试用例,那么设计实现Junit测试用例不需要依据的内容为
m()的内部实现代码
m()的pre-condition(该方法输入参数满足的条件)
m()的post-condition(该方法执行后返回值满足的条件)
类A的等价性判断方法A.equals()
答案:A 黑盒测试无需测试内部实现
答案:A JUnit中的测试并不是先后次序,而是随机的顺序,如何想要固定的顺序,添加一个: @FixMethodOrder 并且指定一个合适的MethodSorters。
答案:A 应该执行回归测试
答案:B 显然不正确
正确答案:B 对于spec没有规定的情况,无需进行测试
正确答案:ADE
正确答案:ABCD