Table of Contents

Lessons Learned from PHPT Writing

I decided to write this mainly because I won’t be writing tests as a full time job any more so am using this to pass the responsibility over to the new testers! But also with the impending TestFests and general focus on testing in the community thought it would be worthwhile to share my knowledge. Some of the points below are quite specific to the extensions that I’ve written tests for (array, ctype, dir, ereg, imap, mbstring, mysql and pcre), but hopefully will be useful for testing in general and should highlight the kind of things that should be focused on to produce a good test suite. If anyone wishes to add to, change or edit this list then please feel free, I’d be interested to see what other people have to say!

I'd like to thank Zoe Slattery (zoe), Steve Seear (stevseea) and Robin Fernandes (robinf) for their help with producing this.

General:

Argument Types:

Expected Output:

This list is quite specific to using EXPECTF, the same ideas apply to EXPECTREGEX though!

Example:

string(%d) "The next bit might vary in length: %s"

Example:

object(C)#%d (1) {
   ["p"]=>
   bool(true)
}
resource(%d) of type (stream)

casting a resource to a string: you don’t know how many digits the number will be, so character count has to be %d too!

string(%d) "Resource id #%d"

Specific Extensions:

These are specific to extensions I have tested, but could probably be used in other extensions too.

MBString:

Anything requiring an external server (e.g. MySQL, IMAP):

$host = !empty($_ENV['TEST_HOST']) ? $_ENV['TEST_HOST'] : 'localhost';

Test Case Generator:

This script was written by Zoe Slattery (thank you!) and can be found in the PHP 5_3 source code in scripts/dev/generate_phpt.php. Although it’s in the 5_3 source code, I think I’m right in saying that it can be used to create tests for all versions of PHP. I use it for all the tests I have written and have found it to be incredibly useful! The basic format of it is that you pass a function name and a type of test (either basic, error or variation) and it will generate a template for the test. Below is how I have it set up on my machine (windows), and how I use it.

Use on command Line:

php.exe generate_phpt.php –h

will give a good overview of how to use the test case generator, there are things that I set every time I use it so have that in a batch file.

gen.bat file:

cd <place to store generated tests>
php.exe <location of generate_phpt.php script> -s <location of source code> -f %*

I then type the function name and the type of test I want, e.g.

gen.bat array_key_exists –b

This will generate a basic test for array_key_exists. All I need to do now is fill out the EXPECTF section of the file!

Variation tests:

gen.bat array_key_exists –v

will generate variation tests. There will be one for each of the functions argument and an empty test. The numbered variations will iterate over an array of different data types and pass them as an argument, these tests are very useful! Again all that needs doing with these is changing the title (in the -- TEST -- section), add a comment explaining what the test is doing and filling out the EXPECTF section. With the blank variation test is a template for any other variation tests the function needs.

Submitting Tests

If you concentrate on a certain extension you will probably write several tests for this extension. When it's done you can submit those tests to the TestFest website, but be sure, that every test is working fine. You can do so by running:

make test TESTS=/path/to/php5/ext/yourextension/tests