Skip to content

Coverage report only on test packages #367

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
safokkens opened this issue Jun 27, 2017 · 14 comments
Closed

Coverage report only on test packages #367

safokkens opened this issue Jun 27, 2017 · 14 comments

Comments

@safokkens
Copy link

On a test database I've created a simple database package (app_tooling) and I'm testing it with two unit test packages (tst_between_string and tst_hello_world).

When running a coverage report (every style) I get the coverage of the two tst-packages, but what I want is the coverage of my software (app_tooling). Could this be a bug, or am I doing something wrong?

When I look at the profiler-tables, I see profiler data for all three packages so the coverage is indeed recorded.

@jgebal
Copy link
Member

jgebal commented Jun 27, 2017

You should be able to see coverage on the source code rather than on the test packages.
What command are you using to execute tests with coverage?
What utPLSQL version are you using?
Are all 3 packages in the same schema?

@safokkens
Copy link
Author

I'm using v3.0.1, alle three packages are in the same schema (ut3test).

This is the command I use:

set serveroutput on

begin
  ut.run(ut_coverage_sonar_reporter);
end;

This is the output:

<coverage version="1">
<file path="ut3test.tst_between_string">
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="7" covered="true"/>
<lineToCover lineNumber="12" covered="true"/>
</file>
<file path="ut3test.tst_hello_world">
<lineToCover lineNumber="5" covered="true"/>
<lineToCover lineNumber="10" covered="true"/>
</file>
</coverage>

And this is what plsql_profiler_* tells me:

RUNID UNIT_NUMBER UNIT_OWNER UNIT_NAME            LINE#  TOTAL_OCCUR
----- ----------- ---------- -------------------- ----- ------------
    6           6 UT3TEST    TST_BETWEEN_STRING       1            0
    6           6 UT3TEST    TST_BETWEEN_STRING       3            0
    6           6 UT3TEST    TST_BETWEEN_STRING       5            0
    6           6 UT3TEST    TST_BETWEEN_STRING       7            1
    6           6 UT3TEST    TST_BETWEEN_STRING       8            1
    6           6 UT3TEST    TST_BETWEEN_STRING      10            0
    6           6 UT3TEST    TST_BETWEEN_STRING      12            1
    6           6 UT3TEST    TST_BETWEEN_STRING      13            1
    6           6 UT3TEST    TST_BETWEEN_STRING      15            0
    6           7 UT3TEST    APP_TOOLING              2            0
    6           7 UT3TEST    APP_TOOLING              4            2
    6           7 UT3TEST    APP_TOOLING              6            2
    6           7 UT3TEST    APP_TOOLING              7            2
    6           7 UT3TEST    APP_TOOLING              8            2
    6           7 UT3TEST    APP_TOOLING             14            2
    6           7 UT3TEST    APP_TOOLING             15            0
    6           7 UT3TEST    APP_TOOLING             19            2
    6           7 UT3TEST    APP_TOOLING             20            0
    6           7 UT3TEST    APP_TOOLING             22            2
    6           7 UT3TEST    APP_TOOLING             24            2
    6           7 UT3TEST    APP_TOOLING             26            2
    6           7 UT3TEST    APP_TOOLING             27            0
    6           7 UT3TEST    APP_TOOLING             29            2
    6           7 UT3TEST    APP_TOOLING             32            2
    6           7 UT3TEST    APP_TOOLING             33            0
    6           7 UT3TEST    APP_TOOLING             34            0
    6           7 UT3TEST    APP_TOOLING             37            2
    6           7 UT3TEST    APP_TOOLING             38            2
    6           7 UT3TEST    APP_TOOLING             39            2
    6           7 UT3TEST    APP_TOOLING             42            2
    6           7 UT3TEST    APP_TOOLING             45            2
    6           7 UT3TEST    APP_TOOLING             51            2
    6           7 UT3TEST    APP_TOOLING             55            2
    6           7 UT3TEST    APP_TOOLING             56            2
    6           7 UT3TEST    APP_TOOLING             58            0
    6           7 UT3TEST    APP_TOOLING             61            2
    6           7 UT3TEST    APP_TOOLING             62            1
    6           7 UT3TEST    APP_TOOLING             64            1
    6           7 UT3TEST    APP_TOOLING             67            2
    6           7 UT3TEST    APP_TOOLING             68            2
    6          12 UT3TEST    TST_HELLO_WORLD          3            0
    6          12 UT3TEST    TST_HELLO_WORLD          5            1
    6          12 UT3TEST    TST_HELLO_WORLD          6            1
    6          12 UT3TEST    TST_HELLO_WORLD          8            0
    6          12 UT3TEST    TST_HELLO_WORLD         10            1
    6          12 UT3TEST    TST_HELLO_WORLD         11            1

 46 rows selected

