From 89d546abb854d0854fd505449d10c02227086b76 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 18 Jul 2020 17:53:57 +0100 Subject: [PATCH 1/2] Extended UK on ut_coverage_sources_tmp table. Resolves #1086 TODO - need to fix coverage reporting so that coverage is grouped by object type not only object name --- .travis/install.sh | 2 +- source/core/coverage/ut_coverage.pkb | 6 +-- source/core/coverage/ut_coverage_block.pkb | 6 +-- source/core/coverage/ut_coverage_helper.pkb | 8 +-- source/core/coverage/ut_coverage_helper.pks | 2 + .../coverage/ut_coverage_helper_block.pkb | 15 +++--- .../coverage/ut_coverage_helper_block.pks | 4 +- .../coverage/ut_coverage_helper_profiler.pkb | 14 +++-- .../coverage/ut_coverage_helper_profiler.pks | 4 +- source/core/coverage/ut_coverage_profiler.pkb | 6 +-- .../core/coverage/ut_coverage_sources_tmp.sql | 3 +- test/ut3_tester_helper/coverage_helper.pkb | 53 +++++++++++++++++++ test/ut3_tester_helper/coverage_helper.pks | 3 ++ .../test_coverage/test_proftab_coverage.pkb | 21 ++++++++ .../test_coverage/test_proftab_coverage.pks | 5 ++ 15 files changed, 113 insertions(+), 39 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 225b6ff52..537fddb66 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -147,7 +147,7 @@ PROMPT Grants for testing coverage outside of main $UT3_DEVELOP_SCHEMA schema. grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary, create any synonym, drop any synonym, - grant any object privilege, grant any privilege, create public synonym, drop public synonym + grant any object privilege, grant any privilege, create public synonym, drop public synonym, create any trigger to $UT3_TESTER_HELPER; grant create job to $UT3_TESTER_HELPER; diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index a05fa554a..e1b7572be 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -48,7 +48,7 @@ create or replace package body ut_coverage is ), sources as ( select /*+ cardinality(f {mappings_cardinality}) */ - {l_full_name} as full_name, s.owner, s.name, + {l_full_name} as full_name, s.owner, s.name, s.type, s.line - case when s.type = 'TRIGGER' then o.offset else 0 end as line, s.text from {sources_view} s {join_file_mappings} @@ -58,7 +58,7 @@ create or replace package body ut_coverage is {filters} ), coverage_sources as ( - select full_name, owner, name, line, text, + select full_name, owner, name, type, line, text, case when -- to avoid execution of regexp_like on every line @@ -77,7 +77,7 @@ create or replace package body ut_coverage is end as to_be_skipped from sources s ) - select full_name, owner, name, line, to_be_skipped, text + select full_name, owner, name, type, line, to_be_skipped, text from coverage_sources s -- Exclude calls to utPLSQL framework, Unit Test packages and objects from a_exclude_list parameter of coverage reporter where (s.owner, s.name) not in ( select /*+ cardinality(el {skipped_objects_cardinality})*/el.owner, el.name from table(:l_skipped_objects) el ) diff --git a/source/core/coverage/ut_coverage_block.pkb b/source/core/coverage/ut_coverage_block.pkb index 0e0373a48..79fd42699 100644 --- a/source/core/coverage/ut_coverage_block.pkb +++ b/source/core/coverage/ut_coverage_block.pkb @@ -40,11 +40,7 @@ create or replace package body ut_coverage_block is exit when l_source_objects_crsr%notfound; --get coverage data - l_line_calls := ut_coverage_helper_block.get_raw_coverage_data( - l_source_object.owner, - l_source_object.name, - a_coverage_options.coverage_run_id - ); + l_line_calls := ut_coverage_helper_block.get_raw_coverage_data(l_source_object, a_coverage_options.coverage_run_id); --if there is coverage, we need to filter out the garbage (badly indicated data) if l_line_calls.count > 0 then --remove lines that should not be indicted as meaningful diff --git a/source/core/coverage/ut_coverage_helper.pkb b/source/core/coverage/ut_coverage_helper.pkb index 5762452c4..4c41aa2f6 100644 --- a/source/core/coverage/ut_coverage_helper.pkb +++ b/source/core/coverage/ut_coverage_helper.pkb @@ -36,8 +36,8 @@ create or replace package body ut_coverage_helper is begin forall i in 1 .. a_data.count insert into ut_coverage_sources_tmp - (full_name,owner,name,line,text, to_be_skipped) - values(a_data(i).full_name,a_data(i).owner,a_data(i).name,a_data(i).line,a_data(i).text,a_data(i).to_be_skipped); + (full_name,owner,name,type,line,text,to_be_skipped) + values(a_data(i).full_name,a_data(i).owner,a_data(i).name,a_data(i).type,a_data(i).line,a_data(i).text,a_data(i).to_be_skipped); end; procedure cleanup_tmp_table is @@ -60,12 +60,12 @@ create or replace package body ut_coverage_helper is l_result t_tmp_table_objects_crsr; begin open l_result for - select o.owner, o.name, o.full_name, max(o.line) as lines_count, + select o.owner, o.name, o.type, o.full_name, max(o.line) as lines_count, cast( collect(decode(to_be_skipped, 'Y', to_char(line))) as ut_varchar2_list ) as to_be_skipped_list from ut_coverage_sources_tmp o - group by o.owner, o.name, o.full_name; + group by o.owner, o.name, o.type, o.full_name; return l_result; end; diff --git a/source/core/coverage/ut_coverage_helper.pks b/source/core/coverage/ut_coverage_helper.pks index 955542633..632b18a0d 100644 --- a/source/core/coverage/ut_coverage_helper.pks +++ b/source/core/coverage/ut_coverage_helper.pks @@ -32,6 +32,7 @@ create or replace package ut_coverage_helper authid definer is full_name ut_coverage_sources_tmp.full_name%type, owner ut_coverage_sources_tmp.owner%type, name ut_coverage_sources_tmp.name%type, + type ut_coverage_sources_tmp.type%type, line ut_coverage_sources_tmp.line%type, to_be_skipped ut_coverage_sources_tmp.to_be_skipped%type, text ut_coverage_sources_tmp.text%type @@ -42,6 +43,7 @@ create or replace package ut_coverage_helper authid definer is type t_tmp_table_object is record( owner ut_coverage_sources_tmp.owner%type, name ut_coverage_sources_tmp.name%type, + type ut_coverage_sources_tmp.type%type, full_name ut_coverage_sources_tmp.full_name%type, lines_count integer, to_be_skipped_list ut_varchar2_list diff --git a/source/core/coverage/ut_coverage_helper_block.pkb b/source/core/coverage/ut_coverage_helper_block.pkb index 1ded434ba..6f0e66783 100644 --- a/source/core/coverage/ut_coverage_helper_block.pkb +++ b/source/core/coverage/ut_coverage_helper_block.pkb @@ -41,7 +41,7 @@ create or replace package body ut_coverage_helper_block is $end end; - function block_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw) return t_block_rows is + function block_results(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return t_block_rows is l_coverage_rows t_block_rows; l_ut_owner varchar2(250) := ut_utils.ut_owner; begin @@ -61,23 +61,26 @@ create or replace package body ut_coverage_helper_block is where r.coverage_run_id = :a_coverage_run_id and ccu.owner = :a_object_owner and ccu.name = :a_object_name + and ccu.type = :a_object_type group by ccb.line, ccb.block ) group by line order by line]' - bulk collect into l_coverage_rows using a_coverage_run_id, a_object_owner, a_object_name; + bulk collect into l_coverage_rows + using + a_coverage_run_id, a_object.owner, + a_object.name, a_object.type; + return l_coverage_rows; end; - function get_raw_coverage_data( - a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw - ) return ut_coverage_helper.t_unit_line_calls is + function get_raw_coverage_data(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return ut_coverage_helper.t_unit_line_calls is l_tmp_data t_block_rows; l_results ut_coverage_helper.t_unit_line_calls; begin $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then - l_tmp_data := block_results(a_object_owner, a_object_name, a_coverage_run_id); + l_tmp_data := block_results(a_object, a_coverage_run_id); for i in 1 .. l_tmp_data.count loop l_results(l_tmp_data(i).line).blocks := l_tmp_data(i).blocks; diff --git a/source/core/coverage/ut_coverage_helper_block.pks b/source/core/coverage/ut_coverage_helper_block.pks index 9d24989d6..18adf4fbd 100644 --- a/source/core/coverage/ut_coverage_helper_block.pks +++ b/source/core/coverage/ut_coverage_helper_block.pks @@ -20,9 +20,7 @@ create or replace package ut_coverage_helper_block authid current_user is procedure coverage_stop; - function get_raw_coverage_data( - a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw - ) return ut_coverage_helper.t_unit_line_calls; + function get_raw_coverage_data(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return ut_coverage_helper.t_unit_line_calls; end; / diff --git a/source/core/coverage/ut_coverage_helper_profiler.pkb b/source/core/coverage/ut_coverage_helper_profiler.pkb index dde3bf3ea..dacfcbaa3 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pkb +++ b/source/core/coverage/ut_coverage_helper_profiler.pkb @@ -55,7 +55,7 @@ create or replace package body ut_coverage_helper_profiler is dbms_profiler.stop_profiler(); end; - function proftab_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw) return t_proftab_rows is + function proftab_results(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return t_proftab_rows is l_coverage_rows t_proftab_rows; begin select @@ -69,21 +69,19 @@ create or replace package body ut_coverage_helper_profiler is join ut_coverage_runs r on r.line_coverage_id = u.runid where r.coverage_run_id = a_coverage_run_id - and u.unit_owner = a_object_owner - and u.unit_name = a_object_name - and u.unit_type in ('PACKAGE BODY', 'TYPE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER') + and u.unit_owner = a_object.owner + and u.unit_name = a_object.name + and u.unit_type = a_object.type group by d.line#; return l_coverage_rows; end; - function get_raw_coverage_data( - a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw - ) return ut_coverage_helper.t_unit_line_calls is + function get_raw_coverage_data(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return ut_coverage_helper.t_unit_line_calls is l_tmp_data t_proftab_rows; l_results ut_coverage_helper.t_unit_line_calls; begin - l_tmp_data := proftab_results(a_object_owner, a_object_name, a_coverage_run_id); + l_tmp_data := proftab_results(a_object, a_coverage_run_id); for i in 1 .. l_tmp_data.count loop l_results(l_tmp_data(i).line).calls := l_tmp_data(i).calls; diff --git a/source/core/coverage/ut_coverage_helper_profiler.pks b/source/core/coverage/ut_coverage_helper_profiler.pks index 390495810..f105d3c9c 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pks +++ b/source/core/coverage/ut_coverage_helper_profiler.pks @@ -24,9 +24,7 @@ create or replace package ut_coverage_helper_profiler authid definer is procedure coverage_resume; - function get_raw_coverage_data( - a_object_owner varchar2, a_object_name varchar2, a_coverage_run_id raw - ) return ut_coverage_helper.t_unit_line_calls; + function get_raw_coverage_data(a_object ut_coverage_helper.t_tmp_table_object, a_coverage_run_id raw) return ut_coverage_helper.t_unit_line_calls; end; / diff --git a/source/core/coverage/ut_coverage_profiler.pkb b/source/core/coverage/ut_coverage_profiler.pkb index 274f6949c..6d9f894d5 100644 --- a/source/core/coverage/ut_coverage_profiler.pkb +++ b/source/core/coverage/ut_coverage_profiler.pkb @@ -34,11 +34,7 @@ create or replace package body ut_coverage_profiler is exit when l_source_objects_crsr%notfound; --get coverage data - l_line_calls := ut_coverage_helper_profiler.get_raw_coverage_data( - l_source_object.owner, - l_source_object.name, - a_coverage_options.coverage_run_id - ); + l_line_calls := ut_coverage_helper_profiler.get_raw_coverage_data( l_source_object, a_coverage_options.coverage_run_id); --if there is coverage, we need to filter out the garbage (badly indicated data from dbms_profiler) if l_line_calls.count > 0 then diff --git a/source/core/coverage/ut_coverage_sources_tmp.sql b/source/core/coverage/ut_coverage_sources_tmp.sql index f53283dcd..abaae5353 100644 --- a/source/core/coverage/ut_coverage_sources_tmp.sql +++ b/source/core/coverage/ut_coverage_sources_tmp.sql @@ -15,10 +15,11 @@ create global temporary table ut_coverage_sources_tmp( full_name varchar2(4000), owner varchar2(250), name varchar2(250), + type varchar2(250), line number(38,0), to_be_skipped varchar2(1), text varchar2(4000), - constraint ut_coverage_sources_tmp_pk primary key (owner,name,line) + constraint ut_coverage_sources_tmp_pk primary key (owner,name,type,line) ) on commit preserve rows; --is this needed? diff --git a/test/ut3_tester_helper/coverage_helper.pkb b/test/ut3_tester_helper/coverage_helper.pkb index 9b595a0b3..73dec720b 100644 --- a/test/ut3_tester_helper/coverage_helper.pkb +++ b/test/ut3_tester_helper/coverage_helper.pkb @@ -246,5 +246,58 @@ create or replace package body coverage_helper is return run_code_as_job( l_plsql_block ); end; + procedure create_dup_object_name is + pragma autonomous_transaction; + begin + execute immediate 'create table ut3_develop.test_table(id integer)'; + execute immediate q'[ + create or replace trigger ut3_develop.duplicate_name + before insert on ut3_develop.test_table + begin + + dbms_output.put_line('A'); + end; + ]'; + execute immediate q'[ + create or replace package ut3_develop.duplicate_name is + procedure some_procedure; + end; + ]'; + execute immediate q'[ + create or replace package body ut3_develop.duplicate_name is + procedure some_procedure is + begin + insert into test_table(id) values(1); + end; + end; + ]'; + execute immediate q'[ + create or replace package ut3_develop.test_duplicate_name is + --%suite + + --%test + procedure run_duplicate_name; + end; + ]'; + execute immediate q'[ + create or replace package body ut3_develop.test_duplicate_name is + procedure run_duplicate_name is + l_actual sys_refcursor; + begin + ut3_develop.duplicate_name.some_procedure; + ut.expect(l_actual).to_have_count(1); + end; + end; + ]'; + end; + + procedure drop_dup_object_name is + pragma autonomous_transaction; + begin + execute immediate 'drop table ut3_develop.test_table'; + execute immediate 'drop package ut3_develop.duplicate_name'; + execute immediate 'drop package ut3_develop.test_duplicate_name'; + end; + end; / diff --git a/test/ut3_tester_helper/coverage_helper.pks b/test/ut3_tester_helper/coverage_helper.pks index b044c897b..9a3bd1db6 100644 --- a/test/ut3_tester_helper/coverage_helper.pks +++ b/test/ut3_tester_helper/coverage_helper.pks @@ -22,5 +22,8 @@ create or replace package coverage_helper is procedure create_test_results_table; procedure drop_test_results_table; + procedure drop_dup_object_name; + procedure create_dup_object_name; + end; / diff --git a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb index c6e087462..9fbc24718 100644 --- a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb +++ b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb @@ -92,6 +92,27 @@ create or replace package body test_proftab_coverage is ut.expect(l_actual).to_be_like(l_expected); end; + procedure dup_object_name_coverage is + l_actual clob; + l_expected clob; + begin + l_expected := '%'; + --Act + l_actual := + ut3_tester_helper.coverage_helper.run_tests_as_job( + q'[ + ut3_develop.ut.run( + a_path => 'ut3_develop.test_duplicate_name', + a_reporter=> ut3_develop.ut_coverage_sonar_reporter( ), + a_include_objects => ut3_develop.ut_varchar2_list( 'ut3_develop.duplicate_name' ) + ) + ]' + ); + --Assert + --TODO - need to fix coverage reporting so that coverage is grouped by object type not only object name + ut.expect(l_actual).to_be_like(l_expected); + end; + procedure coverage_tmp_data_refresh is l_actual clob; l_test_code varchar2(32767); diff --git a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pks b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pks index 055422bf7..740862f86 100644 --- a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pks +++ b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pks @@ -14,6 +14,11 @@ create or replace package test_proftab_coverage is --%test(Coverage is gathered for specified file - default coverage type) procedure coverage_for_file; + + --%beforetest(ut3_tester_helper.coverage_helper.create_dup_object_name) + --%aftertest(ut3_tester_helper.coverage_helper.drop_dup_object_name) + --%test(Coverage on duplicate object name) + procedure dup_object_name_coverage; --%test(Coverage data is not cached between runs - issue #562 ) --%aftertest(ut3_tester_helper.coverage_helper.drop_dummy_coverage_1) From e96b9780257ee0bcf73404db1440a2248d9169e4 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 20 Jul 2020 01:00:00 +0100 Subject: [PATCH 2/2] Added object type to name in coverage reports. Fixed issue with reporting non-block coverage as block coverage. Resolves #1086 --- source/core/coverage/ut_coverage.pkb | 2 +- source/core/coverage/ut_coverage_helper_block.pkb | 1 + .../test_coverage/test_coverage_standalone.pkb | 2 +- .../test_coverage/test_coveralls_reporter.pkb | 2 +- .../test_coverage/test_extended_coverage.pkb | 6 +++--- .../test_coverage/test_proftab_coverage.pkb | 14 ++++++++------ 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index e1b7572be..81d17704a 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -93,7 +93,7 @@ create or replace package body ut_coverage is and s.type = f.object_type and s.owner = f.object_owner'; else - l_full_name := q'[lower(s.owner||'.'||s.name)]'; + l_full_name := q'[lower(s.type||' '||s.owner||'.'||s.name)]'; l_filters := case when a_coverage_options.include_objects is not empty then ' and (s.owner, s.name) in ( diff --git a/source/core/coverage/ut_coverage_helper_block.pkb b/source/core/coverage/ut_coverage_helper_block.pkb index 6f0e66783..e030f2c37 100644 --- a/source/core/coverage/ut_coverage_helper_block.pkb +++ b/source/core/coverage/ut_coverage_helper_block.pkb @@ -65,6 +65,7 @@ create or replace package body ut_coverage_helper_block is group by ccb.line, ccb.block ) group by line + having count(block) > 1 order by line]' bulk collect into l_coverage_rows using diff --git a/test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb b/test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb index ef7014235..bcd933eed 100644 --- a/test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb +++ b/test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb @@ -5,7 +5,7 @@ create or replace package body test_coverage_standalone is l_block_cov clob; l_file_path varchar2(250); begin - l_file_path := 'ut3_develop.'||a_object_name; + l_file_path := 'package body ut3_develop.'||a_object_name; --Arrange if ut3_tester_helper.coverage_helper.block_coverage_available then l_block_cov := ''; diff --git a/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb index 48a62f7f6..e3806cd97 100644 --- a/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb +++ b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb @@ -41,7 +41,7 @@ null, begin --Arrange l_expected := q'[{"source_files":[ -{ "name": "ut3_develop.]'||ut3_tester_helper.coverage_helper.covered_package_name||q'[", +{ "name": "package body ut3_develop.]'||ut3_tester_helper.coverage_helper.covered_package_name||q'[", "coverage": [ 0, 0, diff --git a/test/ut3_user/reporters/test_coverage/test_extended_coverage.pkb b/test/ut3_user/reporters/test_coverage/test_extended_coverage.pkb index 4b995b7c8..ec95c0bfb 100644 --- a/test/ut3_user/reporters/test_coverage/test_extended_coverage.pkb +++ b/test/ut3_user/reporters/test_coverage/test_extended_coverage.pkb @@ -15,7 +15,7 @@ create or replace package body test_extended_coverage is l_actual clob; begin --Arrange - l_expected := '%' || + l_expected := '%' || get_block_coverage_line|| '%%'; --Act @@ -38,7 +38,7 @@ create or replace package body test_extended_coverage is l_actual clob; begin --Arrange - l_expected := '%' || + l_expected := '%' || get_block_coverage_line || '%%'; --Act @@ -54,7 +54,7 @@ create or replace package body test_extended_coverage is ); --Assert ut.expect(l_actual).to_be_like(l_expected); - ut.expect(l_actual).to_be_like('%%%'); + ut.expect(l_actual).to_be_like('%%%'); end; procedure coverage_for_file is diff --git a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb index 9fbc24718..6171ecb80 100644 --- a/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb +++ b/test/ut3_user/reporters/test_coverage/test_proftab_coverage.pkb @@ -5,7 +5,7 @@ create or replace package body test_proftab_coverage is l_actual clob; begin --Arrange - l_expected := coverage_helper.substitute_covered_package('%%'); + l_expected := coverage_helper.substitute_covered_package('%%'); --Act l_actual := ut3_tester_helper.coverage_helper.run_tests_as_job( @@ -28,7 +28,7 @@ create or replace package body test_proftab_coverage is l_actual clob; begin --Arrange - l_expected := coverage_helper.substitute_covered_package('%%'); + l_expected := coverage_helper.substitute_covered_package('%%'); --Act l_actual := ut3_tester_helper.coverage_helper.run_tests_as_job( @@ -51,7 +51,7 @@ create or replace package body test_proftab_coverage is l_actual clob; begin --Arrange - l_expected := ''; + l_expected := ''; l_expected := '%'||l_expected||'%'||l_expected||'%'; --Act l_actual := @@ -96,7 +96,9 @@ create or replace package body test_proftab_coverage is l_actual clob; l_expected clob; begin - l_expected := '%'; + l_expected := + '%%' || + '%%%'; --Act l_actual := ut3_tester_helper.coverage_helper.run_tests_as_job( @@ -164,11 +166,11 @@ create or replace package body test_proftab_coverage is -ut3_develop.{p} +package body ut3_develop.{p} - +