探索性测试和机器学习

最近在研究如何做项目的测试,在我们平常的项目中,有功能性测试,回归测试,集成测试,为了提供测试效率和控制质量,会尽可能的做自动化测试,但最近的研究和这些测试有点不一样,我们准备尝试下做一种探索性测试,最好能够让机器一边学习一边帮我们测试,我们所需要的就是做一些假设性输入即可。

智能探索性测试

探索性测试(explortary test),一般没有计划好的测试步骤,没有预设的测试目标,只有对测试结果的普遍期望,这个和随机性测试(ad-hoc)相同,不一样的地方是,探索性测试是在对测试的产品并不十分了解,是根据测试者的经验和一些测试常识来做一些测试,一边学习,一边不断的测试新功能。

人的学习能力是很强的,所以很多时候探索性测试被认为是只有人可以胜任这个工作,但是大家可能忽略的一点是,测试需要很强的重复执行能力,在这个方面,人是远远无法和机器相比的。假如我们能够让机器拥有人类的学习能力,那么是不是可以让机器帮我们做探索性测试。

举个例子,在web测试中,如果我们能够让机器能够识别一个链接,点击后期望是打开一个页面,是不是可以让机器帮我们测试网页上的所有链接?在移动应用中,如果我们能够让机器识别一个按钮,点击之后期望应用没有运行异常,可能还会弹出一个对话框,如果点击对话框的“关闭”按钮,那么对话框应该可以关闭;甚至可以这样,机器可以点击“确定”按钮,机器记录下所发生的一些事件,那么当一次点击这个按钮时,机器是否就可以判断点击同样按钮的事件?

我们想这是完全可以做到的,现在的机器学习理论已经可以让我们好好对探索性测试做些工作,我们可以给机器输入一些预设条件,然后机器就可以自己学习摸索,然后自动帮我们做测试工作,出现异常能够报告出来,任何测试如果能够被自动化,就应该自动化,探索性测试也不例外,我们现在欠缺的可能就是一个智能的机器了。

机器学习算法

要让机器能够变得智能化,我们需要让机器能够自我学习和判断,这样才能自主开展探索性测试工作。让我们先从几个简单的机器学习算法说起。

邻近算法

这是一个简单的算法,其原理是,选取一个事物的特征项,每个特征项都可以量化,有量化的值,比如一个长方形的有两个特征项:长和宽,我们以(x,y)来表示,那么任何一个长方形都有这两个值,邻近算法就是比较两个长方形的特征项值的坐标距离,如果离的近,说明这两个长方形就是同一事物。

概率算法

这个算法和邻近算法不一样的是,其根据每个特征项的概率综合起来判断事物的归类,这里面有不同的概率组合算法,我们不在文章里展开。

举个例子来说,小米相机上自带有识别人脸,其会判断年龄和性别,在这个过程中,就有一个机器判断过程,那么机器如何判断年龄和性别么?一个人的脸上有很多特征项,有头发,眼睛,鼻梁,眉毛,嘴巴,皮肤,以判断性别来说,头发是一个很重要的特征项,头发长有90%的可能是女性,皮肤白有60%可能是女性,那么两者加起来判断可能有96%的可能为女性,这个是条件概率得到的判断,如果有更多的特征概率,则判断会更准确。

一个简单的实现

在我们的项目中,我们以一个web网页为基础,希望获取到网页上所有图片类型并加以归类,开发语言用的是Python。

代码地址:https://git.oschina.net/pphh/machinelearning.git

算法步骤,

1. 读取训练样本数据,建立数据模型,获取k值,k值是判断目标数据类型的个数。

2. 输入目标数据,计算和样本数据特征值的坐标距离。

3. 获取k个最近距离的样本数据,并根据样本数据的类型来决定目标数据的类型。假如k为3,如果有两个以上的样本数据表明同一类型A,则目标数据就可以判断类型A。

 

 

开源项目中的编程语言份额调查

软件行业的开发语言众多,究竟哪个语言用的最多,哪个变得越来越流行?让我们从github上的代码仓库的2010-2015年历史数据中来看看,

1. 2010-2015年度历史数据

下表中数据中统计1星以上的代码仓库(stars:>1),无星仓库不在统计之内。

2010-2015年github上的项目开发语言统计

2. 新建仓库数目历史趋势

下图显示为从2010年到2015的每年新建代码仓库数目,

annual_new_repos

可以看到仓库新建数目在2011年度有较大幅度增长,2014年到达顶峰,但2015年比2014年略有下降,这是否表明开源的项目增长已经趋于饱和,还是因为git代码托管平台的增多,分流了github上的开源项目个数?这个还有待考察。

现在开源项目越来越多,整个IT行业技术人员的精力也是有限的,开源需要消耗很多额外的精力和热情,连续多年的全员开源,现在也许是该让IT行业技术人员重新认识开源,究竟要怎么拥抱开源,做有质量的开源项目。

3. 代码仓库按语言分布

下图显示为从2010年到2015的每年新建代码仓库数目的按语言分布,

github_newrepo_bylang

其中,Javascript语言项目一骑绝尘,占领的份额从2010年的20%到2015年的37%,份额增长了接近一倍,这也充分说明了web前端开发在当前技术领域越来越受到重视。

如果查看下2010和2015年新建代码仓库语言占比(饼图主要摘取了前5-10名语言的仓库),

2010_lang_dist

2015_lang_dist

可以看到,从开始的各个开发语言部分上线,到了2015年Javascript\Python\Java已经牢牢占据着大半壁的江山。一些当年流行语言ruby\php已经越来越少。