探索性测试和机器学习

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

智能探索性测试

探索性测试(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。