目前针对于高级语言如C++,JAVA,C#等工程都有相关的代码覆盖率统计工具,但是对于oracle存储过程或者数据库sql等方面的项目,代码覆盖率统计和扫描工具相对较少。

因此针对这种情况,设计了代码覆盖率统计工具,其实oracle已经提供了较好的代码profiler包,本文主要介绍利用DBMS_PROFILER设计的代码覆盖率统计工具。

1.代码打桩

获取代码覆盖率的前提是,需要对被测代码进行profiler,也就是打桩,需要有一个计数器去统计被执行到的代码行。Oracle提供了一个有用的工具包叫DBMS_PROFILER。通过这个包我们可以对被测的SP代码进行打桩,这个包不但可以获取被执行的代码行,而且还可以统计出代码执行的时间,也是用来做代码调优的有用工具。

工具包的使用也很方便:

  1. 安装工具包,只需要在sqlplus中运行profload.sql(/oracle_home/ rdbms/admin目录下)用
  2. 生成数据收集表,运行proftab.sql可以生成三张数据表,

plsql_profiler_runs :运行记录,最重要字段为runid。

plsql_profiler_units: 每次runid对应的各个unit的一般信息

plsql_profiler_data:每次runid对应的各个unit具体line的详细信息

  1. 代码打桩,在需要被测试的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存储过程代码覆盖率统计工具的更多相关文章

  1. Python 代码覆盖率统计工具 coverage.py

    coverage.py是一个用来统计python程序代码覆盖率的工具.它使用起来非常简单,并且支持最终生成界面友好的html报告.在最新版本中,还提供了分支覆盖的功能. 官方网站: http://ne ...

  2. Python 测试代码覆盖率统计工具 coverage.py

    安装 您可以通常的方式安装coverage.py.最简单的方法是使用pip: $ pip install coverage 要安装预发布版本,您需要指定--pre: $ pip install --p ...

  3. C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用

    gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...

  4. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  5. 使用oracle存储过程遇到的坑

    之前一直都是用sqlserver 突然用oracle  蛋疼的连存储过程执行一个查询都不会 各种百度锕  现在记录下面的语法问题 orcale创建一个存储过程的语法. create or replac ...

  6. Oracle存储过程-自定义数据类型,集合,遍历取值

    摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...

  7. Oracle存储过程创建及调用(转)

    在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...

  8. Oracle存储过程 一个具体实例

    表结构信息,并不是用oracle描述的,但是后面的存储过程是针对oracle的 ----------------个人交易流水表----------------------------------- c ...

  9. oracle存储过程加密

    引言:平时大家在做项目的时候,经常会遇到把Oracle存储过程带到项目现场来测试系统.这时如果想对自己的存储过程进行保密,不使别人看到源代码,就可以对已有的存储过程进行加密保护.顾名思义,就是对Ora ...

随机推荐

  1. 14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想

    发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director ...

  2. HTML5游戏开发引擎Pixi.js完全入门手册(一)框架简介及框架结构分析,作者思路剖析

    前言: 最近无聊在淘宝弄了个小店,打算做一个兼职.遇到一个客户,要我帮忙拷贝一个html5游戏.. 我这人有一个习惯,拿到自己没见过的东西.都会去研究一番.去网上查了下发现,资料都是英文版.感觉极度不 ...

  3. LevelDB初体验

    近期工作须要找一个能使用磁盘存储数据,对写要求比較苛刻,须要每秒达100000TPS,读的时候须要能10000TPS左右,不能占用太多内存.单节点满足这个要求的常见有Redis.Memcached等, ...

  4. Lake Counting (DFS)

    N*M的园子,雨后积起了水.八连通的积水背认为是连接在一起的.请求出园子里总共有多少水洼? dfs(Depth-First  Search)  八个方向的简单搜索.... 深度优先搜索从最开始的状态出 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

  6. 代码走查工具StyleCop建议采用的规则总结

    代码走查工具StyleCop建议采用的规则总结 续接上篇:代码走查工具篇SytleCop的规则总结与翻译,本篇主要是以我个人的观点总结的一份建议使用的Rule点. 建议使用的Rule点 1.公共的接口 ...

  7. PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

    <?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo &q ...

  8. C--指针数组

    一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,他们都有相应的地址,所谓数组的指针是指数组的其实地址,数组元素的指针是数组元素的地址. 一个数组是有连续的一块内存单元组成 ...

  9. outlook自动备份

    在 这里 下载 http://support.microsoft.com/kb/238782

  10. jQuery整理您的笔记----jQuery开始

    Jquery它是一种高速.简明的JavaScript相框,jQuery设计目标:Write Less,Do More(写更少的代码,做很多其他的事情). 一.Jquery框架优势: 1.轻量级 jQu ...