此问题已在此处有答案:
Code coverage for PL/SQL(6个答案)
8天前关闭
截至6天前,社区正在审查是否重新讨论这个问题。
我使用DBMS_PROFILER对我的PL/SQL包进行基本分析。我还使用它通过以下查询获取代码覆盖率统计信息:
SELECT EXEC.unit_name unitname,ROUND (EXEC.cnt/total.cnt * 100, 1) Code_coverage FROM
(SELECT u.unit_name, COUNT(1) cnt FROM plsql_profiler_data d, plsql_profiler_units u WHERE u.unit_number = d.unit_number GROUP BY u.unit_name) total,
(SELECT u.unit_name, COUNT(1) cnt FROM plsql_profiler_data d, plsql_profiler_units u WHERE u.unit_number = d.unit_number AND d.total_occur > 0 GROUP BY u.unit_name) EXEC
WHERE EXEC.unit_name = total.unit_name
我在每个分析器运行之前清除plsql_profiler_data、plsql_profiler_units、plsql_profiler_runs表,这样就不需要每次都知道运行id。
这将为我提供有关在分析期间覆盖的代码百分比的软件包信息。现在,我试图看看这是否可以作为一个正常的覆盖率报告,在那里我可以知道哪一行代码被覆盖,哪一行没有(比如说选择lineOfCode,iscovered from...),这样我就可以用html格式来构建一个报告,以指示一行代码是否被覆盖。
我不太精通Oracle的表结构,不太了解函数和过程保存在哪里等。(从博客中获得上述查询,并稍微修改以删除运行ID)
这可能吗?
如果是这样,我如何才能做到这一点?
编辑:这与Code coverage for PL/SQL不同,我已经在使用DBMS Profiler。我的问题是关于构建报告。
2条答案
按热度按时间ufj5ltwl1#
我想这是你追求的目标:
有几个问题需要记住。
1)
plsql_profiler_data
表中的许多行在其TOTAL_TIME
列中将NOT具有准确的值,因为它们的执行速度比计时器的分辨率快。Ask Tom re:timings:
使用一些时间单位来收集定时,通常仅粒度到HSECS。
这意味着许多离散事件,需要不到1/100秒,似乎需要零秒。
许多花费不到1/100秒的离散事件可能看起来花费1/100秒。
2)多行语句中只有FIRST行显示为已覆盖。因此,如果您将
INSERT
或其他内容拆分为多行,我不知道有什么简单的方法可以将该语句的 * 每 * 行显示为注解源代码风格的报告。此外,请查看Oracle的dbms_profiler文档和this有用的包参考,以帮助根据收集的profiler数据制作查询。
5kgi1eie2#
实际上,有一些PL/SQL工具可以进行代码覆盖。有关详细信息,请参阅此question的答案。
也就是说,您可以在下表中找到有关用户创建的数据结构和代码的信息:
user_source
:在这里,您可以在TEXT
字段中找到源代码,其代表为function、procedure、package等。User_tables
user_indexes
user_types
:如果你使用某种OO代码。user_
开头的其他表。基本上,您需要检查针对
user_source
的查询结果,并从其他表中获取额外的信息。