@jgebal jgebal added the bug label Jun 27, 2017
@jgebal jgebal added this to the v3.0.2 milestone Jun 27, 2017
@jgebal
Copy link
Member

jgebal commented Jun 27, 2017

This is a very odd behavior.
I find it hard to reproduce.
The code behaves quite the opposite - does not report on tests and reports on tested code.

Can you share package spec of the test and tested code as well as the test results of:

set serveroutput on

begin
  ut.run();
end;

Thanks
Jacek

@jgebal jgebal added discussion and removed bug labels Jun 27, 2017
@jgebal jgebal removed this from the v3.0.2 milestone Jun 27, 2017
@safokkens
Copy link
Author

Here they are!

testresult.txt

packages_issue_367.zip

@safokkens
Copy link
Author

Hello,

The issue has been tagged as discussion. I wonder if there's some progress in the discussion.
Maybe I can help with some extra information?

@jgebal
Copy link
Member

jgebal commented Jul 7, 2017

Hi @safokkens
I've taken your code and tested it on one of my local databases.

set serveroutput on

begin
  ut.run(ut_coverage_sonar_reporter);
end;
/

Here is what I got:

<coverage version="1">
<file path="jacek.award_bonus">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
<lineToCover lineNumber="16" covered="false"/>
</file>
<file path="jacek.betwnstr">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
</file>
<file path="jacek.cleanup_temp_tables">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
</file>
<file path="jacek.insert_dummy_notes">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
<lineToCover lineNumber="16" covered="false"/>
<lineToCover lineNumber="17" covered="false"/>
<lineToCover lineNumber="18" covered="false"/>
<lineToCover lineNumber="19" covered="false"/>
<lineToCover lineNumber="20" covered="false"/>
<lineToCover lineNumber="21" covered="false"/>
<lineToCover lineNumber="22" covered="false"/>
<lineToCover lineNumber="23" covered="false"/>
<lineToCover lineNumber="24" covered="false"/>
<lineToCover lineNumber="25" covered="false"/>
<lineToCover lineNumber="26" covered="false"/>
<lineToCover lineNumber="27" covered="false"/>
<lineToCover lineNumber="28" covered="false"/>
<lineToCover lineNumber="29" covered="false"/>
<lineToCover lineNumber="30" covered="false"/>
<lineToCover lineNumber="31" covered="false"/>
<lineToCover lineNumber="32" covered="false"/>
<lineToCover lineNumber="33" covered="false"/>
<lineToCover lineNumber="34" covered="false"/>
<lineToCover lineNumber="35" covered="false"/>
<lineToCover lineNumber="36" covered="false"/>
<lineToCover lineNumber="37" covered="false"/>
<lineToCover lineNumber="38" covered="false"/>
<lineToCover lineNumber="39" covered="false"/>
<lineToCover lineNumber="40" covered="false"/>
<lineToCover lineNumber="41" covered="false"/>
<lineToCover lineNumber="42" covered="false"/>
<lineToCover lineNumber="43" covered="false"/>
<lineToCover lineNumber="44" covered="false"/>
<lineToCover lineNumber="45" covered="false"/>
<lineToCover lineNumber="46" covered="false"/>
<lineToCover lineNumber="47" covered="false"/>
<lineToCover lineNumber="48" covered="false"/>
<lineToCover lineNumber="49" covered="false"/>
<lineToCover lineNumber="50" covered="false"/>
<lineToCover lineNumber="51" covered="false"/>
<lineToCover lineNumber="52" covered="false"/>
<lineToCover lineNumber="53" covered="false"/>
<lineToCover lineNumber="54" covered="false"/>
<lineToCover lineNumber="55" covered="false"/>
<lineToCover lineNumber="56" covered="false"/>
<lineToCover lineNumber="57" covered="false"/>
<lineToCover lineNumber="58" covered="false"/>
<lineToCover lineNumber="59" covered="false"/>
<lineToCover lineNumber="60" covered="false"/>
<lineToCover lineNumber="61" covered="false"/>
</file>
<file path="jacek.print_crsr">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
</file>
<file path="jacek.remove_rooms_by_name">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
</file>
<file path="jacek.test_sess">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
</file>
<file path="jacek.tst_between_string">
<lineToCover lineNumber="3" covered="true"/>
<lineToCover lineNumber="7" covered="true"/>
<lineToCover lineNumber="12" covered="true"/>
</file>
<file path="jacek.tst_hello_world">
<lineToCover lineNumber="5" covered="true"/>
<lineToCover lineNumber="10" covered="true"/>
</file>
</coverage>
 PL/SQL procedure successfully completed.

