You want to use Test::Builder->is_num() rather than wrapping Test::Simple's ok(). You get the benefit of is() and failure diagnostics will point to the line where systest() was called, not the line where ok() was used inside systest().
As for the problem of supressing/trapping the STDOUT/STDERR from system(), just redirect them inside perl. There's several ways to do it. Dup & close to supress. Tie or redirect to a temp file to capture. An exercise which I will leave for the reader. :)
use Test::Simple tests => 3;
use Test::Builder;
my $tb = Test::Builder->new;
systest( 0, ("who") );
systest( 0, ("who", "am", "i") );
systest( 1, ("bash", "-c", "exit 1") );
sub systest {
my $expected = shift;
my @cmd = @_;
system @cmd;
my $sysres = $? >> 8;
$tb->is_num( $sysres, $expected, "'@cmd'" );
}
|