stas 01/12/27 03:11:13 Modified: src/docs/2.0/devel/writing_tests writing_tests.pod Log: - completing the porting of 'make test' docs from modperl_dev.pod Revision Changes Path 1.30 +170 -89 modperl-docs/src/docs/2.0/devel/writing_tests/writing_tests.pod Index: writing_tests.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/devel/writing_tests/writing_tests.pod,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- writing_tests.pod 2001/12/27 07:33:03 1.29 +++ writing_tests.pod 2001/12/27 11:11:13 1.30 @@ -56,10 +56,13 @@ proceed with the tests and it's not a must pass test, you just skip it. -It's important to know that there is a special verbose mode, enabled -with the I<-verbose> option, in which everything printed by the test -goes to C<STDOUT>. So for example if your test does this: +=head2 Verbose Testing +By default print() statements in the test script are filtered out by +C<Test::Harness>. if you want the test to print what it does (if you +decide to debug some test) use C<-verbose> option. So for example if +your test does this: + print "# testing : feature foo\n"; print "# expected: $expected\n"; print "# received: $received\n"; @@ -80,8 +83,8 @@ mode and send you back the report. It'll be much easier to understand what the problem is if you get these debug printings from the user. -In the section L<"How to Write Tests"> we discuss a few helper -functions which make the tests writing easier. +In the section L<"Writing Tests"> several helper functions which make +the tests writing easier are discussed. For more details about the C<Test::Harness> module please refer to its manpage. Also see the C<Test> manpage about Perl's test suite. @@ -111,10 +114,19 @@ testing environments which both use C<Apache::Test> for their test suites. +=head2 Testing Options + +Run: + + % t/TEST -help + +to get the list of options you can use during testing. They are +covered in the rest of this document. + =head2 Basic Testing -Running tests is just like for any CPAN Perl module; first we create -the I<Makefile> and build everything with I<make>: +Running tests is just like for any CPAN Perl module; first we generate +the I<Makefile> file and build everything with I<make>: % perl Makefile.PL [options] % make @@ -125,44 +137,64 @@ % make test but it adds quite an overhead, since it has to check that everything -is up to date (the usual C<make> source change control). Therefore -faster to run the tests directly via: +is up to date (the usual C<make> source change control). Therefore you +have to run it only once after C<make> and for re-running the tests +it's faster to run the tests directly via: % t/TEST -In case something goes wrong you should run the tests in the verbose -mode: +When C<make test> or C<t/TEST> are run, all tests found in the I<t> +directory (files ending with I<.t> are recognized as tests) will be +run. - % t/TEST -verbose +=head2 Individual Testing -In this case the test may print useful information, like what values -it expects and what values it receives, given that the test is written -to report these. In the silent mode (without C<-verbose>) these printouts -are suppressed by the test suite. +To run a single test, simple specify it at the command line. For +example to run the test file I<t/protocol/echo.t>, execute: -When debugging problems it helps to keep the I<error_log> file open in -another console, and see the debug output in the real time via -tail(1): + % t/TEST protocol/echo - % tail -f t/logs/error_log +Notice that you don't have to add the I<t/> prefix and I<.t> extension +for the test filenames if you specify them explicitly, but you can +have these as well. Therefore the following are all valid commands: -Of course this file gets created only when the server starts, so you -cannot run tail(1) on it before the server starts. + % t/TEST protocol/echo.t + % t/TEST t/protocol/echo + % t/TEST t/protocol/echo.t + +The server will be stopped if it was already running and a new one +will be started before running the I<t/protocol/echo.t> test. At the +end of the test the server will be shut down. + +When you run specific tests you may want to run them in the verbose +mode, and depending on how the test was written, you may get more +debug information under this mode. This mode is turned on with +I<-verbose> option: + + % t/TEST -verbose protocol/echo + +You can run groups of tests at once. This command: + + % ./t/TEST modules protocol/echo + +will run all the tests in I<t/modules/> directory, followed by +I<t/protocol/echo.t> test. -[F] Later on we will talk about I<-clean> option, for now just -remember that if you use it I<t/logs/error_log> is deleted, therefore -you have to run the tail(1) command again, when the server is -started. [/F] - -If you have to run the same tests repeatedly, in most cases you don't -want to wait for the server to start every time. You can start it -once: +=head2 Repetitive Testing + +By default when you run the test without I<-run-tests> option, the +server will be started before the testing and stopped at the end. If +during a debugging process you need to re-run tests without a need to +restart the server, you can start the server once: + % t/TEST -start-httpd + +and then run the test(s) with I<-run-tests> option many times: -and then run tests without restarting the server using I<-run> option: + % t/TEST -run-tests - % t/TEST -run +without waiting for the server to restart. When you are done with tests, stop the server with: @@ -182,45 +214,16 @@ PerlSetVar ReloadModules "TestDirective::*" and restart the server. - -If none of the tests are specified at the command line all tests found -in the I<t> directory (files ending with I<.t> are recongnized as -tests) will be run. To run specific tests, they should be explicitly -specified. For example to run the test file I<t/protocol/echo.t> we -execute: - - % t/TEST -run protocol/echo - -notice that you don't have to add the I<t/> prefix and I<.t> extension -for the test filenames if you specify them explicitly. - -When you run specific tests you may want to run them in the verbose -mode, and depending on how the test was written, you may get more -debug information under this mode. This mode is turned on with I<-verbose> -option: - - % t/TEST -run -verbose protocol/echo - -You can run all the tests in a single directory by just passing this -directory as an argument. You can pass more than one test or directory -name at the same time. Thefore assuming that the directory -I<t/protocol> includes only two files: I<echo.t> and I<eliza.t>--the -following two commands are equivalent: - % t/TEST -run protocol/echo protocol/eliza - % t/TEST -run protocol +The I<-start-httpd> option always stops the server first if any is +running. In case you have a server runnning on the same port, (for +example if you develop the a few tests at the same time in different +trees), you should run the server on a different port. C<Apache::Test> +will try to automatically pick a free port, but you can explicitly +tell on which port to run, using the I<-port> configuration option: -The command: +META: -port=select is not yet committed! - % t/TEST -start-httpd - -always stops the server first if any is running. In case you have a -server runnning on the same port, (for example if you develop the a -few tests at the same time in different trees), you should run the -server on a different port. C<Apache::Test> will try to automatically -pick a free port, but you can explicitly tell on which port to run, -using the I<-port> configuration option: - % t/TEST -start-httpd -port 8799 or by setting an evironment variable C<APACHE_PORT> to the desired @@ -231,6 +234,31 @@ passed as arguments to I<t/TEST> they will be run in a specified order. +=head2 Verbose Testing + +In case something goes wrong you should run the tests in the verbose +mode: + + % t/TEST -verbose + +In this case the test may print useful information, like what values +it expects and what values it receives, given that the test is written +to report these. In the silent mode (without C<-verbose>) these +printouts are filtered out by C<Test::Harness>. When running in the +I<verbose> mode usually it's a good idea to run only problematic tests +to minimize the size of the generated output. + +When debugging problems it helps to keep the I<error_log> file open in +another console, and see the debug output in the real time via +tail(1): + + % tail -f t/logs/error_log + +Of course this file gets created only when the server starts, so you +cannot run tail(1) on it before the server starts. Every time C<t/TEST +-clean> is run, I<t/logs/error_log> gets deleted, therefore you have +to run the tail(1) command again, when the server is started. + =head2 Stress Testing =head3 The Problem @@ -543,11 +571,11 @@ % t/TEST -ping=block -This can be useful in conjunction with I<-run> option during debugging: +This can be useful in conjunction with I<-run-tests> option during debugging: - % t/TEST -ping=block -run + % t/TEST -ping=block -run-tests -normally, I<-run> will immediately quit if it detects that the server +normally, I<-run-tests> will immediately quit if it detects that the server is not running, but with I<-ping=block> in effect, it'll wait indefinitely for the server to start up. @@ -983,8 +1011,8 @@ and assuming that the I<ServerRoot> is I<~/modperl-2.0/t/>, when I<my-extra.conf> will be created, it'll look like: - file:my-extra.conf.in - --------------------- + file:my-extra.conf + ------------------ PerlSwitches -Mlib=~/modperl-2.0/t/../lib The valid tokens are defined in C<%Apache::TestConfig::Usage> and also @@ -1774,7 +1802,7 @@ now we run the test: - % ./t/TEST -run -verbose skip_subtest_1 + % ./t/TEST -run-tests -verbose skip_subtest_1 skip_subtest_1....1..4 ok 1 # skip foo is missing ok 2 # skip foo is missing @@ -2161,34 +2189,55 @@ Perl and C debuggers, and this knowledge will save you a lot of time and grief in a long run. -=head2 Tracing +=head2 Under C debugger -Start the server under strace(1): +mod_perl-2.0 provides built in 'make test' debug facility. So in case +you get a core dump during make test, or just for fun, run in one shell: - % t/TEST -debug strace + % t/TEST -debug -The output goes to I<t/logs/strace.log>. +in another shell: -META: complete + % t/TEST -run-tests -run .t test under the perl debugger -% t/TEST -d perl t/modules/access.t +then the I<-debug> shell will have a C<(gdb)> prompt, type C<where> +for stacktrace: -run .t test under the perl debugger (nonstop mode, output to t/logs/perldb.out) -% t/TEST -d perl=nostop t/modules/access.t + (gdb) where -turn on -v and LWP trace (1 is the default) mode in Apache::TestRequest -% t/TEST -d lwp t/modules/access.t +You can change the default debugger by supplying the name of the +debugger as an argument to I<-debug>. E.g. to run the server under +C<ddd>: -turn on -v and LWP trace mode (level 2) in Apache::TestRequest -% t/TEST -d lwp=2 t/modules/access.t + % ./t/TEST -debug=ddd +META: list supported debuggers +If you debug mod_perl internals you can set the breakpoints using the +I<-breakpoint> option, which can be repeated as many times as +needed. When you set at least one breakpoint, the server will start +running till it meets the I<ap_run_pre_config> breakpoint. At this +point we can set the breakpoint for the mod_perl code, something we +cannot do earlier if mod_perl was built as DSO. For example: -=head2 Under C debugger + % ./t/TEST -debug -breakpoint=modperl_cmd_switches \ + -breakpoint=modperl_cmd_options + +will set the I<modperl_cmd_switches> and I<modperl_cmd_options> +breakpoints and run the debugger. + +If you want to tell the debugger to jump to the start of the mod_perl +code you may run: + + % ./t/TEST -debug -breakpoint=modperl_hook_init + +In fact I<-breakpoint> automatically turns on the debug mode, so you +can run: + + % ./t/TEST -breakpoint=modperl_hook_init -META: to be written + =head2 Under Perl debugger When the Perl code misbehaves it's the best to run it under the Perl @@ -2209,6 +2258,38 @@ go: META: to be completed + +run .t test under the perl debugger +% t/TEST -debug perl t/modules/access.t + +run .t test under the perl debugger (nonstop mode, output to t/logs/perldb.out) +% t/TEST -debug perl=nostop t/modules/access.t + +turn on -v and LWP trace (1 is the default) mode in Apache::TestRequest +% t/TEST -debug lwp t/modules/access.t + +turn on -v and LWP trace mode (level 2) in Apache::TestRequest +% t/TEST -debug lwp=2 t/modules/access.t + + +=head2 Tracing + +To get Start the server under strace(1): + + % t/TEST -debug strace + +The output goes to I<t/logs/strace.log>. + +Now in a second terminal run: + + % t/TEST -run-tests + +Beware that I<t/logs/strace.log> is going to be very big. + +META: can we provide strace(1) opts if we want to see only certain +syscalls? + + =head1 Writing Tests Methodology
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]