
公众号 「神秘的程序员」前些天统计出了2016年最受欢迎的10篇程序员漫画,其中阅读量最大的是《年会上的程序员们……》,这篇漫画累计阅读量达到了120万,有兴趣的朋友可以搜索这篇漫画看一看,漫画的内容讲的是某公司年会上抽奖时有人觉得抽奖程序有Bug,于是大家开始争论,最后直接把抽奖程序的代码拿出来一起review了……
正好,最近我们部门的一次活动中抽奖程序也出了问题,抽奖规则是这样的:程序随机读取一张名单里的名字并在屏幕上滚动,当主持人喊”停”时停止滚动,留在屏幕上的名字便是中奖名单。就在主持人激情洋溢地把奖项抽了快一半的时候,下面有同事走上来说:好像没有看到测试部同事们的名字啊!
“好像确实没有啊,抽到的全是开发的……”
“那个谁,你名单里有没有加上测试部的名字啊?”
“我加了啊,肯定加了的!”
“来,抽奖名单在哪个文件里?打开看看”
负责抽奖程序的同事上台,找到了那个文件,”你看嘛,明明有的,我怎么可能忘记”
“那为什么抽的时候一个测试部的名字都没看到”
“是不是多了个空行啊?” 台下已经有人开始嚷嚷着了
“没,没有空行”
“有特殊字符?”
“也没发现什么特殊字符啊”
“再运行几次看看”
“确实看不到测试部的名字”
……
还好,大家收住了,没继续扯下去,最后宣布抽奖结果无效,等Bug查出来改日再抽!
没有经过测试就发布的产品,果然就是有不少Bug,小Bug可以忍,大Bug就得将产品下线整改,损失巨大(比如我们的抽奖程序,还有三星Note7事件)。如果这个抽奖程序提交给测试部,那测试人员应该怎样去保证这个抽奖程序的质量呢?
抽奖程序的质量好不好,要看每次抽出来的名字是不是够随机。但其实纯靠软件是做不出真随机数,只能做出伪随机数,真随机数需要依赖特殊硬件的支持,比如一些通过热力学噪声生成随机数的硬件随机数生成器。
那我们就来看看这个「伪随机数」该怎么测试:假如抽奖名单里有1000个人名,每次抽奖程序抽出结果时,如果每个人名出现的概率都是1/1,000,那就可以认为这个随机数”足够随机”了(当然,我们这里假设每次只抽一个人)。
所以,我们可以把它看成是一个概率问题,概率问题要怎么测?统计。将抽奖程序运行1,000,000次,每个人被抽中的概率次数应该在1000次左右,这个左右的幅度,即误差,使我们需要预先定义好大小的,在误差范围内,我们认为这个抽奖程序是好的,否则就认为它是不好的。
我们的测试用例,可以这样写:
- 前置条件
准备1,000个人名的名单
- 测试步骤
运行1,000,000次抽奖程序并统计抽奖结果
- 期望结果
每个人在第1到第1,000次被抽中的概率都是1/1,000。最大误差为20%。
当然了,上面的测试用例,其实也有一些特殊情况是测不到的,欢迎大家在后台留言讨论~
测试部的同学,今年年会的抽奖,看你们的了~~
我是王布斯,欢迎关注我的微信公众号:WangBooth

本文讲述了年会抽奖时遇到的问题,抽奖程序被认为存在不公平性。通过分析,指出抽奖程序的随机性实际上依赖于伪随机数生成,并提出通过大量统计运行来验证抽奖结果是否足够随机的测试方案,期望误差不超过20%。同时,鼓励测试部在年会抽奖中发挥关键作用。
9540

被折叠的 条评论
为什么被折叠?