I cannot reproduce the issue, even using your code.
The coverage reporting behaves as expected - unit test code is skipped and the rest is considered tested code.

Sorry but I run out of ideas to help you.
Maybe someone was messing with the source code of utPLSQL v3 you have installed?

@safokkens
Copy link
Author

Thank you for your answer.

When I look at your output, I see a lot of functions that are not from my test package APP_TOOLING. I think those are your own tests, so I will ignore those (award_bonus, betwn_str, cleanup_temp_tables, insert_dummy_notes, print_crsr, remove_rooms_by_name and test_sess).

All coverage that's left are the ones from tst_between_string en tst_hello_world. Exactly the same packages I get when running a coverage report. You reproduced the same behavior!

I want to differentiate three kinds of packages:

  1. utPLSQL packages in its own database schema (i.e. UTP)
  2. packages that contain the defined unit tests, in my case TST_BETWEEN_STRING and TST_HELLO_WORLD
  3. packages that contain the software that's about to get tested, in my case APP_TOOLING

What I want to see in Sonar is a report of the portion of our software that is tested. This gives me the code coverage. So I want a report over APP_TOOLING.

What I get is a report about which portion of TST_BETWEEN_STRING en TST_HELLO_WORLD are run.

@jgebal
Copy link
Member

jgebal commented Jul 10, 2017

Why is your -- %suitepath = app_tooling?
This is exactly the same as the name of the package you are testing.
The APP_TOOLING package is therefore becoming root of your test suite and is physically bound to the test and is therefore filtered by the coverage.
This seems like an unsupported behavior. @Pazus what do you think?

Another side effect/issue is the fact that packages: TST_BETWEEN_STRING and TST_HELLO_WORLD got reported. This is coverage filtering issue - filter is not selective enough (badly formed).

@jgebal
Copy link
Member

jgebal commented Jul 10, 2017

When I change to: --%suitepath(dummy) i get:

