in reply to Re^4: STDERR in Test Results
in thread STDERR in Test Results

It's a good question. I'm a proponent of not making the end user install more than they need so in the general case I would agree.

However, in this particular case we are talking about Test::Warn which at the time of writing this post has 365 direct dependents and 5381 total dependents. In other words, if you were to install any random dist from CPAN there's a decent chance that it will require Test::Warn. For such a widely-used dist I would have few qualms about adding this as a dependency of one of my dists.

The other option, as already outlined by kcott, is to make it optional. List Test::Warn as one of the "recommended" or "suggested" dependencies. Then if it isn't installed and the user doesn't want to install it that's fine but you need the test which uses it to check for this and skip that block if Test::Warn is missing. See for example Exporter::Tiny which recommends Test::Warnings and Test::Fatal and then checks for their presence.


🦛

Replies are listed 'Best First'.
Re^6: STDERR in Test Results
by Bod (Parson) on Jun 25, 2023 at 16:24 UTC
    However, in this particular case we are talking about Test::Warn which at the time of writing this post has 365 direct dependents and 5381 total dependents

    It seems, quite a few testers don't have Test::Warn installed...

    Perhaps they only have core modules on their setup for testing.

      Perhaps they only have core modules on their setup for testing.

      Well, yes. How else could they test that all the dependencies have been correctly listed? The system is working as intended :-)


      🦛

      It seems, quite a few testers don't have Test::Warn installed...

      You should be able to detect that and skip the test(s).

      Very crudely, something like this should work (completely untested):

      #... use Test::More tests => 42; eval 'use Test::Warn;'; # just ignore if we can't load Test::Warn #... SKIP: { unless ($INC{'Test/Warn.pm'}) { # test if Test::Warn was loaded skip 'Test::Warn is not available', 1; } warning_like { warn "foo" } qr/foo/; # you may need to put this li +ne in a string eval because warning_like is exported by Test::Warn } # ...

      Or maybe put all warnings tests in a separate script and skip the entire script if Test::Warn is not available (again untested):

      # ... use Test::More; BEGIN { if (eval 'use Test::Warn; 1') { Test::More->import(tests => 42); } else { Test::More->import(skip_all => 'Test::Warn is not available'); # this line won't be reached, see Test::More } } warning_like { warn "foo" } qr/foo/; # ...

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)