目前针对于高级语言如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. HDU 2082-找单词(母函数)

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  2. 一个由proguard与fastJson引起的血案(转)

    更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆 根本原因,fastjson使用姿势不对. 问题描述: 一个发件人列表里,应当呈现的数据(这里命名为Com ...

  3. projecteuler----&gt;problem=34----Digit factorials

    Problem 34 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all number ...

  4. 微信公众号PHP简单开发流程

    原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...

  5. vs2012代码段,快捷键,snippet 的使用

    这篇还是介绍怎么简单我们编写代码------本想放在上一篇   插件    一起,但是怕搜不到, 大神们就没法给我教更好的方式,所以就另写了一篇 [大家看完后,插件resharp如果能实现这效果,请教 ...

  6. C#实现对mongoDB的简单增删查改

    首先添加所需要驱动包(可通过nuget获得) using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Builders; 一.设置配置 ...

  7. 2014年辛星jquery解读第二节

    *************jquery的语法****************** 1.jquery是通过选取HTML元素,而且对选取的元素运行某些操作,从而完毕某些特效的. 2.因此,我们在使用jQu ...

  8. Swift 语言概览 -自己在Xcode6 动手写1

    原文:Swift 语言概览 -自己在Xcode6 动手写1 Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language ...

  9. 我所理解的Spring AOP的基本概念

    Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了非常多样例后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 如果一个OA系统中的一个 ...

  10. Emojicon - 为你提供emoji表情的整套方案

    Github : https://github.com/rockerhieu/emojicon 事实上国内的<表情大全>也有提供类似整套表情解决方式,并且还支持gif表情:http://w ...