oracle存储过程代码覆盖率统计工具
目前针对于高级语言如C++,JAVA,C#等工程都有相关的代码覆盖率统计工具,但是对于oracle存储过程或者数据库sql等方面的项目,代码覆盖率统计和扫描工具相对较少。
因此针对这种情况,设计了代码覆盖率统计工具,其实oracle已经提供了较好的代码profiler包,本文主要介绍利用DBMS_PROFILER设计的代码覆盖率统计工具。
1.代码打桩
获取代码覆盖率的前提是,需要对被测代码进行profiler,也就是打桩,需要有一个计数器去统计被执行到的代码行。Oracle提供了一个有用的工具包叫DBMS_PROFILER。通过这个包我们可以对被测的SP代码进行打桩,这个包不但可以获取被执行的代码行,而且还可以统计出代码执行的时间,也是用来做代码调优的有用工具。
工具包的使用也很方便:
- 安装工具包,只需要在sqlplus中运行profload.sql(/oracle_home/ rdbms/admin目录下)用
- 生成数据收集表,运行proftab.sql可以生成三张数据表,
plsql_profiler_runs :运行记录,最重要字段为runid。
plsql_profiler_units: 每次runid对应的各个unit的一般信息
plsql_profiler_data:每次runid对应的各个unit具体line的详细信息
- 代码打桩,在需要被测试的SP前调用dbms_profiler.start(),在sp执行结束的地方调用dbms_profiler.stop()。
在PL/SQL开头结尾添加即可
begin
DBMS_PROFILER.START_PROFILER('PLSQLNAME:'||TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MI:SS'));
pl/sql statements;
DBMS_PROFILER.STOP_PROFILER;
end;
通过上述过程,测试人员在做手工测试执行之前,需要先对要测试的代码进行打桩,或者可以通过plsql来对代码进行打桩。而开发人员在做单元测试的时候可以对自己的sp代码进行打桩。
2.覆盖率数据收集
需要从以下三张表中收集代码覆盖率数据:
All_source:
plsql_profiler_units:
plsql_profiler_data:
通过以下sql可以汇总覆盖率数据:
SELECT u.UNIT_OWNER || '.' || u.UNIT_NAME AS "Unit", s.line, CASE WHEN d.TOTAL_OCCUR >= 0 THEN 'C' ELSE '' END AS Covered, s.TEXT, TO_CHAR(d.TOTAL_TIME / (1000*1000*1000), 'fm990.000009') AS "Total Time (sec)", CASE WHEN NVL(d.TOTAL_OCCUR, 1) > 0 THEN d.TOTAL_OCCUR ELSE 1 END AS "# Iterations" , TO_CHAR(CASE WHEN d.TOTAL_OCCUR > 0 THEN d.TOTAL_TIME / (d.TOTAL_OCCUR * (1000*1000*1000))ELSE 0.0000 END, 'fm990.000009') AS "Avg Time (sec)" FROM all_source s LEFT JOIN plsql_profiler_units u ON s.OWNER = u.UNIT_OWNER AND s.NAME = u.UNIT_NAME AND s.TYPE = u.UNIT_TYPE LEFT JOIN plsql_profiler_data d ON u.UNIT_NUMBER = d.UNIT_NUMBER AND s.LINE = d.line# AND d.RUNID = u.RUNID WHERE u.unit_owner NOT IN ('SYSTEM','ULOG','<anonymous>') and s.TYPE not in ('PACKAGE SPEC')ORDER BY u.UNIT_NAME, s.LINE
得到如下图所示数据。

视图中Unit这个字段为存储过程的包名,covered这个字段中若是用代码被执行到就会被赋值为”C”,该字段的值主要是通过plsql_profiler_data中的total_occur这个字段的值来获取的,这个字段的值要是大于1那么,上图Iterations的值等于total_occur表示改行代码被执行的次数。此外视图中还有一些关于代码执行所花费的总体执行时间和平均执行时间的计算。
可以通过计算covered字段中”c”值的总体个数除以包中代码总行数来计算包中代码的行覆盖率。由于代码覆盖率的计算公式为:执行代码行数(executed lines)/总体代码行数(total lines)*100。因此若要提高代码覆盖率,可以通过降低总体代码行数或者增加执行代码行数,其中降低总体代码行数需要结合技术公司开发规范,如哪些代码是不需要被统计到总体代码行数中的。而增加执行代码行数则需要测试人员或者开发人员丰富测试用例来覆盖相关的代码行。这样才能得到一个比较科学的代码行覆盖率。
本次代码覆盖率工具的收集在第一阶段只能做到代码行覆盖,需要结合公司的开发规范进行统计。
3. 报告生成
主要通过java+bootstrap+cli等工具,封装生成基于命令行操作的代码覆盖率报告生成工具,首页展示所有package中sp总体的覆盖率信息,覆盖率计算通过analyzed lines/Total lines得出。点击每个package可以得到具体的覆盖率信息。


详细报告中可以看到具体代码覆盖情况,红色表示没有被覆盖到,其中ave time表示代码执行的平均时间。
目前这个版本数据库代码覆盖率工具还不够成熟,如DBMS_PRFILER不会剔除空行代码的执行,但是在覆盖率工具中我们已经剔除了空行,还有针对多行的sql,只会在第一行标上被覆盖,其实整句sql也就是说269以下的代码行都应该被覆盖,这就需要覆盖率工具需要去做些代码解析的工作,判断哪些代码应该被覆盖,如下图所示:

目前数据库代码覆盖率工具才完成第一个版本,后期会将代码开源到github.
oracle存储过程代码覆盖率统计工具的更多相关文章
- Python 代码覆盖率统计工具 coverage.py
coverage.py是一个用来统计python程序代码覆盖率的工具.它使用起来非常简单,并且支持最终生成界面友好的html报告.在最新版本中,还提供了分支覆盖的功能. 官方网站: http://ne ...
- Python 测试代码覆盖率统计工具 coverage.py
安装 您可以通常的方式安装coverage.py.最简单的方法是使用pip: $ pip install coverage 要安装预发布版本,您需要指定--pre: $ pip install --p ...
- C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用
gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- 使用oracle存储过程遇到的坑
之前一直都是用sqlserver 突然用oracle 蛋疼的连存储过程执行一个查询都不会 各种百度锕 现在记录下面的语法问题 orcale创建一个存储过程的语法. create or replac ...
- Oracle存储过程-自定义数据类型,集合,遍历取值
摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...
- Oracle存储过程创建及调用(转)
在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...
- Oracle存储过程 一个具体实例
表结构信息,并不是用oracle描述的,但是后面的存储过程是针对oracle的 ----------------个人交易流水表----------------------------------- c ...
- oracle存储过程加密
引言:平时大家在做项目的时候,经常会遇到把Oracle存储过程带到项目现场来测试系统.这时如果想对自己的存储过程进行保密,不使别人看到源代码,就可以对已有的存储过程进行加密保护.顾名思义,就是对Ora ...
随机推荐
- 百度CSND博客在搜索栏中显示图片
原先以为百度搜索结果有图片是能够人为控制的,结果发现并非这样. 近期百度搜索结果的每一个条目左側出现了小图片,这一变化能够说是极大满足了用户的体验,不用进入站点就提前直观的推断出站点内容是否是自己要找 ...
- swift UI特殊培训38 与滚动码ScrollView
有时我们适合页面的全部内容,我们需要使用ScrollView,额外的内容打通滚动. 什么样的宽度和高度首先,定义,健身器材轻松. let pageWidth = 320 let pageHeight ...
- MySQL当您插入列无效的数据插入
1.错误叙述性说明 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field li ...
- win7或windows server 2008 R2 被远程登录日志记录 系统日志
事件查看器 → Windows 日志 → 安全 (win7 事件查看器 打开方式 :计算机 右键 → 管理 → 计算机管理 → 系统工具 → 事件查看器 windows server 2008 ...
- validateRequest="false"属性及xss攻击
validateRequest="false" 指是否要IIS验证页面提交的非法字符,比如:>,<号等,当我们需要将一定格式得html代码获得,插入数据库时候,就要 ...
- hdoj 1226 超级password 【隐图BFS】
称号:hdoj 1226 超级password 分析:这题属于隐式图搜索,状态不是非常明显,须要自己建立. 事实上搜索说白了就是暴力. 这个题目就是,首先对给出的能够组成的全部的数依次枚举.长度从小到 ...
- Java实现顺序表
利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序 ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...
- Hadoop2.2.0--Hadoop Federation、Automatic HA、Yarn完全分布式集群结构
Hadoop有很多的上场时间,与系统上线.手头的事情略少.So,抓紧时间去通过一遍Hadoop2在下面Hadoop联盟(Federation).Hadoop2可用性(HA)及Yarn的全然分布式配置. ...
- NET 平台下的插件化开发内核
.NET 平台下的插件化开发内核(Rabbit Kernel) 每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...