<coverage version="1">
<file path="jacek.app_tooling">
<lineToCover lineNumber="4" covered="true"/>
<lineToCover lineNumber="6" covered="true"/>
<lineToCover lineNumber="7" covered="true"/>
<lineToCover lineNumber="8" covered="true"/>
<lineToCover lineNumber="14" covered="true"/>
<lineToCover lineNumber="15" covered="false"/>
<lineToCover lineNumber="19" covered="true"/>
<lineToCover lineNumber="20" covered="false"/>
<lineToCover lineNumber="22" covered="true"/>
<lineToCover lineNumber="26" covered="true"/>
<lineToCover lineNumber="27" covered="false"/>
<lineToCover lineNumber="29" covered="true"/>
<lineToCover lineNumber="32" covered="true"/>
<lineToCover lineNumber="33" covered="false"/>
<lineToCover lineNumber="38" covered="false"/>
<lineToCover lineNumber="41" covered="true"/>
<lineToCover lineNumber="44" covered="true"/>
<lineToCover lineNumber="54" covered="true"/>
<lineToCover lineNumber="60" covered="true"/>
<lineToCover lineNumber="61" covered="true"/>
<lineToCover lineNumber="63" covered="true"/>
<lineToCover lineNumber="66" covered="true"/>
</file>
<file path="jacek.award_bonus">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
<lineToCover lineNumber="16" covered="false"/>
</file>
<file path="jacek.betwnstr">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
</file>
<file path="jacek.cleanup_temp_tables">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
</file>
<file path="jacek.insert_dummy_notes">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
<lineToCover lineNumber="16" covered="false"/>
<lineToCover lineNumber="17" covered="false"/>
<lineToCover lineNumber="18" covered="false"/>
<lineToCover lineNumber="19" covered="false"/>
<lineToCover lineNumber="20" covered="false"/>
<lineToCover lineNumber="21" covered="false"/>
<lineToCover lineNumber="22" covered="false"/>
<lineToCover lineNumber="23" covered="false"/>
<lineToCover lineNumber="24" covered="false"/>
<lineToCover lineNumber="25" covered="false"/>
<lineToCover lineNumber="26" covered="false"/>
<lineToCover lineNumber="27" covered="false"/>
<lineToCover lineNumber="28" covered="false"/>
<lineToCover lineNumber="29" covered="false"/>
<lineToCover lineNumber="30" covered="false"/>
<lineToCover lineNumber="31" covered="false"/>
<lineToCover lineNumber="32" covered="false"/>
<lineToCover lineNumber="33" covered="false"/>
<lineToCover lineNumber="34" covered="false"/>
<lineToCover lineNumber="35" covered="false"/>
<lineToCover lineNumber="36" covered="false"/>
<lineToCover lineNumber="37" covered="false"/>
<lineToCover lineNumber="38" covered="false"/>
<lineToCover lineNumber="39" covered="false"/>
<lineToCover lineNumber="40" covered="false"/>
<lineToCover lineNumber="41" covered="false"/>
<lineToCover lineNumber="42" covered="false"/>
<lineToCover lineNumber="43" covered="false"/>
<lineToCover lineNumber="44" covered="false"/>
<lineToCover lineNumber="45" covered="false"/>
<lineToCover lineNumber="46" covered="false"/>
<lineToCover lineNumber="47" covered="false"/>
<lineToCover lineNumber="48" covered="false"/>
<lineToCover lineNumber="49" covered="false"/>
<lineToCover lineNumber="50" covered="false"/>
<lineToCover lineNumber="51" covered="false"/>
<lineToCover lineNumber="52" covered="false"/>
<lineToCover lineNumber="53" covered="false"/>
<lineToCover lineNumber="54" covered="false"/>
<lineToCover lineNumber="55" covered="false"/>
<lineToCover lineNumber="56" covered="false"/>
<lineToCover lineNumber="57" covered="false"/>
<lineToCover lineNumber="58" covered="false"/>
<lineToCover lineNumber="59" covered="false"/>
<lineToCover lineNumber="60" covered="false"/>
<lineToCover lineNumber="61" covered="false"/>
</file>
<file path="jacek.print_crsr">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
<lineToCover lineNumber="8" covered="false"/>
<lineToCover lineNumber="9" covered="false"/>
<lineToCover lineNumber="10" covered="false"/>
<lineToCover lineNumber="11" covered="false"/>
<lineToCover lineNumber="12" covered="false"/>
<lineToCover lineNumber="13" covered="false"/>
<lineToCover lineNumber="14" covered="false"/>
<lineToCover lineNumber="15" covered="false"/>
</file>
<file path="jacek.remove_rooms_by_name">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
<lineToCover lineNumber="5" covered="false"/>
<lineToCover lineNumber="6" covered="false"/>
<lineToCover lineNumber="7" covered="false"/>
</file>
<file path="jacek.test_sess">
<lineToCover lineNumber="1" covered="false"/>
<lineToCover lineNumber="2" covered="false"/>
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="4" covered="false"/>
</file>
<file path="jacek.tst_between_string">
<lineToCover lineNumber="3" covered="false"/>
<lineToCover lineNumber="7" covered="true"/>
<lineToCover lineNumber="12" covered="true"/>
</file>
<file path="jacek.tst_hello_world">
<lineToCover lineNumber="5" covered="true"/>
<lineToCover lineNumber="10" covered="true"/>
</file>
</coverage>

So again tests are note filtered out, but at least your tests package is there.

@safokkens
Copy link
Author

I'm glad we found the origin of the problem!
When I'm using a suitepath, the test packages are shown too.
When I'm using a suitepath with the same name as the package to test, I don't get to see the results on that package (APP_TOOLING). I don't understand why the package is filtered out, as the documentation about suitepath says:

Similar to java package. The annotation allows logical grouping of suites into hierarchies.

Could you please explain to me why my suitepath can't have the same name as the package that's tested? This way I want to group all unittests for a specific package.

@jgebal
Copy link
Member

jgebal commented Jul 12, 2017

This is now getting resolved and will become part of v3.0.2.
Thanks for finding this issue (actually two issues).

@jgebal
Copy link
Member

jgebal commented Jul 12, 2017

Going back to your question about organizing suites i would rather recommend the approach of keeping 1:1 mapping of test package and tested package.
There are few reasons for it:

  • it's easier to find
  • you will have much less DB objects
  • we will soon be adding contexts to test packages to allow grouping of tests for single tested procedure (Issue Add support for contex/sub-suite #244)

@safokkens
Copy link
Author

You're welcome!

I really like having my tests for a package in one test package, just like utPLSQL v2 did. But because I missed an extra level (context) I split them in multiple packages. Glad to see you are adding an extra level in the suite. I hope this level will appear in the test reports so we know the context of the runned tests.

Thanks for your quick reaction and clear answers. I will test the fixes from your branch.

@safokkens
Copy link
Author

I tested your branch and now the report works as expected. I hope to see a v3.0.2 soon!

Regards,
safokkens

Pazus added a commit that referenced this issue Jul 13, 2017
@jgebal jgebal closed this as completed Jul 13, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants