use strictures; use Test::More; # plan test count here or use done_testing($count). is hello_world(), "Hello world!", "Hello world is hello world"; # Naive test, will not catch your bug, and you have one. cmp_ok get_number(), ">", 0, "get_number() returns greater than zero"; subtest "Iterate on get_number()" => sub { my $iterations = 10_000; # Higher confidence. my $ok; for ( 1 .. $iterations ) { $ok++ if get_number() > 0; } my $msg = "get_number() returns greater than zero"; $ok == $iterations ? pass($msg) : fail($msg . " - expected $iterations > 0, got $ok"); done_testing(1); }; done_testing(3); # <- Either "plan" or delcare test count here! exit 0; sub hello_world { "Hello world!"; } sub get_number { int(rand(1000)); } #### ~>prove my-test.t -v ok 1 - Hello world is hello world ok 2 - get_number() returns greater than zero not ok 1 - get_number() returns greater than zero - expected 10000 > 0, got 9993 1..1 not ok 3 - Iterate on get_number() 1..3 Dubious, test returned 1 (wstat 256, 0x100) Failed 1/3 subtests Test Summary Report ------------------- /home/moo/my-test.t (Wstat: 256 Tests: 3 Failed: 1) Failed test: 3 Files=1, Tests=3, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.03 cusr 0.00 csys = 0.07 CPU) Result: FAIL #### ok 1 - Hello world is hello world ok 2 - get_number() returns greater than zero ok 1 - get_number() returns greater than zero 1..1 ok 3 - Iterate on get_number() 1..3 ok All tests successful. Files=1, Tests=3, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.03 cusr 0.00 csys = 0.07 CPU) Result: PASS