分享
 
 
 

软件测试悖论

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

Test run 专栏

软件测试悖论

原著:James McCaffrey

翻译:biny_yang

原代码下载 TestRun0512.exe

(120KB)

原文出处:Test Run:Software Testing Paradoxes

Simpson 悖论

Braess 悖论

Parrondo 悖论

悖论很奇妙。在本月的专栏里,我将向你们展示你们进行软件测试时可能遇到的三个有趣的案例。他们本质上是数学问题,而且他们对你们的问题库是一个很好的补充。

在这个专栏的第一部分,我解释 Simpson 悖论。该悖论阐述的是这样一种情况:软件系统 A 与软件系统 B 相比,各方面都要差,然而软件系统 A 可能是一个更好的系统。 在第二部分,我揭示了 Braess 悖论。根据这个悖论,当增加一个完全负载平衡的服务器时,网络性能会以一种奇怪的方式降低。最后,我考虑了 Parrondo 悖论。这个悖论认为两个相互独立并且是错误百出的系统能够不可思议地产生一个正确的系统。

Simpson 悖论经常发生。虽然你实际碰到 Braess 悖论和 Parrondo 悖论的机会很少,我还是认为你们会有兴趣读它们。

Simpson 悖论

假设你有两个不同的软件系统原型:原型 A 和原型 B 。你想知道从用户的反馈来看,哪个原型更好。假设对于易用性,原型 A 从 200 个用户当中获得了 50 个用户的优秀评价,而原型 B 从 100 个用户中获得了 15 个用户的优秀评价(见图 1 )。从这个数据来看,原型 A 的易用性显然要比原型 B 要好,因为原型 A 获得了 25% 的优秀评价,而原型 B 只得到了 15% 。

易用性数据

原型 A

原型 B

优秀评价用户数目

50

15

总用户数目

200

100

得分

25%

15%

安全性数据

原型 A

原型 B

优秀评价用户数目

85

300

总用户数目

100

400

得分

85%

75%

图1 比较原型A和原型B

现在,假设对于安全性,原型 A 从 100 个用户当中获得了 85 个用户的优秀评价,而原型 B 从 400 个用户中获得了 300 个用户的优秀评价。对于这个数据,你能看到原型 A ( 85% 的优秀率)再次比原型B( 75% 的优秀率)要好。因此,你认为哪个原型要好?在你回答之前,让我们把图 1 中的数据整合到一个单独的表格当中(图 2 )。

整合之后的数据

原型 A

原型 B

优秀评价用户数目

135

315

总用户数目

300

500

得分

45%

63%

图2 安全性、易用性整合数据

如果你将优秀评价的数目结合起来,你就能看到原型 A 从 300 个用户中获得了 135 个优秀评价,比例仅为 45% 。相反,原型 B 有 63% 的优秀评价率,从 500 个用户当中获得了 315 个用户的优秀评价。因此,原型 B 要好,对不对?或者原型 A 要好?如果是原型 A 要好,你怎样解释这些整合之后的数据?

这是 Simpson 悖论的一个例子,这是一种真实现象。这里没有任何的诡计。正确答案是原型 A 是更好的系统,你不能把这些数据整合成一个象图 2 一样的单独表。 Simpson 悖论的一个简单、非正式的描述是:两个及以上的数据集单独评估时会产生一个结果,而联合起来评估时会产生一个相反的结果。如果你再回看图 1 中的数据,你会注意到不同原型不同列中的评估总值是不一样的。这是 Simpson 悖论的必要条件。

前述例子是假设的,然而它清楚地揭示了 Simipson 悖论。重要的是, Simpson 悖论在实际工作中确实发生,并且你应该警惕它们的出现。这种悖论会悄悄躲过你的法眼,尤其是当你只能看到总数据,而没有机会接触到原始、没有结合的数据。这里有一组拼凑起来的数据,但是数据的来源场景是真实的。这个实际的例子出现在 P.J.Bickel, E.A.Hammel 和 J.W.O''Connell 的文献“研究生录取的性别偏差: Berkeley 的数据”( 1975 )。

