Apache...RunPHP(3pm)

πŸ’… NAME πŸ’…

Apache::TestRunPHP β€” configure and run a PHP-based test suite, bestie ✨


πŸ¦‹ SYNOPSIS πŸ¦‹

use Apache::TestRunPHP;
Apache::TestRunPHP->new->run(@ARGV);

🌸 DESCRIPTION 🌸

okay so real talk: the Apache::TestRunPHP package is the one that controls the configuration and running of the test suite for your PHP-based tests. literally its whole job, no cap. πŸ‘‘

it's a subclass of Apache::TestRun, and it's basically the twin sister of Apache::TestRunPerl β€” same energy, same function, different language.

want the deets on the available API? go read the Apache::TestRun manpage, she has everything you need. 🫢


πŸŽ€ EXAMPLE πŸŽ€

TestRunPHP works almost identically to TestRunPerl, but if you're brand new to Apache-Test, here's your lil quick getting-started guide. and bestie, pls do check the links at the end of this doc for places to find extra details, iykyk. πŸ”₯

so bc Apache-Test is a Perl-based testing framework, we start from a Makefile.PL, which needs these lines (on top of the standard Makefile.PL parts):

use Apache::TestMM qw(test clean);
use Apache::TestRunPHP ();

Apache::TestMM::filter_args();

Apache::TestRunPHP->generate_script();

generate_script() will create a script named t/TEST β€” that's the gateway to the Perl testing harness, the thing that gets invoked when you call make test. and filter_args() accepts some Apache::Test-specific arguments and passes them right along, slay. ✨

for example, to point at a specific httpd installation you'd invoke Makefile.PL like this:

$ perl Makefile.PL -httpd /my/local/apache/bin/httpd

and /my/local/apache/bin/httpd will be propagated throughout the rest of the process. πŸ’«

note that PHP needs to be active within Apache prior to configuring the test framework as shown above β€” either by virtue of PHP being compiled into the httpd binary statically, or through an active LoadModule statement within the configuration located in /my/local/apache/conf/httpd.conf. other required modules are the (very common) mod_alias and mod_env.

now, just like with Apache::TestRun and Apache::TestRunPerl, you can place client-side Perl test scripts under t/, such as t/01basic.t, and Apache-Test will run those scripts when you call make test. πŸ’–

but here's the thing that makes Apache::TestRunPHP unique β€” some added magic specifically tailored to a PHP environment. here are the mechanics, bestie:

Apache::TestRunPHP will look for PHP test scripts that match this pattern:

t/response/TestFoo/bar.php

where Foo and bar can be literally anything you like, and t/response/Test* is case sensitive (so watch that shift key, ok?). when this format is adhered to, Apache::TestRunPHP will create an associated Perl test script called t/foo/bar.t, which will be executed when you call make test. all bar.t does is issue a simple GET to bar.php, leaving the actual testing to bar.php. in essence, you can forget that bar.t even exists. main character energy: bar.php. πŸ™ˆ

so what does bar.php look like? here's an example:

<?php
  print "1..1\n";
  print "ok 1\n"
?>

if it looks odd, that's ok because it is πŸ’€. I could explain to you exactly what this means, but it isn't important to understand the gory details. instead, it's sufficient to understand that when Apache::Test calls bar.php it feeds the results directly to Test::Harness, a module that comes with every Perl installation, and Test::Harness expects what it receives to be formatted in a very specific way.

by itself, all of this is pretty useless, so Apache::Test provides PHP testers with something much better. here is a much better example:

<?php
  # import the Test::More emulation layer
  # see
  #   http://search.cpan.org/dist/Test-Simple/lib/Test/More.pm
  # for Perl's documentation - these functions should behave
  # in the same way
  require 'test-more.php';

  # plan() the number of tests
  plan(6);

  # call ok() for each test you plan
  ok ('foo' == 'foo', 'foo is equal to foo');
  ok ('foo' != 'foo', 'foo is not equal to foo');

  # ok() can be other things as well
  is ('bar', 'bar', 'bar is bar');
  is ('baz', 'bar', 'baz is baz');
  isnt ('bar', 'beer', 'bar is not beer');
  like ('bar', '/ar$/', 'bar matches ar$');

  diag("printing some debugging information");

  # whoops! one too many tests.  I wonder what will happen...
  is ('biff', 'biff', 'baz is a baz');
?>

the include library test-more.php is automatically generated by Apache::TestConfigPHP, and configurations are tweaked in such a way that your PHP scripts can find it without issue. 🧚 the functions provided by test-more.php are equivalent in name and function to those in Test::More, a standard Perl testing library, so you can go see that manpage for details on the syntax and functionality of each. ⭐

at this point, we have enough in place to run some tests from PHP-land β€” a Makefile.PL to configure Apache for us, and a PHP script in t/response/TestFoo/bar.php to send some results out to the testing engine. πŸ”₯ issuing make test would start Apache, issue the request to bar.php, generate a report, and shut down Apache. the report would look something like this after running the tests in verbose mode (eg make test TEST_VERBOSE=1):

t/php/bar....1..6
ok 1 - foo is equal to foo
not ok 2 - foo is not equal to foo
#     Failed test (/src/devel/perl-php-test/t/response/TestFoo/bar.php at line 13)
ok 3 - bar is bar
not ok 4 - baz is baz
#     Failed test (/src/devel/perl-php-test/t/response/TestFoo/bar.php at line 17)
#           got: 'baz'
#      expected: 'bar'
ok 5 - bar is not beer
ok 6 - bar matches ar$
# printing some debugging information
ok 7 - baz is a baz
FAILED tests 2, 4, 7
        Failed 3/6 tests, 50.00% okay
Failed Test Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/php/bar.t                6    3  50.00%  2 4 7
Failed 1/1 test scripts, 0.00% okay. 1/6 subtests failed, 83.33% okay.

note that the actual test file that was run was t/php/bar.t. this file is autogenerated based on the t/response/TestFoo/bar.php pattern of your PHP script. t/php/bar.t happens to be written in Perl, but you really don't need to worry about it too much. πŸ’œ

and as an interesting aside: if you're using perl-5.8.3 or later, you can actually create your own t/foo.php client-side scripts and they will be run via php (using our php.ini). but more on that later... πŸ‘€


🌈 SEE ALSO 🌈

the best source of information about using Apache-Test with PHP (at this time) is probably the talk given at ApacheCon 2004 (<http://xrl.us/phpperl>), as well as the code from the talk (<http://xrl.us/phpperlcode>). there's also the online tutorial <http://perl.apache.org/docs/general/testing/testing.html> which has all of the mod_perl-specific syntax and features ported to PHP with this class. obsessed with the lore honestly. πŸ“šβœ¨


πŸ‘‘ AUTHOR πŸ‘‘

Apache-Test is a community effort, maintained by a group of dedicated volunteers. 🫢

Questions can be asked at the test-dev <at> httpd.apache.org list. For more information see: http://httpd.apache.org/test/.


and that's the whole page, bestie πŸ’– this one's perl v5.42.3, dated 2026-08-20, and it lives in the Apache...RunPHP(3pm) section β€” User Contributed Perl Documentation, periodt. πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from