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 ...
随机推荐
- 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)
解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂.,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 非常easy找到循环节为p-1,每个循环节中有一个非零的 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(七)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...
- DFS-leetcode Combination Sum I/I I
深度优先搜索(DFS)它是一个搜索算法.第一次接触DFS它应该是一个二进制树的遍历内部,二叉树预订.序和后序实际上属于深度遍历-first.在本质上,深度优先搜索,遍历中则看到了更纯正的深度优先搜索算 ...
- 异步编程和线程的使用(.NET 4.5 )
C#:异步编程和线程的使用(.NET 4.5 ) 异步编程和线程处理是并发或并行编程非常重要的功能特征.为了实现异步编程,可使用线程也可以不用.将异步与线程同时讲,将有助于我们更好的理解它们的特征 ...
- 照片详细解释YUV420数据格式
YUV格式有两大类:planar和packed. 对于planar的YUV格式.先连续存储全部像素点的Y.紧接着存储全部像素点的U.随后是全部像素点的V. 对于packed的YUV格式,每一个像素点的 ...
- POJ 2081 Recaman's Sequence(水的问题)
[简要题意]:这个主题是很短的叙述性说明.挺easy. 不重复. [分析]:只需要加一个判断这个数是否可以是一个数组,这个数组的范围. // 3388K 0Ms #include<iostrea ...
- 【Swift】沙盒缓存
本地sandbox缓存目录 沙盒の 主目录: po NSHomeDirectory() /Users/SpongeBob/Library/Developer/CoreSimulator/D ...
- 【百度地图API】如何制作孪生姐妹地图?
原文:[百度地图API]如何制作孪生姐妹地图? 任务描述: 我想要两张一模一样的地图!我想要双子地图!我想要孪生姐妹地图! 好好好,统统满足大家! 在这里我不需要使用百度地图API提供的地图缩略图控件 ...
- 脉冲神经网络Spiking neural network
(原文地址:维基百科) 简单介绍: 脉冲神经网络Spiking neuralnetworks (SNNs)是第三代神经网络模型,其模拟神经元更加接近实际,除此之外,把时间信息的影响也考虑当中.思路是这 ...
- Windbg Extension NetExt
Windbg Extension NetExt 摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR. N ...