考虑一个大学的研究生院的数据(图3)。这个数据显示向这个大学申请的 9000 个男性中的 4000 人被录取进行研究生学习( 44.4% ),而 4500 个女性之中只有 1500 个被录取( 33.3% )。这个案例是不是证明了性别不平等呢?不见得。图 3 中的数据是该大学 4 个系录取数据的整合。看看描述各个系的原始数据的图 4 。从这个数据中来看,你会发现在每个系女性被录取的比例比男性都要高!很明显,图 4 中未整合的数据比图 3 中整合的数据更好的描述了录取率。尽管这只是现实事件的一个很大简化,你还能看到 Simpson 悖论是很难发现的。

录取的人数

拒绝的人数

录取率

男性

4000

5000

44.4%

女性

1500

3000

33.3%

图3 整合后的研究生院录取数据

男性

女性

录取的人数

拒绝的人数

录取率

录取的人数

拒绝的人数

录取率

A

2000

2400

45%

400

450

47%

B

1200

1000

55%

100

80

56%

C

700

900

44%

600

730

45%

D

100

700

13%

400

1740

19%

总计

4000

5000

1500

3000

图4 原始的研究生院录取数据

Simpson 悖论从数学上来说确实不是一种真正的悖论。一个数学悖论产生一个逻辑上不一致的答案,而 Simpson 悖论的结论是奇怪的、意料之外的,但是却是能够得到解释的。如果你想深入研究,网上有很多关于 Simpson 悖论的资料。给我们的启示是,当你检查测试结果数据的时候,你要先怀疑这些数据是不是从其他原始资料整合而来的。如果是,那么你应该看看原始未经整合的数据。另外,如果你在产生一个测试数据报告,当你尝试要整合数据以便简化你的阐述时要相当仔细。有人说“统计能用来说明任何你想要的”,这种情况正是它们说提及的。

Braess 悖论

现在来看看 Braess 悖论。我的例子使用了一个传统场景——汽车交通,但是我描述了这个悖论是怎样扩展到软件测试和其他情况的。关于 Braess 悖论的原始工作是 Dietrich Braess 的“ über ein Paradox der Verkerhsplannung ”( 1968 )。而我的例子,是基于我发现的几个例子,这几个例子对 Mark Wainwright 的工作作出了贡献。当时我不能亲自参加到 Wainwright 的原始工作中。

Braess 悖论相当复杂,所以这里我给一个简化的、离散近似。假设象图 5 中显示的一样有四个城镇——城镇 A ,城镇 B ,城镇 C 和城镇 D 。

连接任意两个城镇之间的每一条路都有一个关联成本,由图中与路相邻的方程给出。成本是陆上汽车数的函数。你能想象成本代表了在这条路上行驶所需要的时间,或者所需要的汽油,或者你们想要最小化的某些因素。现在假设某一个早晨,有 6 辆车从城镇 A 离开,每次一辆,目的都是城镇 D 。汽车 1 离开的时候,路上完全是空的。该车可以从两条路径中选择: A-B-D 和 A-C-D 。 A-B-D 的成本是 [4(1) + 1] + [1 + 16] = 22 。由于该图的对称性,路径 A-C-D 的成本也是 22 。假设汽车 1 选择了路径 A-B-D 。

图5 公路网络: Braess 悖论

现在汽车 2 准备离开了。他看到汽车 1 在路径 A-B-D 上,因此知道了现在 A-B-D 上的成本是 [4(2) + 1] + [2 + 16] = 27 ,所以他选择了成本只有 22 的路径 A-C-D 。汽车 3 看到每条路径上都有一辆车,所以选择了成本是 27 的路径 A-B-D 。汽车 4 选择了成本是 27 的路径 A-C-D 。汽车 5 看到四辆车是均匀分布的,他选择了路径 A-B-C ,成本是 [4(3) + 1] + [3 + 16] = 32 。最后,汽车 6 选择了成本是 32 的路径 A-C-D 。现在所有六辆车都在从城镇 A 到城镇 D 的某一条路径上。因为每一条路径上有三辆车,而两条路径是对称的,每辆车的成本是 32 。

