小小糖 发表于 2018-5-7 09:49:46

因果图基础--与或非

参加晓梅老师的海盗派的学习Meetup,介绍因果图,想到一个问题,“与或非”可以完全表达两个元素的逻辑结果吗?)

这样描述,有两个命题 PA, PB, 每个值都是真或假两种情况,共有有四种组合:

(PAPB)---> ( 0 0) /( 0 1) /( 1 0)/ ( 1 1)
那么对于其结果C , 有16 (2^4) 种结果, 与或非可以完全表达这16 种关系吗?

下图表格画出16种结果,其中可以 按照C包含1的个数可以分为C0 ,C1, C2, C3, C4。以及用与或非对应的关系图。

命题结果与集合关系一一映射
还发现一个挺有意思的结果,集合A和集合B将 区域划分为四部分, 其中每一个部分对应一个1。 四个部分, 其
分别表示 1( A - B) ,2( B-A),3 (A n B), 4( A U B)。 比如 对于C0, 就是一个都不选; C4,代表全选。
C1 代表选一个区域,C2, 代表选两个区域, C3 代表选三个区域。

结论就很简单,与或非完全可以表达两个命题逻辑结果。

下面看几个应用。

1. 如何避免组合爆炸

对软件中随着变量的增加,代码错误概率也增加,同时测试的组合是呈现爆炸式的增长。

比如说2个逻辑变量A和B,计算其A and B 。

每一个逻辑变量其值为真或假, 有四种组合。 如果对于代码会发生各种错误,比如漏掉,写反( 大于号写成
小于号),导致有9 种结果(每一个变量有三种情况,正常,恒一,恒零, 两个变量3x3)。 只有一种是正确
的,也就是8个错误结果。 代码写正确不容易啊:)。

需要验证代码正确性,如果每一种组合都测一次,那么4种组合4个test case。 如果变量增加6个变量,那么组
合测试就是64.   怎么才能减少测试用例? 下图例子中,只需要3个测试用例就可以覆盖验证所有的测试用例。
而且随着变量n的增加,其测试用例只需要n+1.


晓梅老师板书

那么选取测试用例?对于每一个测试用例,其发现的bug数量是不一样的。 编号为4的测试用例,可以发现5
种错误,而编号为1的测试用例只能发现2种错误

上图的左下方给出,对于and、or,异或,和其取反,只需要从三个区域选取3个点即可;

那么对于 三个组合复杂命题( A ^ ( B v C)), 如何选择测试用例?这个留个大家作为练习:)

2.回归测试的重要性

回归测试很重要,因为代码修改或许在你不知道的地方会出现问题。

对于下图逻辑变量 A和B,代码都写错了.一个是恒真一个是恒假, 那么测试发现问题。 开发发现原来是A错了,
修改,测试用例4跑也通过了。 但是,但是,但是,bug 转移。如果回归测试2,那么测试用例2就发现问题。
所以说回归测试很重要。



页: [1]
查看完整版本: 因果图基础--与或非