在预测软件的可靠性时,可以根据该软件多轮测试发现的缺陷个数来预测应该发现的总缺陷数。在软件测试过程中,最开始的时候,会呈现缺陷增长较快的趋势状态,随着测试的进行,测试难度加大,需要执行较多的测试用例才能发现一个缺陷,虽然继续投入测试,仍然会持续发现缺陷,但是明显缺陷的增长速度会减缓,同时软件中隐藏的缺陷是有限的,因而限制了发现缺陷数的无限增长。在实践中预测总缺陷数的常用方法是Gompertz模型,该模型预测的准确率很高,尤其是当测试轮次超过总轮次的1/3之后。
其实Gompertz模型最初并非是针对软件领域的,而是用来预测人类的死亡概率,所以人们也称之为:“Gompertz人类死亡定律”,它是由英国保险精算师Benjamin Gompertz在1825年首次发现:你认为你在明年死的概率是多少?试着用一个数字回答——百分之一?万分之一?不管是多少,这个数字将在8年后增长一倍!这意味着人们能活到某个特定年龄的概率是在不断加速下降的。 该模型可以用来刻画这样的现象:初期增长缓慢,以后逐渐加快,当达到一定程度后,增长率又逐渐下降,最后接近一条渐近线(K值)。现实中有许多现象符合Gompertz曲线,如软件缺陷的发现、一定时期的人口增长等,因而该曲线被广泛应用于现象的趋势变动研究。
Gompertz模型是一个双指数公式:
其中:
t是自变量,代表时间,如测试轮次等;
K代表Y的极限值,即当t趋向于无穷大时Y的取值,如软件中隐藏的缺陷总数;
a<1,Ka为t=0时Y的初始值;
0<b<1,b为形状参数,b越大,代表可靠性增长越慢,到达极限值的速度越慢,如软件测试的周期越长。
当已知了历史数据之后,就可以根据历史数据采用三和法、三点法、高斯牛顿法等多种方法求出K,a,b值,从而拟合出该现象的发展趋势。尽管该方法理论上有一些前提条件,但是实践中我们忽略其前提条件,仍然有很高的准确度。
我们以2003年4月20日到6月12日65天的北京市非典数据为例进行测算一下:
序号
|
日 期 |
已确诊病例累计 |
新增确诊 |
1 |
4月20日 |
339 |
339 |
2 |
4月21日 |
482 |
143 |
3 |
4月22日 |
588 |
106 |
4 |
4月23日 |
693 |
105 |
5 |
4月24日 |
774 |
81 |
6 |
4月25日 |
877 |
103 |
7 |
4月26日 |
988 |
111 |
8 |
4月27日 |
1114 |
126 |
9 |
4月28日 |
1199 |
85 |
10 |
4月29日 |
1347 |
148 |
11 |
4月30日 |
1440 |
93 |
12 |
5月1日 |
1553 |
113 |
13 |
5月2日 |
1636 |
83 |
14 |
5月3日 |
1741 |
105 |
15 |
5月4日 |
1803 |
62 |
16 |
5月5日 |
1897 |
94 |
17 |
5月6日 |
1960 |
63 |
18 |
5月7日 |
2049 |
89 |
19 |
5月8日 |
2136 |
87 |
20 |
5月9日 |
2177 |
41 |
21 |
5月10日 |
2227 |
50 |
22 |
5月11日 |
2265 |
38 |
23 |
5月12日 |
2304 |
39 |
24 |
5月13日 |
2347 |
43 |
25 |
5月14日 |
2370 |
23 |
26 |
5月15日 |
2388 |
18 |
27 |
5月16日 |
2405 |
17 |
28 |
5月17日 |
2420 |
15 |
29 |
5月18日 |
2434 |
14 |
30 |
5月19日 |
2437 |
3 |
31 |
5月20日 |
2444 |
7 |
32 |
5月21日 |
2444 |
0 |
33 |
5月22日 |
2456 |
12 |
34 |
5月23日 |
2465 |
9 |
35 |
5月24日 |
2490 |
25 |
36 |
5月25日 |
2499 |
9 |
37 |
5月26日 |
2504 |
5 |
38 |
5月27日 |
2512 |
8 |
39 |
5月28日 |
2514 |
2 |
40 |
5月29日 |
2517 |
3 |
41 |
5月30日 |
2520 |
3 |
42 |
5月31日 |
2521 |
1 |
43 |
6月16日 |
2521 |
0 |
44 |
6月17日 |
2521 |
0 |
45 |
6月18日 |
2521 |
0 |
46 |
6月19日 |
2521 |
0 |
47 |
6月20日 |
2521 |
0 |
48 |
6月21日 |
2521 |
0 |
49 |
6月22日 |
2521 |
0 |
50 |
6月23日 |
2521 |
0 |
51 |
6月1日 |
2522 |
1 |
52 |
6月2日 |
2522 |
0 |
53 |
6月3日 |
2522 |
0 |
54 |
6月4日 |
2522 |
0 |
55 |
6月5日 |
2522 |
0 |
56 |
6月6日 |
2522 |
0 |
57 |
6月8日 |
2522 |
0 |
58 |
6月9日 |
2522 |
0 |
59 |
6月10日 |
2522 |
0 |
60 |
6月13日 |
2522 |
0 |
61 |
6月14日 |
2522 |
0 |
62 |
6月15日 |
2522 |
0 |
63 |
6月7日 |
2523 |
1 |
64 |
6月11日 |
2523 |
0 |
65 |
6月12日 |
2523 |
0 |
在1stopt软件中对上述65天的数据进行拟合得到如下的结果:
相关系数(R): 0.9993
相关系数之平方(R^2): 0.9987
参数 最佳估算
---------- -------------
K 2539.2751
a 0.0991
b 0.8769
即模型预测的最终确诊人数上限为2539,在疫情发展过程中,我们可以每天进行预测K值的变化,以下为基于上述2003年非典数据每5天一次的预测结果与实际值的对比:
第几天进行预测 |
K值(上限) |
与实际值2523的偏差 |
与实际值的偏差率 |
5 |
982 |
-1541 |
-61.08% |
10 |
2530 |
7 |
0.28% |
15 |
2715 |
192 |
7.61% |
20 |
2779 |
256 |
10.15% |
25 |
2712 |
189 |
7.49% |
30 |
2632 |
109 |
4.32% |
35 |
2581 |
58 |
2.30% |
40 |
2569 |
46 |
1.82% |
45 |
2560 |
37 |
1.47% |
50 |
2552 |
29 |
1.15% |
55 |
2546 |
23 |
0.91% |
60 |
2542 |
19 |
0.75% |
65 |
2539 |
16 |
0.63% |
综合上表我们可以发现该模型在初期,即疫情发展的前5天,趋势不明显时,预测结果偏差较大,但是中后期拟合的效果还是很好的!
如果采用该方法预测一下当下的新型冠状病毒肺炎的趋势会是怎么样的呢?敬请关注后续文章!