这是 Braess 悖论出现的地方。如果在城镇 B 和城镇 C 之间增加一条新的、有效的路径,你认为会出现怎样的结果?常识是,增加道路容量会降低司机们的成本。但是既然这种现象被叫做“ Braess 悖论”而不是“ Braess 常识”,你应该猜到实际发生的并不是如此。

假设修改图 5 中的地图,在城镇 B 和城镇 C 之间增加了一条高效快捷路径,它的成本函数是一个常数 1 。在加入了快捷路径的第一个早晨,汽车 1 准备离开城镇 A 。他有四种可能路径选择,各条路经的关连成本如下:

A-B-D cost = [4(1) + 1] + [1 + 16] = 22

A-C-D cost = [1 + 16] + [4(1) + 1] = 22

A-B-C-D cost = [4(1) + 1] + 1 + [4(1) + 1] = 11

A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35

这是很有希望的。汽车 1 选择了路径 A-B-C-D ,通过快捷路径来显著降低他的交通成本——至少暂时如此。汽车 2 准备离开了。他看到汽车 1 选择了路径 A-B-C-D ,于是分析他的可能成本:

A-B-D cost = [4(2) + 1] + [1 + 16] = 26

A-C-D cost = [1 + 16] + [4(2) + 1] = 26

A-B-C-D cost = [4(2) + 1] + 1 + [4(2) + 1] = 19

A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35

经过快速数学计算之后,汽车2页选择了路径 A-B-C-D 。尽管汽车 1 已经在这条路径上了,快捷路径的有效性仍然使得它是汽车 2 的最好选择。

现在汽车 3 准备离开了,他的选择是:

A-B-D cost = [4(3) + 1] + [1 + 16] = 30

A-C-D cost = [1 + 16] + [4(3) + 1] = 30

A-B-C-D cost = [4(3) + 1] + 1 + [4(3) + 1] = 27

A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35

再次,这个快捷路径 A-B-C-D 是最好的选择。汽车 4 准备离开城镇 A ,观察了钱三个司机的决定,算出了他自己的成本:

A-B-D cost = [4(4) + 1] + [1 + 16] = 34

A-C-D cost = [1 + 16] + [4(4) + 1] = 34

A-B-C-D cost = [4(4) + 1] + 1 + [4(4) + 1] = 35

A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35

快捷路径上目前的交通使得 A-B-C-D 比路径 A-B-D 和 A-C-D 的成本要高。假设汽车 4 选择了路径 A-B-C (如果汽车 4 选择了 A-C-D ,细节会有一点不同,但是总的结果是一样的)。

汽车 5 现在准备离开了,他分析了他的选择:

A-B-D cost = [4(5) + 1] + [2 + 16] = 39

A-C-D cost = [1 + 16] + [4(4) + 1] = 34

A-B-C-D cost = [4(5) + 1] + 1 + [4(4) + 1] = 39

A-C-B-D cost = [1 + 16] + 1 + [2 + 16] = 36

因此汽车 5 决定选择路径 A-C-D 。最后一辆车,汽车 6 ,现在准备离开了,他观察了前面 5 个司机的决定,做出了他自己的分析:

A-B-D cost = [4(5) + 1] + [2 + 16] = 39

A-C-D cost = [2 + 16] + [4(5) + 1] = 39

A-B-C-D cost = [4(5) + 1] + 1 + [4(5) + 1] = 43

A-C-B-D cost = [2 + 16] + 1 + [2 + 16] = 37

汽车 6 选择了路径 A-C-B-D ,因为这是成本最低的。现在 6 辆车都在路上了,你可以算出每辆车的成本。

Car 1 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35

Car 2 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35

Car 3 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35

Car 4 route A-B-D, cost = [4(4) + 1] + [1 + 16] = 34

Car 5 route A-C-D, cost = [2 + 16] + [4(4) + 1] = 35

Car 6 route A-C-B-D, cost = [2 + 16] + 1 + [1 + 16] = 36

回忆一下,如果没有这条快速路,每辆车的成本是 32 。现在增加了额外公路容量,我们却增加每个司机的成本!

