程序中的路径是执行程序时经过的分支的集合。路径覆盖法是指设计一定数量的测试用例运行被测程序,使程序中的所有路径都至少被执行一次。路径覆盖率的计算方法为:测试时至少被执行过一次的路径总数 / 程序的总路径数。
栗子
public static int test(int a, int b, int c) {int result = 0;if (a == 0 || b > 2) {result = b - a;}if (a > 0 && c > 0) {result = c * a;}return result;
}
第 1 步:分析待测试代码,画出程序的流程图。
第 2 步:分析流程图。
从上图中可以看出,这段代码共有两个判断语句,每个判断语句分别有取真值、取假值两个分支。那么,程序中共有如下四条路径:
- 路径 1 :A - C 路径 2 :A - D 路径 3 :B - C 路径 4 :B - D
第 3 步:编写测试用例。
根据路径覆盖的定义,我们需要设计一些测试用例,使程序中的每个路径至少被执行一次。
测试用例编号 | 输入数据 | 预期结果 | 路径覆盖情况 |
---|---|---|---|
testcase_01 | a = -2 , b = 1 , c = 9 | result = 0 | 路径 1 :A - C |
testcase_02 | a = 5 , b = -2 , c = 3 | result = 15 | 路径 2 :A - D |
testcase_03 | a = 0 , b = 3 , c = 3 | result = 3 | 路径 3 :B - C |
testcase_04 | a = 1 , b = 5 , c = 9 | result = 9 | 路径 4 :B - D |
路径覆盖可以使程序中的每一条路径都经过测试,确保程序执行路径的正确性。但是,对于判断语句多且复杂、循环次数多的程序,需覆盖的路径数量可能非常庞大,无法在短时间内测试完,例如,下图是一段代码的流程图,图中含有多个判断语句、循环语句,如果要将所有路径都测试到,将花费大量的时间,所以,在实际的项目测试中基本不可能把所有路径都覆盖到。
路径覆盖可以保证程序中的所有路径都被覆盖到,但对于包含多且复杂的判断语句、循环语句的程序来说,要覆盖每一条路径将会非常困难。
代码实现
Demo.java
public static int test(int a, int b, int c) {int result = 0;if (a == 0 || b > 2) {result = b - a;}if (a > 0 && c > 0) {result = c * a;}return result;
}
TestDemo4.java
import org.junit.Assert;
import org.junit.Test;public class TestDemo4 {@Testpublic void test01() {Assert.assertEquals(0, Demo.test(-2, 1, 9));}@Testpublic void test02() {Assert.assertEquals(15, Demo.test(5, -2, 3));}@Testpublic void test03() {Assert.assertEquals(3, Demo.test(0, 3, 3));}@Testpublic void test04() {Assert.assertEquals(9, Demo.test(1, 5, 9));}}