Syncing with Test-1.17
[p5sagit/p5-mst-13.2.git] / lib / Test / Harness.pm
CommitLineData
d667a7e6 1# -*- Mode: cperl; cperl-indent-level: 4 -*-
a0d0e21e 2package Test::Harness;
3
17f410f9 4use 5.005_64;
a0d0e21e 5use Exporter;
6use Benchmark;
4633a7c4 7use Config;
760ac839 8use strict;
9
9c5c68c8 10our($VERSION, $Verbose, $Switches, $Have_Devel_Corestack, $Curtest,
11 $Columns, $verbose, $switches,
12 @ISA, @EXPORT, @EXPORT_OK
13 );
4633a7c4 14
9c5c68c8 15# Backwards compatibility for exportable variable names.
16*verbose = \$Verbose;
17*switches = \$Switches;
18
19$Have_Devel_Corestack = 0;
20
21$VERSION = "1.1702";
9b0ceca9 22
f19ae7a7 23$ENV{HARNESS_ACTIVE} = 1;
24
9b0ceca9 25# Some experimental versions of OS/2 build have broken $?
9c5c68c8 26my $Ignore_Exitcode = $ENV{HARNESS_IGNORE_EXITCODE};
27
28my $Files_In_Dir = $ENV{HARNESS_FILELEAK_IN_DIR};
9b0ceca9 29
17a79f5b 30
9c5c68c8 31@ISA = ('Exporter');
32@EXPORT = qw(&runtests);
33@EXPORT_OK = qw($verbose $switches);
4633a7c4 34
9c5c68c8 35$Verbose = 0;
36$Switches = "-w";
37$Columns = $ENV{HARNESS_COLUMNS} || $ENV{COLUMNS} || 80;
ac7d80cd 38$Columns--; # Do no write into the last column
a0d0e21e 39
17a79f5b 40sub globdir { opendir DIRH, shift; my @f = readdir DIRH; closedir DIRH; @f }
41
a0d0e21e 42sub runtests {
43 my(@tests) = @_;
9c5c68c8 44
45 my($tot, $failedtests) = _runtests(@tests);
46 _show_results($tot, $failedtests);
47
48 return ($tot->{bad} == 0 && $tot->{max}) ;
49}
50
51
52sub _runtests {
53 my(@tests) = @_;
a0d0e21e 54 local($|) = 1;
9c5c68c8 55 my(%failedtests);
56
57 # Test-wide totals.
58 my(%tot) = (
59 bonus => 0,
60 max => 0,
61 ok => 0,
62 files => 0,
63 bad => 0,
64 good => 0,
65 tests => scalar @tests,
66 sub_skipped => 0,
67 skipped => 0,
68 bench => 0
69 );
774d564b 70
71 # pass -I flags to children
81ff29e3 72 my $old5lib = $ENV{PERL5LIB};
774d564b 73
1250aba5 74 # VMS has a 255-byte limit on the length of %ENV entries, so
75 # toss the ones that involve perl_root, the install location
76 # for VMS
77 my $new5lib;
78 if ($^O eq 'VMS') {
79 $new5lib = join($Config{path_sep}, grep {!/perl_root/i;} @INC);
9c5c68c8 80 $Switches =~ s/-(\S*[A-Z]\S*)/"-$1"/g;
1250aba5 81 }
82 else {
83 $new5lib = join($Config{path_sep}, @INC);
84 }
85
86 local($ENV{'PERL5LIB'}) = $new5lib;
a0d0e21e 87
9c5c68c8 88 my @dir_files = globdir $Files_In_Dir if defined $Files_In_Dir;
a0d0e21e 89 my $t_start = new Benchmark;
9c5c68c8 90
91 foreach my $test (@tests) {
92 my $te = $test;
93 chop($te); # XXX chomp?
94
fe6f1558 95 if ($^O eq 'VMS') { $te =~ s/^.*\.t\./[.t./s; }
45c0de28 96 my $blank = (' ' x 77);
0d0c0d42 97 my $leader = "$te" . '.' x (20 - length($te));
98 my $ml = "";
23c4718a 99 $ml = "\r$blank\r$leader"
9c5c68c8 100 if -t STDOUT and not $ENV{HARNESS_NOTTY} and not $Verbose;
0d0c0d42 101 print $leader;
9c5c68c8 102
103 my $s = _set_switches($test);
104
9636a016 105 my $cmd = ($ENV{'HARNESS_COMPILE_TEST'})
106 ? "./perl -I../lib ../utils/perlcc $test "
e4f0d88d 107 . "-r 2>> ./compilelog |"
9636a016 108 : "$^X $s $test|";
a5077310 109 $cmd = "MCR $cmd" if $^O eq 'VMS';
9c5c68c8 110 open(my $fh, $cmd) or print "can't run $test. $!\n";
111
112 # state of the current test.
113 my %test = (
114 ok => 0,
115 next => 0,
116 max => 0,
117 failed => [],
118 todo => {},
119 bonus => 0,
120 skipped => 0,
121 skip_reason => undef,
122 ml => $ml,
123 );
124
125 my($seen_header, $tests_seen) = (0,0);
c07a80fd 126 while (<$fh>) {
9c5c68c8 127 if( _parse_header($_, \%test, \%tot) ) {
128 warn "Test header seen twice!\n" if $seen_header;
129
130 $seen_header = 1;
131
132 warn "1..M can only appear at the beginning or end of tests\n"
133 if $tests_seen && $test{max} < $tests_seen;
134 }
135 elsif( _parse_test_line($_, \%test, \%tot) ) {
136 $tests_seen++;
d667a7e6 137 }
9c5c68c8 138 # else, ignore it.
c07a80fd 139 }
9c5c68c8 140
141 my($estatus, $wstatus) = _close_fh($fh);
142
68dc0745 143 if ($wstatus) {
9c5c68c8 144 $failedtests{$test} = _dubious_return(\%test, \%tot,
145 $estatus, $wstatus);
66fd8cb9 146 $failedtests{$test}{name} = $test;
9c5c68c8 147 }
148 elsif ($test{ok} == $test{max} && $test{next} == $test{max}+1) {
149 if ($test{max} and $test{skipped} + $test{bonus}) {
7b13a3f5 150 my @msg;
9c5c68c8 151 push(@msg, "$test{skipped}/$test{max} skipped: $test{skip_reason}")
152 if $test{skipped};
153 push(@msg, "$test{bonus}/$test{max} unexpectedly succeeded")
154 if $test{bonus};
155 print "$test{ml}ok, ".join(', ', @msg)."\n";
156 } elsif ($test{max}) {
157 print "$test{ml}ok\n";
158 } elsif (defined $test{skip_reason}) {
159 print "skipped: $test{skip_reason}\n";
160 $tot{skipped}++;
c0ee6f5c 161 } else {
45c0de28 162 print "skipped test on this platform\n";
9c5c68c8 163 $tot{skipped}++;
c0ee6f5c 164 }
9c5c68c8 165 $tot{good}++;
166 } elsif ($test{max}) {
167 if ($test{next} <= $test{max}) {
168 push @{$test{failed}}, $test{next}..$test{max};
6c31b336 169 }
9c5c68c8 170 if (@{$test{failed}}) {
171 my ($txt, $canon) = canonfailed($test{max},$test{skipped},
172 @{$test{failed}});
173 print "$test{ml}$txt";
174 $failedtests{$test} = { canon => $canon,
175 max => $test{max},
176 failed => scalar @{$test{failed}},
177 name => $test,
178 percent => 100*(scalar @{$test{failed}})/$test{max},
179 estat => '',
180 wstat => '',
760ac839 181 };
c07a80fd 182 } else {
9c5c68c8 183 print "Don't know which tests failed: got $test{ok} ok, ".
184 "expected $test{max}\n";
185 $failedtests{$test} = { canon => '??',
186 max => $test{max},
187 failed => '??',
188 name => $test,
189 percent => undef,
190 estat => '',
191 wstat => '',
760ac839 192 };
c07a80fd 193 }
9c5c68c8 194 $tot{bad}++;
195 } elsif ($test{next} == 0) {
6c31b336 196 print "FAILED before any test output arrived\n";
9c5c68c8 197 $tot{bad}++;
198 $failedtests{$test} = { canon => '??',
199 max => '??',
200 failed => '??',
201 name => $test,
202 percent => undef,
203 estat => '',
204 wstat => '',
760ac839 205 };
6c31b336 206 }
9c5c68c8 207 $tot{sub_skipped} += $test{skipped};
208
209 if (defined $Files_In_Dir) {
210 my @new_dir_files = globdir $Files_In_Dir;
17a79f5b 211 if (@new_dir_files != @dir_files) {
212 my %f;
213 @f{@new_dir_files} = (1) x @new_dir_files;
214 delete @f{@dir_files};
215 my @f = sort keys %f;
216 print "LEAKED FILES: @f\n";
217 @dir_files = @new_dir_files;
218 }
219 }
a0d0e21e 220 }
9c5c68c8 221 $tot{bench} = timediff(new Benchmark, $t_start);
d667a7e6 222
774d564b 223 if ($^O eq 'VMS') {
224 if (defined $old5lib) {
225 $ENV{PERL5LIB} = $old5lib;
b876d4a6 226 } else {
774d564b 227 delete $ENV{PERL5LIB};
228 }
229 }
9c5c68c8 230
231 return(\%tot, \%failedtests);
232}
233
234
235sub _show_results {
236 my($tot, $failedtests) = @_;
237
238 my $pct;
239 my $bonusmsg = _bonusmsg($tot);
240
241 if ($tot->{bad} == 0 && $tot->{max}) {
7b13a3f5 242 print "All tests successful$bonusmsg.\n";
9c5c68c8 243 } elsif ($tot->{tests}==0){
6c31b336 244 die "FAILED--no tests were run for some reason.\n";
9c5c68c8 245 } elsif ($tot->{max} == 0) {
246 my $blurb = $tot->{tests}==1 ? "script" : "scripts";
247 die "FAILED--$tot->{tests} test $blurb could be run, ".
248 "alas--no output ever seen\n";
c07a80fd 249 } else {
9c5c68c8 250 $pct = sprintf("%.2f", $tot->{good} / $tot->{tests} * 100);
6c31b336 251 my $subpct = sprintf " %d/%d subtests failed, %.2f%% okay.",
9c5c68c8 252 $tot->{max} - $tot->{ok}, $tot->{max},
253 100*$tot->{ok}/$tot->{max};
0a931e4a 254
9c5c68c8 255 my($fmt_top, $fmt) = _create_fmts($failedtests);
0a931e4a 256
257 # Now write to formats
9c5c68c8 258 for my $script (sort keys %$failedtests) {
259 $Curtest = $failedtests->{$script};
760ac839 260 write;
261 }
9c5c68c8 262 if ($tot->{bad}) {
9b0ceca9 263 $bonusmsg =~ s/^,\s*//;
264 print "$bonusmsg.\n" if $bonusmsg;
9c5c68c8 265 die "Failed $tot->{bad}/$tot->{tests} test scripts, $pct% okay.".
266 "$subpct\n";
c07a80fd 267 }
268 }
f0a9308e 269
9c5c68c8 270 printf("Files=%d, Tests=%d, %s\n",
271 $tot->{files}, $tot->{max}, timestr($tot->{bench}, 'nop'));
272}
273
274
275sub _parse_header {
276 my($line, $test, $tot) = @_;
277
278 my $is_header = 0;
279
280 print $line if $Verbose;
281
282 # 1..10 todo 4 7 10;
283 if ($line =~ /^1\.\.([0-9]+) todo([\d\s]+);?/i) {
284 $test->{max} = $1;
285 for (split(/\s+/, $2)) { $test->{todo}{$_} = 1; }
286
287 $tot->{max} += $test->{max};
288 $tot->{files}++;
289
290 $is_header = 1;
291 }
292 # 1..10
293 # 1..0 # skip Why? Because I said so!
294 elsif ($line =~ /^1\.\.([0-9]+)
295 (\s*\#\s*[Ss]kip\S*(?>\s+) (.+))?
296 /x
297 )
298 {
299 $test->{max} = $1;
300 $tot->{max} += $test->{max};
301 $tot->{files}++;
302 $test->{next} = 1 unless $test->{next};
303 $test->{skip_reason} = $3 if not $test->{max} and defined $3;
304
305 $is_header = 1;
306 }
307 else {
308 $is_header = 0;
309 }
310
311 return $is_header;
c07a80fd 312}
313
9c5c68c8 314
315sub _parse_test_line {
316 my($line, $test, $tot) = @_;
317
318 if ($line =~ /^(not\s+)?ok\b/i) {
319 my $this = $test->{next} || 1;
320 # "not ok 23"
37ce32a7 321 if ($line =~ /^(not )?ok\s*(\d*)(\s*#.*)?/) {
322 my($not, $tnum, $extra) = ($1, $2, $3);
323
324 $this = $tnum if $tnum;
325
326 my($type, $reason) = $extra =~ /^\s*#\s*([Ss]kip\S*|TODO)(\s+.+)?/
327 if defined $extra;
328
329 my($istodo, $isskip);
330 if( defined $type ) {
331 $istodo = $type =~ /TODO/;
332 $isskip = $type =~ /skip/i;
333 }
334
335 $test->{todo}{$tnum} = 1 if $istodo;
336
337 if( $not ) {
338 print "$test->{ml}NOK $this" if $test->{ml};
339 if (!$test->{todo}{$this}) {
340 push @{$test->{failed}}, $this;
341 } else {
342 $test->{ok}++;
343 $tot->{ok}++;
344 }
345 }
346 else {
347 print "$test->{ml}ok $this/$test->{max}" if $test->{ml};
348 $test->{ok}++;
349 $tot->{ok}++;
350 $test->{skipped}++ if $isskip;
351
352 if (defined $reason and defined $test->{skip_reason}) {
353 # print "was: '$skip_reason' new '$reason'\n";
354 $test->{skip_reason} = 'various reasons'
355 if $test->{skip_reason} ne $reason;
356 } elsif (defined $reason) {
357 $test->{skip_reason} = $reason;
358 }
359
360 $test->{bonus}++, $tot->{bonus}++ if $test->{todo}{$this};
361 }
9c5c68c8 362 }
363 # XXX ummm... dunno
364 elsif ($line =~ /^ok\s*(\d*)\s*\#([^\r]*)$/) { # XXX multiline ok?
365 $this = $1 if $1 > 0;
366 print "$test->{ml}ok $this/$test->{max}" if $test->{ml};
367 $test->{ok}++;
368 $tot->{ok}++;
369 }
370 else {
371 # an ok or not ok not matching the 3 cases above...
372 # just ignore it for compatibility with TEST
373 next;
374 }
375
376 if ($this > $test->{next}) {
377 # print "Test output counter mismatch [test $this]\n";
378 # no need to warn probably
379 push @{$test->{failed}}, $test->{next}..$this-1;
380 }
381 elsif ($this < $test->{next}) {
382 #we have seen more "ok" lines than the number suggests
383 print "Confused test output: test $this answered after ".
384 "test ", $test->{next}-1, "\n";
385 $test->{next} = $this;
386 }
387 $test->{next} = $this + 1;
388
389 }
390 elsif ($line =~ /^Bail out!\s*(.*)/i) { # magic words
391 die "FAILED--Further testing stopped" .
392 ($1 ? ": $1\n" : ".\n");
393 }
394}
395
396
397sub _bonusmsg {
398 my($tot) = @_;
399
400 my $bonusmsg = '';
401 $bonusmsg = (" ($tot->{bonus} subtest".($tot->{bonus} > 1 ? 's' : '').
402 " UNEXPECTEDLY SUCCEEDED)")
403 if $tot->{bonus};
404
405 if ($tot->{skipped}) {
406 $bonusmsg .= ", $tot->{skipped} test"
407 . ($tot->{skipped} != 1 ? 's' : '');
408 if ($tot->{sub_skipped}) {
409 $bonusmsg .= " and $tot->{sub_skipped} subtest"
410 . ($tot->{sub_skipped} != 1 ? 's' : '');
411 }
412 $bonusmsg .= ' skipped';
413 }
414 elsif ($tot->{sub_skipped}) {
415 $bonusmsg .= ", $tot->{sub_skipped} subtest"
416 . ($tot->{sub_skipped} != 1 ? 's' : '')
417 . " skipped";
418 }
419
420 return $bonusmsg;
421}
422
423# VMS has some subtle nastiness with closing the test files.
424sub _close_fh {
425 my($fh) = shift;
426
427 close($fh); # must close to reap child resource values
428
429 my $wstatus = $Ignore_Exitcode ? 0 : $?; # Can trust $? ?
430 my $estatus;
431 $estatus = ($^O eq 'VMS'
432 ? eval 'use vmsish "status"; $estatus = $?'
433 : $wstatus >> 8);
434
435 return($estatus, $wstatus);
436}
437
438
439# Set up the command-line switches to run perl as.
440sub _set_switches {
441 my($test) = shift;
442
443 open(my $fh, $test) or print "can't open $test. $!\n";
444 my $first = <$fh>;
445 my $s = $Switches;
446 $s .= " $ENV{'HARNESS_PERL_SWITCHES'}"
447 if exists $ENV{'HARNESS_PERL_SWITCHES'};
448 $s .= join " ", q[ "-T"], map {qq["-I$_"]} @INC
449 if $first =~ /^#!.*\bperl.*-\w*T/;
450
451 close($fh) or print "can't close $test. $!\n";
452
453 return $s;
454}
455
456
457# Test program go boom.
458sub _dubious_return {
459 my($test, $tot, $estatus, $wstatus) = @_;
460 my ($failed, $canon, $percent) = ('??', '??');
461
462 printf "$test->{ml}dubious\n\tTest returned status $estatus ".
463 "(wstat %d, 0x%x)\n",
464 $wstatus,$wstatus;
465 print "\t\t(VMS status is $estatus)\n" if $^O eq 'VMS';
466
467 if (corestatus($wstatus)) { # until we have a wait module
468 if ($Have_Devel_Corestack) {
469 Devel::CoreStack::stack($^X);
470 } else {
471 print "\ttest program seems to have generated a core\n";
472 }
473 }
474
475 $tot->{bad}++;
476
477 if ($test->{max}) {
478 if ($test->{next} == $test->{max} + 1 and not @{$test->{failed}}) {
479 print "\tafter all the subtests completed successfully\n";
480 $percent = 0;
481 $failed = 0; # But we do not set $canon!
482 }
483 else {
484 push @{$test->{failed}}, $test->{next}..$test->{max};
485 $failed = @{$test->{failed}};
486 (my $txt, $canon) = canonfailed($test->{max},$test->{skipped},@{$test->{failed}});
487 $percent = 100*(scalar @{$test->{failed}})/$test->{max};
488 print "DIED. ",$txt;
489 }
490 }
491
492 return { canon => $canon, max => $test->{max} || '??',
493 failed => $failed,
66fd8cb9 494 percent => $percent,
9c5c68c8 495 estat => $estatus, wstat => $wstatus,
496 };
497}
498
499
500sub _garbled_output {
501 my($gibberish) = shift;
502 warn "Confusing test output: '$gibberish'\n";
503}
504
505
506sub _create_fmts {
507 my($failedtests) = @_;
508
ac7d80cd 509 my $failed_str = "Failed Test "; # Borrow up to 3 chars from Status
9c5c68c8 510 my $middle_str = " Status Wstat Total Fail Failed ";
511 my $list_str = "List of Failed";
512
513 # Figure out our longest name string for formatting purposes.
514 my $max_namelen = length($failed_str);
515 foreach my $script (keys %$failedtests) {
516 my $namelen = length $failedtests->{$script}->{name};
517 $max_namelen = $namelen if $namelen > $max_namelen;
518 }
519
520 my $list_len = $Columns - length($middle_str) - $max_namelen;
521 if ($list_len < length($list_str)) {
522 $list_len = length($list_str);
523 $max_namelen = $Columns - length($middle_str) - $list_len;
524 if ($max_namelen < length($failed_str)) {
525 $max_namelen = length($failed_str);
526 $Columns = $max_namelen + length($middle_str) + $list_len;
527 }
528 }
529
ac7d80cd 530 my $failed_len = $max_namelen - 3;
9c5c68c8 531 my $fmt_top = "format STDOUT_TOP =\n"
ac7d80cd 532 . sprintf("%-${failed_len}s", "Failed Test")
9c5c68c8 533 . $middle_str
534 . $list_str . "\n"
535 . "-" x $Columns
536 . "\n.\n";
537
538 my $fmt = "format STDOUT =\n"
539 . "@" . "<" x ($max_namelen - 1)
ac7d80cd 540 . " @>> @>>>> @>>>> @>>> ^##.##% "
9c5c68c8 541 . "^" . "<" x ($list_len - 1) . "\n"
542 . '{ $Curtest->{name}, $Curtest->{estat},'
543 . ' $Curtest->{wstat}, $Curtest->{max},'
544 . ' $Curtest->{failed}, $Curtest->{percent},'
545 . ' $Curtest->{canon}'
546 . "\n}\n"
547 . "~~" . " " x ($Columns - $list_len - 2) . "^"
548 . "<" x ($list_len - 1) . "\n"
549 . '$Curtest->{canon}'
550 . "\n.\n";
551
552 eval $fmt_top;
553 die $@ if $@;
554 eval $fmt;
555 die $@ if $@;
556
557 return($fmt_top, $fmt);
558}
559
560
aa689395 561my $tried_devel_corestack;
c0ee6f5c 562sub corestatus {
563 my($st) = @_;
c0ee6f5c 564
565 eval {require 'wait.ph'};
0dfaec25 566 my $ret = defined &WCOREDUMP ? WCOREDUMP($st) : $st & 0200;
c0ee6f5c 567
9c5c68c8 568 eval { require Devel::CoreStack; $Have_Devel_Corestack++ }
aa689395 569 unless $tried_devel_corestack++;
c0ee6f5c 570
571 $ret;
572}
573
c07a80fd 574sub canonfailed ($@) {
89d3b7e2 575 my($max,$skipped,@failed) = @_;
6c31b336 576 my %seen;
577 @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed;
c07a80fd 578 my $failed = @failed;
579 my @result = ();
580 my @canon = ();
581 my $min;
582 my $last = $min = shift @failed;
760ac839 583 my $canon;
c07a80fd 584 if (@failed) {
585 for (@failed, $failed[-1]) { # don't forget the last one
586 if ($_ > $last+1 || $_ == $last) {
587 if ($min == $last) {
588 push @canon, $last;
589 } else {
590 push @canon, "$min-$last";
591 }
592 $min = $_;
593 }
594 $last = $_;
595 }
596 local $" = ", ";
597 push @result, "FAILED tests @canon\n";
760ac839 598 $canon = "@canon";
a0d0e21e 599 } else {
c07a80fd 600 push @result, "FAILED test $last\n";
760ac839 601 $canon = $last;
a0d0e21e 602 }
c07a80fd 603
604 push @result, "\tFailed $failed/$max tests, ";
89d3b7e2 605 push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay";
606 my $ender = 's' x ($skipped > 1);
607 my $good = $max - $failed - $skipped;
608 my $goodper = sprintf("%.2f",100*($good/$max));
9c5c68c8 609 push @result, " (-$skipped skipped test$ender: $good okay, ".
610 "$goodper%)"
611 if $skipped;
89d3b7e2 612 push @result, "\n";
760ac839 613 my $txt = join "", @result;
614 ($txt, $canon);
a0d0e21e 615}
616
6171;
cb1a09d0 618__END__
619
620=head1 NAME
621
622Test::Harness - run perl standard test scripts with statistics
623
624=head1 SYNOPSIS
625
37ce32a7 626 use Test::Harness;
cb1a09d0 627
37ce32a7 628 runtests(@test_files);
cb1a09d0 629
630=head1 DESCRIPTION
631
9c5c68c8 632(By using the Test module, you can write test scripts without
7b13a3f5 633knowing the exact output this module expects. However, if you need to
634know the specifics, read on!)
635
cb1a09d0 636Perl test scripts print to standard output C<"ok N"> for each single
637test, where C<N> is an increasing sequence of integers. The first line
c0ee6f5c 638output by a standard test script is C<"1..M"> with C<M> being the
cb1a09d0 639number of tests that should be run within the test
c0ee6f5c 640script. Test::Harness::runtests(@tests) runs all the testscripts
cb1a09d0 641named as arguments and checks standard output for the expected
642C<"ok N"> strings.
643
c0ee6f5c 644After all tests have been performed, runtests() prints some
cb1a09d0 645performance statistics that are computed by the Benchmark module.
646
6c31b336 647=head2 The test script output
648
37ce32a7 649The following explains how Test::Harness interprets the output of your
650test program.
651
9c5c68c8 652=over 4
653
bbc7dcd2 654=item B<'1..M'>
9c5c68c8 655
656This header tells how many tests there will be. It should be the
657first line output by your test program (but its okay if its preceded
658by comments).
659
660In certain instanced, you may not know how many tests you will
661ultimately be running. In this case, it is permitted (but not
662encouraged) for the 1..M header to appear as the B<last> line output
663by your test (again, it can be followed by further comments). But we
664strongly encourage you to put it first.
665
666Under B<no> circumstances should 1..M appear in the middle of your
667output or more than once.
668
669
670=item B<'ok', 'not ok'. Ok?>
671
6c31b336 672Any output from the testscript to standard error is ignored and
673bypassed, thus will be seen by the user. Lines written to standard
c0ee6f5c 674output containing C</^(not\s+)?ok\b/> are interpreted as feedback for
675runtests(). All other lines are discarded.
6c31b336 676
9c5c68c8 677C</^not ok/> indicates a failed test. C</^ok/> is a successful test.
678
679
680=item B<test numbers>
681
682Perl normally expects the 'ok' or 'not ok' to be followed by a test
683number. It is tolerated if the test numbers after 'ok' are
684omitted. In this case Test::Harness maintains temporarily its own
685counter until the script supplies test numbers again. So the following
686test script
6c31b336 687
688 print <<END;
689 1..6
690 not ok
691 ok
692 not ok
693 ok
694 ok
695 END
696
d667a7e6 697will generate
6c31b336 698
699 FAILED tests 1, 3, 6
700 Failed 3/6 tests, 50.00% okay
701
9c5c68c8 702
703=item B<$Test::Harness::verbose>
704
6c31b336 705The global variable $Test::Harness::verbose is exportable and can be
c0ee6f5c 706used to let runtests() display the standard output of the script
6c31b336 707without altering the behavior otherwise.
708
9c5c68c8 709=item B<$Test::Harness::switches>
710
fb73857a 711The global variable $Test::Harness::switches is exportable and can be
712used to set perl command line options used for running the test
713script(s). The default value is C<-w>.
714
9c5c68c8 715=item B<Skipping tests>
716
37ce32a7 717If the standard output line contains the substring C< # Skip> (with
fac76ed7 718variations in spacing and case) after C<ok> or C<ok NUMBER>, it is
9c5c68c8 719counted as a skipped test. If the whole testscript succeeds, the
720count of skipped tests is included in the generated output.
e1194749 721C<Test::Harness> reports the text after C< # Skip\S*\s+> as a reason
37ce32a7 722for skipping.
723
724 ok 23 # skip Insufficient flogiston pressure.
725
726Similarly, one can include a similar explanation in a C<1..0> line
727emitted if the test script is skipped completely:
45c0de28 728
729 1..0 # Skipped: no leverage found
730
37ce32a7 731=item B<Todo tests>
732
733If the standard output line contains the substring C< # TODO> after
734C<not ok> or C<not ok NUMBER>, it is counted as a todo test. The text
735afterwards is the thing that has to be done before this test will
736succeed.
737
738 not ok 13 # TODO harness the power of the atom
739
740These tests represent a feature to be implemented or a bug to be fixed
741and act as something of an executable "thing to do" list. They are
742B<not> expected to succeed. Should a todo test begin succeeding,
743Test::Harness will report it as a bonus. This indicates that whatever
744you were supposed to do has been done and you should promote this to a
745normal test.
746
9c5c68c8 747=item B<Bail out!>
748
d667a7e6 749As an emergency measure, a test script can decide that further tests
750are useless (e.g. missing dependencies) and testing should stop
751immediately. In that case the test script prints the magic words
752
753 Bail out!
754
755to standard output. Any message after these words will be displayed by
756C<Test::Harness> as the reason why testing is stopped.
757
9c5c68c8 758=item B<Comments>
759
760Additional comments may be put into the testing output on their own
761lines. Comment lines should begin with a '#', Test::Harness will
762ignore them.
763
764 ok 1
765 # Life is good, the sun is shining, RAM is cheap.
766 not ok 2
767 # got 'Bush' expected 'Gore'
768
4ac9195f 769=back
9c5c68c8 770
cb1a09d0 771=head1 EXPORT
772
c0ee6f5c 773C<&runtests> is exported by Test::Harness per default.
cb1a09d0 774
9c5c68c8 775C<$verbose> and C<$switches> are exported upon request.
776
777
cb1a09d0 778=head1 DIAGNOSTICS
779
780=over 4
781
782=item C<All tests successful.\nFiles=%d, Tests=%d, %s>
783
784If all tests are successful some statistics about the performance are
785printed.
786
6c31b336 787=item C<FAILED tests %s\n\tFailed %d/%d tests, %.2f%% okay.>
788
789For any single script that has failing subtests statistics like the
790above are printed.
791
792=item C<Test returned status %d (wstat %d)>
793
9c5c68c8 794Scripts that return a non-zero exit status, both C<$? E<gt>E<gt> 8>
795and C<$?> are printed in a message similar to the above.
6c31b336 796
797=item C<Failed 1 test, %.2f%% okay. %s>
cb1a09d0 798
6c31b336 799=item C<Failed %d/%d tests, %.2f%% okay. %s>
cb1a09d0 800
801If not all tests were successful, the script dies with one of the
802above messages.
803
d667a7e6 804=item C<FAILED--Further testing stopped%s>
805
806If a single subtest decides that further testing will not make sense,
807the script dies with this message.
808
cb1a09d0 809=back
810
9b0ceca9 811=head1 ENVIRONMENT
812
37ce32a7 813=over 4
814
815=item C<HARNESS_IGNORE_EXITCODE>
816
817Makes harness ignore the exit status of child processes when defined.
818
819=item C<HARNESS_NOTTY>
9b0ceca9 820
37ce32a7 821When set to a true value, forces it to behave as though STDOUT were
822not a console. You may need to set this if you don't want harness to
823output more frequent progress messages using carriage returns. Some
824consoles may not handle carriage returns properly (which results in a
825somewhat messy output).
0d0c0d42 826
37ce32a7 827=item C<HARNESS_COMPILE_TEST>
9636a016 828
37ce32a7 829When true it will make harness attempt to compile the test using
830C<perlcc> before running it.
831
832=item C<HARNESS_FILELEAK_IN_DIR>
833
834When set to the name of a directory, harness will check after each
835test whether new files appeared in that directory, and report them as
17a79f5b 836
837 LEAKED FILES: scr.tmp 0 my.db
838
839If relative, directory name is with respect to the current directory at
840the moment runtests() was called. Putting absolute path into
841C<HARNESS_FILELEAK_IN_DIR> may give more predicatable results.
842
37ce32a7 843=item C<HARNESS_PERL_SWITCHES>
844
845Its value will be prepended to the switches used to invoke perl on
846each test. For example, setting C<HARNESS_PERL_SWITCHES> to "-W" will
847run all tests with all warnings enabled.
848
849=item C<HARNESS_COLUMNS>
850
851This value will be used for the width of the terminal. If it is not
852set then it will default to C<COLUMNS>. If this is not set, it will
853default to 80. Note that users of Bourne-sh based shells will need to
854C<export COLUMNS> for this module to use that variable.
2b32313b 855
37ce32a7 856=item C<HARNESS_ACTIVE>
857
858Harness sets this before executing the individual tests. This allows
859the tests to determine if they are being executed through the harness
860or by any other means.
861
862=back
0a931e4a 863
f19ae7a7 864
cb1a09d0 865=head1 SEE ALSO
866
37ce32a7 867L<Test> for writing test scripts, L<Benchmark> for the underlying
868timing routines and L<Devel::Coverage> for test coverage analysis.
c07a80fd 869
870=head1 AUTHORS
871
872Either Tim Bunce or Andreas Koenig, we don't know. What we know for
873sure is, that it was inspired by Larry Wall's TEST script that came
b876d4a6 874with perl distributions for ages. Numerous anonymous contributors
37ce32a7 875exist.
876
877Current maintainers are Andreas Koenig <andreas.koenig@anima.de> and
878Michael G Schwern <schwern@pobox.com>
cb1a09d0 879
880=head1 BUGS
881
882Test::Harness uses $^X to determine the perl binary to run the tests
6c31b336 883with. Test scripts running via the shebang (C<#!>) line may not be
884portable because $^X is not consistent for shebang scripts across
cb1a09d0 885platforms. This is no problem when Test::Harness is run with an
6c31b336 886absolute path to the perl binary or when $^X can be found in the path.
cb1a09d0 887
888=cut