这个例子提供了一个对 Braess 悖论的实际接触。因为这和网络系统上所传输的数据包有明显的关系, Braess 悖论受到了研究人员的深入研究。你能非正式的总结这个悖论:有时候增加节点之间的路径数反而会增加网络拥塞。从软件测试角度来说, Braess 悖论会在进行网络性能测试的时候出现。老实说,你碰到 Braess 悖论的机会很少。但是这个现象确实存在。启示是,你不应该假设增加网络容量就会提高性能。如果你增加了容量但是没有看到你所期望的性能提高, Braess 悖论就是应该去调查的。

Parrondo 悖论

本质上, Parrondo 悖论陈述的是两个要输的赌博游戏(我们称他们为游戏 A 和游戏 B ),它们可以被设计好,这样如果一个接一个地玩,它们可以成为赢得游戏。有很多方法可以构造 Parrondo 悖论的例子,最简单的事使用三个有偏差的硬币。

游戏 A 是一个简单的掷硬币游戏。你掷出一枚硬币,如果硬币正面朝上,你赢 1 元,如果硬币正面朝下,你输 1 元。硬币 1 稍微有点偏差,这样它正面朝上的概率是 p1=0.495 (故正面朝下的概率就是 1-p1=0.505 )。如果你不停的玩这个游戏,你最终会输钱。游戏 B 有点复杂,使用两个硬币。这个游戏中的第一个硬币(硬币 2 )有一个赢(正面朝上)的概率 p2=0.095 。这是一个很糟糕的硬币。第二枚硬币(硬币 3 ),有一个赢的概率 p3=0.745 。这是一个很好的硬币。

你从一定数目的钱开始玩这个游戏,例如 300 元。为了玩游戏 B ,你需要两个步骤 : 先要检查你的钱数是否是 3 的倍数(例如 300 元、 297 元、 303 元等等)。如果你目前的资金是 3 的倍数,你掷硬币 2 ,要不是赢 1 元就是输 1 元。如果你目前的资金不是 3 的整数倍,你掷硬币 3 ,赢 1 元或输 1 元。尽管不是很明显,如果你不停的玩游戏 B ,你还是会输钱。

在这一点上,我们有两个要输的游戏。如果我们按照一种随机模式或者是固定模式来玩游戏 A 和 B ,你认为会发生什么?令人惊奇的是,如果一起玩,这两个要输的游戏最后会赢!本专栏附带的代码给出了一个用 C# 写的仿真。图 6 是运行这个程序的一个屏幕截图。

图6 Parrondo 悖论仿真

这个游戏是由西班牙心理学家 Parrondo 创造的。 1999 年, G.P.Harmer 和 D.Abbott 发表了文献“ Losing Strategies Can Win by Parrondo''s Paradox ”,以 Parrondo 给这个悖论命名。从那以后,在这个游戏和它的变种上出现了很多的研究,包括改变三个硬币的概率影响和改变玩游戏 A 和 B 的模式。

现实中,你碰到 Parrondo 悖论的机会是很少的。在一种牵强的场景中,你由一定数目的进程优先级(与 Parrondo 悖论中的资金相对应)开始,你有一个子过程会根据 CPU 的使用情况提高或降低进程优先级(与游戏 A 对应),你也有另外一个子过程会根据目前的优先级而提高或降低进程优先级(与游戏 B 对应)。这两个子过程都设计为概率上最后都会降低进程优先级。然而,当这两个过程被反复调用,它们实际上会提高进程优先级。诚然,这只是一种扩展,然而 Parrondo 悖论太有趣了,我忍不住在这个专栏中介绍它!

作者简介:

James McCaffrey 在Volt信息技术公司管理着微软软件工程师的技术培训。他曾经为数个微软产品工作过,例如IE和MSN。他的联系方式是jmccaffrey@volt.com v-jammc@microsoft.com

译者简介

杨彬:在读计算数学硕士,研究方向:随机数学,软件工程,软件测试,软件可靠性。联系方式:biny_yang@hotmail.com

本文出自 MSDN Magazine

December 2005 期刊,可通过当地报摊获得,或者最好是

订阅

本文由 VCKBASE MTT 翻译

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有