writing tests with apache-test · 2017-06-14 · 1 writing tests with apache-test geoffrey young...
TRANSCRIPT
![Page 2: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/2.jpg)
http://www.modperlcookbook.org/ 2
Apache-Test
• Framework for testing Apache-based application components
• Provides tools to make testing Apache related things simple–configures, starts, and stops Apache–lets you focus on writing tests–provides HTTP-centric tools
• Gives you a self-contained, pristine Apache environment for testing
![Page 3: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/3.jpg)
http://www.modperlcookbook.org/ 3
Apache-Test by Example
• Write a simple Perl handler
• Integrate Apache-Test
• Show all kinds of cool stuff
![Page 4: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/4.jpg)
http://www.modperlcookbook.org/ 4
package My::AuthenHandler; use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED); use Apache2::RequestRec ();use Apache2::Access (); sub handler { my $r = shift; # Get the client-supplied credentials. my ($status, $password) = $r->get_basic_auth_pw; return $status unless $status == Apache2::Const::OK; # Perform some custom user/password validation. return Apache2::Const::OK if $r->user eq $password; # Whoops, bad credentials. $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED;} 1;
![Page 5: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/5.jpg)
http://www.modperlcookbook.org/ 5
Voila!
![Page 6: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/6.jpg)
http://www.modperlcookbook.org/ 6
Testing, Testing... 1, 2, 3
1. Generate the test harness
2. Configure Apache
3. Write the tests
![Page 7: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/7.jpg)
http://www.modperlcookbook.org/ 7
Step 1 - The Test Harness
• Generally starts from Makefile.PL
• There are other ways as well
![Page 8: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/8.jpg)
http://www.modperlcookbook.org/ 8
Makefile.PL
use Apache::TestMM qw(test clean);use Apache::TestRunPerl ();
# configure tests based on incoming argumentsApache::TestMM::filter_args();
# generate the test harness (t/TEST)Apache::TestRunPerl->generate_script();
![Page 9: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/9.jpg)
http://www.modperlcookbook.org/ 9
t/TEST
• generate_script() creates the special file t/TEST
• t/TEST is the actual harness that coordinates testing activities
• called via make test
• can be called directly$ t/TEST t/foo.t
![Page 10: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/10.jpg)
http://www.modperlcookbook.org/ 10
Step 1 - The Test Harness
• Don't get bogged down with Makefile.PL details
• Lather, Rinse, Repeat
![Page 11: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/11.jpg)
http://www.modperlcookbook.org/ 11
Testing, Testing... 1, 2, 3
1. Generate the test harness
2. Configure Apache
![Page 12: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/12.jpg)
http://www.modperlcookbook.org/ 12
Step 2 - Configure Apache
• Apache needs a basic configuration to service requests– ServerRoot t/– DocumentRoot t/htdocs– ErrorLog t/logs/error_log– Listen 8529– LoadModule
• Apache-Test "intuits" these and creates its own httpd.conf
• Configures all that is required to GEThttp://localhost:8529/index.html
![Page 13: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/13.jpg)
http://www.modperlcookbook.org/ 13
Adding to the Default Config
• When testing we generally need more than the default
• Instead of altering httpd.conf we augment it with a special file
• t/conf/extra.conf.in
![Page 14: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/14.jpg)
http://www.modperlcookbook.org/ 14
extra.conf.in
• Same directives as httpd.conf
• Pulled into httpd.conf via Include
• Provides handy variable substitution
![Page 15: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/15.jpg)
http://www.modperlcookbook.org/ 15
Create the Configuration
• Our handler is an authentication handler
• Let's set up a protected URI using t/conf/extra.conf.in
![Page 16: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/16.jpg)
http://www.modperlcookbook.org/ 16
extra.conf.in
Alias /authen @DocumentRoot@
<Location /authen> Require valid-user AuthType Basic AuthName "my test realm"
PerlAuthenHandler My::AuthenHandler</Location>
![Page 17: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/17.jpg)
http://www.modperlcookbook.org/ 17
Whew!
• At this point we have...–autogenerated a minimal Apache configuration–configured a protected URL–created a mod_perl handler to do the authentication
• Now...
![Page 18: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/18.jpg)
http://www.modperlcookbook.org/ 18
Testing, Testing... 1, 2, 3
1. Generate the test harness
2. Configure Apache
3. Write the tests
![Page 19: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/19.jpg)
http://www.modperlcookbook.org/ 19
What Should We Test?• Tests need to be meaningful
• Tests ought to be thorough
• Tests should align the server response with our expected results
![Page 20: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/20.jpg)
http://www.modperlcookbook.org/ 20
In Other Words...
• Our handler is an authentication handler
• Unknown users should fail
• Known users should pass
![Page 21: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/21.jpg)
http://www.modperlcookbook.org/ 21
What Exactly is a Test?• Tests are contained within a test file
• The test file acts as a client
• The client is scripted to– query the server– compare server response to expected results– indicate success or failure
![Page 22: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/22.jpg)
http://www.modperlcookbook.org/ 22
The t/ Directory
• Tests live in t/
– t/01basic.t
• t/ is the ServerRoot
– t/htdocs
– t/cgi-bin
– t/conf
![Page 23: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/23.jpg)
http://www.modperlcookbook.org/ 23
Anatomy of a Test
• Apache-Test works the same way as Test.pm, Test::More and others
• plan() the number of tests
• call ok() for each test you plan– where ok() is any one of a number of
comparison functions
• All the rest is up to you
![Page 24: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/24.jpg)
http://www.modperlcookbook.org/ 24
t/01basic.t
use Apache::Test;use Apache::TestRequest;
plan tests => 1, (need_lwp && need_auth && need_module('mod_perl.c'));
![Page 25: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/25.jpg)
http://www.modperlcookbook.org/ 25
Apache::Test
• Provides basic Test.pm functions
– ok()
– plan()
• Also provides helpful plan() functions
– need_lwp()
– need_module()
– need_min_apache_version()
![Page 26: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/26.jpg)
http://www.modperlcookbook.org/ 26
plan()
• plan() the number of tests in the fileplan tests => 5;
• Preconditions can be specifiedplan tests => 5, need_module('mod_foo');
• Failed preconditions will skip the entire test file
server localhost.localdomain:8529 startedt/01basic....skipped all skipped: cannot find module 'mod_foo.c'All tests successful, 1 test skipped.
![Page 27: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/27.jpg)
http://www.modperlcookbook.org/ 27
t/01basic.t
use Apache::Test;use Apache::TestRequest;
plan tests => 1, (need_lwp && need_auth && need_module('mod_perl.c'));
{ my $uri = '/authen/index.html';
my $response = GET $uri; ok $response->code == 401;}
![Page 28: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/28.jpg)
http://www.modperlcookbook.org/ 28
Apache::TestRequest
• Provides a basic LWP interface– GET()– POST()– HEAD()– GET_OK()– GET_BODY()–more
• Note that these functions know which host and port to send the request to
GET '/authen/index.html';
– request URI can be relative
![Page 29: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/29.jpg)
http://www.modperlcookbook.org/ 29
HTTP::Response
• LWP base class
• Provides accessors to response attributes– code()– content()– content_type(), content_length(), etc– headers()• authorization()
• as well as some useful utility methods– as_string()– previous()
![Page 30: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/30.jpg)
http://www.modperlcookbook.org/ 30
Testing, Testing... 1, 2, 3
1. Generate the test harness
2. Configure Apache
3. Write the tests
4. Run the tests
![Page 31: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/31.jpg)
http://www.modperlcookbook.org/ 31
The Pain is Over• Initial setup is a bit complex– you only do it once
• Running the tests is simple$make test
$t/TEST
![Page 32: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/32.jpg)
http://www.modperlcookbook.org/ 32
![Page 33: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/33.jpg)
http://www.modperlcookbook.org/ 33
![Page 34: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/34.jpg)
http://www.modperlcookbook.org/ 34
![Page 35: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/35.jpg)
http://www.modperlcookbook.org/ 35
Client-Side Tests
![Page 36: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/36.jpg)
http://www.modperlcookbook.org/ 36
![Page 37: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/37.jpg)
http://www.modperlcookbook.org/ 37
Are you ok?
• ok() works, but is not descriptive
• luckily, we have options– Apache::TestUtil
– Test::More
![Page 38: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/38.jpg)
http://www.modperlcookbook.org/ 38
Apache::TestUtil
• Chocked full of helpful utilities• t_cmp()
t_cmp($foo, $bar, 'foo is bar');
t_cmp($foo, qr/bar/, 'foo matches bar');
• t_write_file($file, @lines);– write out a file– clean it up after script execution completes
• t_write_perl_script($file, @lines);– same as t_write_file()– with compilation-specific shebang line– useful for writing out CGI scripts
![Page 39: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/39.jpg)
http://www.modperlcookbook.org/ 39
use Apache::Test;use Apache::TestRequest;
plan tests => 1, (need_lwp && need_auth && need_module('mod_perl.c')); { my $uri = '/authen/index.html'; my $response = GET $uri; ok $response->code == 401;}
![Page 40: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/40.jpg)
http://www.modperlcookbook.org/ 40
But Wait, There's More!
• Test::More is the Perl testing standard
• Goes beyond Apache-Test's t_cmp()
![Page 41: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/41.jpg)
http://www.modperlcookbook.org/ 41
Test::More functions• Basic comparisons– ok()– is()– like()
• Intuitive comparisons– isnt()– unlike()
• Complex structures– is_deeply()– eq_array()
![Page 42: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/42.jpg)
http://www.modperlcookbook.org/ 42
use Apache::Test qw(-withtestmore);use Apache::TestRequest;
plan tests => 1, (need_lwp && need_auth && need_module('mod_perl.c')); { my $uri = '/authen/index.html'; my $response = GET $uri; is ($response->code, 401, "no valid password entry");}
![Page 43: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/43.jpg)
http://www.modperlcookbook.org/ 43
server localhost.localdomain:8529 startedt/authen03....1..1ok 1 - no valid password entryokAll tests successful.
server localhost.localdomain:8529 startedt/authen03....1..1not ok 1 - no valid password entry # Failed test (t/authen03.t at line 18)# got: '200'# expected: '401'# Looks like you failed 1 test of 1.
![Page 44: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/44.jpg)
http://www.modperlcookbook.org/ 44
Using Test::More
• Test::More is the Perl-world standard
• You should use Test::More whenever possible
• Eventually -withtestmore will not be required
![Page 45: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/45.jpg)
http://www.modperlcookbook.org/ 45
Getting Back to the Point...• So far, we haven't actually tested
anything useful– no username or password
• Let's add some real tests
![Page 46: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/46.jpg)
http://www.modperlcookbook.org/ 46
my $uri = '/authen/index.html'; { my $response = GET $uri; is ($response->code, 401, "no valid password entry");} { my $response = GET $uri, username => 'geoff', password => 'foo'; is ($response->code, 401, "password mismatch");}
{ my $response = GET $uri, username => 'geoff', password => 'geoff'; is ($response->code, 200, "geoff:geoff allowed to proceed");}
![Page 47: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/47.jpg)
http://www.modperlcookbook.org/ 47
Take Advantage of LWP# check cache-friendliness
$last_modified = $res->header('Last-Modified');
$res = GET $uri, 'If-Modified-Since' => $last_modified;
ok $res->code == 304;
![Page 48: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/48.jpg)
http://www.modperlcookbook.org/ 48
It's not just for mod_perl
• Apache-Test was designed with the mod_perl API in mind
• Generic enough to test components of any Apache-centric environment
![Page 49: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/49.jpg)
http://www.modperlcookbook.org/ 49
SOAP::Lite-based APIuse SOAP::Lite +autodispatch => uri => 'http://intranet/Foo/Email/SOAP', proxy => 'http://intranet/Email';
my $rc = add_user('foo', 'foo.com', 'Pete', 'bar');
![Page 50: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/50.jpg)
http://www.modperlcookbook.org/ 50
extra.conf.in
<Location /Email> SetHandler perl-script PerlHandler Apache::SOAP
PerlSetVar dispatch_to "Foo::Email::SOAP"</Location>
![Page 51: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/51.jpg)
http://www.modperlcookbook.org/ 51
Perluse Apache::Test;;
plan tests => 1, need_module('Apache::SOAP');
use SOAP::Lite +autodispatch => uri => 'http://localhost:8529/Foo/Email/SOAP', proxy => 'http://localhost:8529/Email';
my $rc = add_user('foo', 'foo.com', 'Pete', 'bar');
![Page 52: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/52.jpg)
http://www.modperlcookbook.org/ 52
Non-Perluse Apache::Test;
plan tests => 1, need_module('Apache::SOAP');
my $rc = qx!java email_soap_client 'http://localhost:8529/' Email add_user foo foo.com Pete bar!;
![Page 53: Writing Tests with Apache-Test · 2017-06-14 · 1 Writing Tests with Apache-Test Geoffrey Young geoff@modperlcookbook.org](https://reader033.vdocuments.net/reader033/viewer/2022042710/5f675832726ee93624467ae9/html5/thumbnails/53.jpg)
http://www.modperlcookbook.org/ 53
But Wait, There's More!• Letting Apache-Test run all your tests
• Automagic configuration via __DATA__
• Integrated Apache C-module support
• Server-side tests