Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Writing our own modules in Test2

1 view
Skip to first unread message

Andy Lester

unread,
Jun 23, 2016, 11:00:02 PM6/23/16
to per...@perl.org
Is there a doc somewhere that explains how to write one's own test module atop Test2? I haven't found it if there is.

Is the intent that when people will create them as Test2::Tools::Whatever? Sort of like Perl::Critic::Policy::* is done? Or are we still staying as Test::Whatever?

Do we have an FAQ started for things like this? If not, I assume it would be good to start one, and if so, then where should I start it?

--
Andy Lester => www.petdance.com

Andy Lester

unread,
Jun 24, 2016, 3:15:01 PM6/24/16
to Buddy Burden, Chad Granum, Perl QA

On Jun 24, 2016, at 12:57 PM, Buddy Burden <barefo...@gmail.com> wrote:

What sort of methods did you have in mind?  I might have something to contribute, if you would be interested in contributions.

I’ve accumulated a number of test functions in our work codebase for doing what I call “expressive” tests to avoid common cut & paste.  I’m using the term “expressive” for now because they’re expressing what it is you want, rather than making you write the code that explains them.


For instance, instead of doing all the 

is( scalar @{$foo}, 0 );  # Is this an empty array?
ok( scalar @{$foo} );   # Is there something in the array?

I’ve been writing

is_empty_array( $foo );
is_nonempty_array( $foo );

because I believe that it’s easier to read the English “is empty array” than to translate “is( scalar @{$foo}, 0 )” into that meaning.  We’ve got some 1200+ .t files of 11MB so I do a lot of reading of .t files all day.

Similarly:

is_nonblank( $response );
is_blank( $response );

instead of

ok( defined($response) ) && like( $response, qr/./ );
is( $response, ‘’ );

for the same reasons.  They’re common idioms, but I’d still rather read English than Perl.

Also, I see it that the fewer arguments passed around, the fewer places for mistakes.

I’ve also stolen some stuff from Test::Numeric for common tests.  is_integer, is_positive_integer, is_nonnegative_integer, is_even.

I’ve also got things like all_keys_exist_in( \%hash, [qw( foo bar bat )] ).


Now, with Test2, my thinking on many of these changes.  The odious

is( scalar @{$foo}, 0 );

now becomes simply

is( $foo, [] );

which may not be as Englishy as 

is_empty_array( $foo )

but that I am probably fine with.  So, too, does something like all_keys_exist_in() become much easier to do with the new DSL in Test2.  But there will still be others like it, I suspect.


I also want to have something that is an example of the Right Way To Do It that we can point at as an add-on distribution to Test2::Suite.  I think that will help future Test2::Tools writers.

So those are my high-level thoughts.

Andy Lester

unread,
Jun 27, 2016, 10:45:02 AM6/27/16
to Buddy Burden, Chad Granum, Perl QA

On Jun 24, 2016, at 4:41 PM, Buddy Burden <barefo...@gmail.com> wrote:

   is_true($val);
   is_false($val);

Because with just `ok($val)` you can tell whether it's true or false, but, when it inevitably fails, you really want to know what the bad value turned out to be.

I have a bool_eq() so you can do this:

bool_eq( $want_foos, scalar @foos );

without having to do

if ( $want_foos ) {
    ok( scalar @foos );
}
else {
    is( scalar @foos, 0 );
}

We were also writing that as

is( !!$want_foos, !!(scalar @foos) );

which works, but obscures the meaning.

I don’t like the name bool_eq() (“booleans are equal”) but it was the best I could come up with.
0 new messages