参加晓梅老师的海盗派的学习Meetup,介绍因果图,想到一个问题,“与或非”可以完全表达两个元素的逻辑结果吗?)
这样描述,有两个命题 PA, PB, 每个值都是真或假两种情况,共有有四种组合:
(PA PB) ---> ( 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就发现问题。 所以说回归测试很重要。
网友评论