精准测试新玩法の基于犯罪心理学挖掘代码风险

前言

犯罪心理学还能用于挖掘代码风险?

挖掘出来的东西是什么?

挖掘出来的东东长什么样子?

挖掘出来能用来做什么?

具体怎么样挖掘呢?

这是本文的主要探讨的内容.  

在大型的项目中, 代码和模块的复杂度在很大程度上决定了测试任务的时间, 在项目快速迭代而测试时间比较短的情况下, 怎么样高效的完成测试并且保证测试质量? 如果我们能找到这些经常出问题还有潜在可能出问题的代码和功能区域, 我们的测试就能更高效.

犯罪心理学还能用于挖掘代码风险? - 答案: 是的

地理罪犯分析调查法基于了这样一个原则:罪犯的老窝往往就在他/她作案地点的边界之内.那么,软件测试是否有这样的属性呢? 犯罪分析心理学能够指导我们测试么? 是的, 本文介绍的就是如何从代码本身挖掘出代码的问题从而指导测试的一种思路和方法.

如果我们把代码当成犯罪现场, 我们测试中所发现的问题和缺陷有什么地域属性(此地域指的是代码和功能区域) 么? 很多问题是不是会有相似的属性,是否某些文件和功能会经常出现问题. 我们能否用某种方式定位出这样的热点区域呢?答案是可以的.

那么我们是否可以用历史数据挖掘出代码本身的问题么? 事实上,我们从版本控制工具,bug数据信息,或者其他历史信息里面能找到很多有用的信息,文章后面会讲述如何为代码创造地理呈现。区域和建筑物映射代码的结构,如包或类。代码属性(如代码行数或方法数量)决定区域和建筑物的尺寸. 再结合代码版本工具既能呈现出代码高风险区域即代码热区. 再结合代码和功能之间的对应关系,就可以找到需要重点测试的功能区域(高风险的代码对应的功能模块), 从而提高测试效率, 这和精准测试的目的是一样的.

挖掘出来的东西是什么? - 答案:代码热区

代码热区指的是被频繁改动的代码文件, 这个改动有可能是因为代码复杂度过高或者代码耦合性太强而造成新增功能都需要改动这些代码文件, 也有可能仅仅是因为代码实现的有问题需要频繁改动来修复bug

挖掘出来的东东长什么样子? - 代码热区长什么样子?

下图是几种已有工具展示的热区:

CodeCity (红色的就是代码热区

CirclePacking展示 (红色的就是代码热区, 后文会讲怎么得到这个图)

此工具支持缩放

其实展现形式并不是最主要的, 我们关注的是用代码热区能做什么.

挖掘出来能用来做什么?- 即代码热区能用来做什么?  

如前言里面讲的, 精准测试的主要目的是在测试之前缩小测试的范围, 从而提高测试的效率,而如果我们能通过某种方式从历史数据中找到容易出风险的代码区域也就是所谓的代码热区,这样也可以锁定重点测试的区域,从而达到提高测试效率的目的。

从版本控制工具, 不仅能过滤出代码风险, 还能得到代码耦合度和代码复杂度关系.

对于开发人员,代码热区能提供十分有用的信息,我们可以通过代码热区再加上代码复杂度,代码耦合度等信息来衡量代码的架构和质量, 有效的指导软件代码重构。

对于测试人员, 不同的测试阶段的使用方式稍微有些不同, 具体可参照下面的表格(最后一部分也会进一步探讨怎么使用):

具体怎么样挖掘呢?- 即怎么样得到代码热区?

要找到代码热区进行测试,我们需要如下步骤:

  • 从版本控制工具得到历史数据
  • 用code matt找出代码热区(高风险代码)-
  • 展示热区
  • 结合热区进行测试

具体要怎么做可参考下面的步骤:

需要安装下面工具:

  • 需要安装python:安装完后请将执行路径加到系统变量path
  • Code Maat:  从版本控制工具得到每个文件的改动次数

Windows: download link

OSX/Linux: download link

安装完后请将执行路径加到系统变量path

  • Cloc: 得到文件大小的信息

http://cloc.sourceforge.net/

安装完后请将路径加到系统变量path

  • Svn command shell:  版本控制工具是svn 需要安装

https://tortoisesvn.net/downloads.zh.html

安装完后请将路径加到系统变量path

如果是git的话请安装对应的工具

  • Python脚本 (用于merge 结果生成json)

https://s3.amazonaws.com/CodeMaatDistro/scripts0.4.zip

  • Visualizations 例子

https://s3.amazonaws.com/CodeMaatDistro/sample0.2.zip

执行过程 (以svn为例子):
  1. 在需要分析的目录下, 用svn 命令行得到一段时间内的日志

svn log -v -r {yyyymmdd}:{yyyymmdd} --xml > <svnLogFile >

例子:

svn log -v -r {20160227}:HEAD --xml > test.log

svn log -v -r {20160127}: {20160227} --xml > test.log

2. 用code maat分析总结svn log

maat -l <svnLogFile> -c svn -a revisions > <code_freqs.csv>

可以用下面的命令打印测试下

maat -l <svnLogFile>-c svn -a summary

例子:

maat -l test.log -c svn -a summary

maat -l test.log -c svn -a revisions > test_freqs.csv

注意:

需要打开结果文件把前面的三行删掉(打印的命令行)

另外svn log 打印出来的结果是在svn trunk的相对路径, 如果工作目录不是svn trunk的根路径, 需要修改文件里面代码的路径

/Test_proj/trunk/test/src/features/Log/log.cpp,94

/Test_proj/trunk/test/src/features/LogMgr/logMgr.cpp,94

/Test_proj/trunk/test/src/features/test/test.cc,75

替换成下面这样 (当前工作目录为device), 因为cloc 得出的文件路径是工作路径的相对路径, 要保持两者一致才可以

Log/log.cpp,94

LogMgr/logMgr.cpp,94

test/test.cc,75

3. 用cloc 分析文件大小

cloc-1.64.exe ./ --unix--by-file --csv --quiet --report-file=<code_lines.csv>

例子:

cloc-1.64.exe ./ --unix--by-file --csv --quiet --report-file=test_lines.csv

4. 把前面结果merge生成json 文件

python csv_as_enclosure_json.py --structure <code_lines.csv>--weights <code_freqs.csv > > <jsonFile>

备注:

可以先用merge试一下结果是否正确: 

Python merge_comp_freqs.py <code_freqs.csv ><code_lines.csv>

例子:

python merge_comp_freqs.py test_freqs.csv test_lines.csv

python csv_as_enclosure_json.py --structure test_lines.csv --weightstest_freqs.csv > test.json

5.热点可视化

在sample/hibernate 目录中:

把hib_hotspot_proto.json内容替换成上一步生成的json文件

运行下面命令

prompt> python -m SimpleHTTPServer 8888

然后浏览器打开下面链接,即可看到结果

http://localhost:8888/hibzoomable.html

备注:

也可以自己建立自己的项目目录, 具体格式可参考 hibernate 里面的hibzoomable.html

效果:

Hibernate开源项目全景图(支持鼠标缩放):

代码热区区分

下面图为上面全景图的局部放大

在上图中(hibernate项目热区), 颜色越红, 表示代码区域被改动次数越多, 也即越有风险, 圆圈的大小表示代码文件的大小(行数), 

除了代码热区还能够挖掘出来其他的东东么?-我们一起来进一步思考

在上文中展示的代码热区只包含两个维度: 代码大小, 代码改动次数.

在每个产品或者项目阶段, 我们可以加入自己的维度来定义或者进一步过滤代码热区来得到自己想要的结果.

例如: 有的代码文件频繁被改动可能并不真的是因为修复bug引起的, 可能会是因为新需求带来的改动,在回归测试阶段, 我们更关注这部分代码热区和高风险功能模块,所以基于上面得到的热区,我们可以再加入进一步的过滤,除了文件改动次数, 我们可以加入bug过滤来得到因为bug改动的代码热区. 

如果能进一步加入bug类型或者优先级的过滤, 我们就可以提前预测到某种类型缺陷或者优先级比较高的bug过滤出来的高风险区域. 这将更有效的指导测试.

另外, 我们仅仅通过版本控制工具得到的改动次数定义的代码热区也可能并不是真的有风险的代码. 这时候我们可以通过文件的其它信息(例如, 文件的名字)来判断过滤.

代码版本控制工具本身也可以提供更多的信息:例如, 使用版本控制信息做时空耦合分析。如果两个代码文件在同一时间发生改变,这意味着文件之间是物理耦合的, 版本控制信息也可以用于挖掘知识的所有者和组件的所有权等等. 有兴趣的读者可以进一步探索下.

本文分享自微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据钻研

谷歌的代码管理

谷歌和 Facebook 都只有一个代码仓库,全公司的代码都放在这个库里。 我一直很困惑,为什么要这样做,不同语言的项目放在一个库有什么好处? 最新一期的《AC...

39170
来自专栏Java职业技术分享

不懂高性能的负载均衡设计?没关系,架构师带你飞

在软件系统的架构设计中,对集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案。负载均衡本质上是用于将用户流量进行均衡减压的,因此在互联网的大流量项目中,...

11420
来自专栏Material Design组件

Human Interface Guidelines — Authentication

18050
来自专栏Java技术分享

RBAC新解:基于资源的权限管理(Resource-Based Access Control)

本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的。同时我将讨论一种我认为更好的权限管理方式。 什么是角色 当说到程序的权限管理...

86770
来自专栏DevOps时代的专栏

istio 是啥?一文带你简单了解!

如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 istio,并且知道它和 service mesh 有着牵扯。这篇文章是我之前在公司内部做过的分享,可...

1.7K10
来自专栏Java呓语

架构·Client-Server

一个联网应用程序总是分布在两个或多个主机之间,这就衍生了我们该如何在多个主机之间划分功能的问题。

9830
来自专栏搜云库

分布式和集群区别?什么是云计算平台?分布式的应用场景?

分布式是指将一个业务拆分不同的子业务,分布在不同的机器上执行,集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机,一个云计算平台,就是通过一套软件系...

31950
来自专栏即时通讯技术

腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会...

33130
来自专栏Java职业技术分享

好嗨呦,感觉人生达到了高潮,带你达到架构师巅峰

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

24900
来自专栏CSDN技术头条

社交产品后端架构设计

本篇文章会向读者展示几个架构设计的关键点,使一个社交应用能够成为真正的下一代社交产品。以下几个属性将会影响到架构的设计: a)可用性 b)可扩展性 c)性能...

29170

扫码关注云+社区

领取腾讯云代金券