- To run test cases as part of a group the test cases should really - be placed in files without the runner code... -
-<?php - require_once('../classes/io.php'); - - class FileTester extends UnitTestCase { - ... - } - - class SocketTester extends UnitTestCase { - ... - } -?> -- As many cases as needed can appear in a single file. - They should include any code they need, such as the library - being tested, but none of the simple test libraries. - -
- If you have extended any test cases, you can include them - as well. -
-<?php - require_once('../classes/io.php'); - - class MyFileTestCase extends UnitTestCase { - ... - } - SimpleTestOptions::ignore('MyFileTestCase'); - - class FileTester extends MyFileTestCase { - ... - } - - class SocketTester extends UnitTestCase { - ... - } -?> -- The FileTester class does - not contain any actual tests, but is a base class for other - test cases. - For this reason we use the - SimpleTestOptions::ignore() directive - to tell the upcoming group test to ignore it. - This directive can appear anywhere in the file and works - when a whole file of test cases is loaded (see below). - We will call this sample file_test.php. - -
- Next we create a group test file, called say group_test.php. - You will think of a better name I am sure. - We will add the test file using a safe method... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - require_once('file_test.php'); - - $test = &new GroupTest('All file tests'); - $test->addTestCase(new FileTestCase()); - $test->run(new HtmlReporter()); -?> -- This instantiates the test case before the test suite is - run. - This could get a little expensive with a large number of test - cases, so another method is provided that will only - instantiate the class when it is needed... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - require_once('file_test.php'); - - $test = &new GroupTest('All file tests'); - $test->addTestClass('FileTestCase'); - $test->run(new HtmlReporter()); -?> -- The problem with this method is that for every test case - that we add we will have - to require_once() the test code - file and manually instantiate each and every test case. - We can save a lot of typing with... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - - $test = &new GroupTest('All file tests'); - $test->addTestFile('file_test.php'); - $test->run(new HtmlReporter()); -?> -- What happens here is that the GroupTest - class has done the require_once() - for us. - It then checks to see if any new test case classes - have been created by the new file and automatically adds - them to the group test. - Now all we have to do is add each new file. - -
- There are two things that could go wrong and which require care... -
-
-
- - The file could already have been parsed by PHP and so no - new classes will have been added. You should make - sure that the test cases are only included in this file - and no others. - -
- - New test case extension classes that get included will be - placed in the group test and run also. - You will need to add a SimpleTestOptions::ignore() - directive for these classes or make sure that they are included - before the GroupTest::addTestFile() - line. - -
- The above method places all of the test cases into one large group. - For larger projects though this may not be flexible enough; you - may want to group the tests in all sorts of ways. -
-- To get a more flexible group test we can subclass - GroupTest and then instantiate it as needed... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - - class FileGroupTest extends GroupTest { - function FileGroupTest() { - $this->GroupTest('All file tests'); - $this->addTestFile('file_test.php'); - } - } -?> -- This effectively names the test in the constructor and then - adds our test cases and a single group below. - Of course we can add more than one group at this point. - We can now invoke the tests from a separate runner file... -
-<?php - require_once('file_group_test.php'); - - $test = &new FileGroupTest(); - $test->run(new HtmlReporter()); -?> -- ...or we can group them into even larger group tests... -
-<?php - require_once('file_group_test.php'); - - $test = &new BigGroupTest('Big group'); - $test->addTestCase(new FileGroupTest()); - $test->addTestCase(...); - $test->run(new HtmlReporter()); -?> -- If we still wish to run the original group test and we - don't want all of these little runner files, we can - put the test runner code around guard bars when we create - each group. -
-<?php - class FileGroupTest extends GroupTest { - function FileGroupTest() { - $this->GroupTest('All file tests'); - $test->addTestFile('file_test.php'); - } - } - - if (! defined('RUNNER')) { - define('RUNNER', true); - $test = &new FileGroupTest(); - $test->run(new HtmlReporter()); - } -?> -- This approach requires the guard to be set when including - the group test file, but this is still less hassle than - lots of separate runner files. - You include the same guard on the top level tests to make sure - that run() will run once only - from the top level script that has been invoked. -
-<?php - define('RUNNER', true); - require_once('file_group_test.php'); - - $test = &new BigGroupTest('Big group'); - $test->addTestCase(new FileGroupTest()); - $test->addTestCase(...); - $test->run(new HtmlReporter()); -?> -- As with the normal test cases, a GroupTest can - be loaded with the GroupTest::addTestFile() method. -
-<?php - define('RUNNER', true); - - $test = &new BigGroupTest('Big group'); - $test->addTestFile('file_group_test.php'); - $test->addTestFile(...); - $test->run(new HtmlReporter()); -?> -- - -
-
-Integrating legacy test cases
-
-
- If you already have unit tests for your code or are extending external - classes that have tests, it is unlikely that all of the test cases - are in SimpleTest format. - Fortunately it is possible to incorporate test cases from other - unit testers directly into SimpleTest group tests. -
-- Say we have the following - PhpUnit - test case in the file config_test.php... -
-class ConfigFileTest extends TestCase { - function ConfigFileTest() { - $this->TestCase('Config file test'); - } - - function testContents() { - $config = new ConfigFile('test.conf'); - $this->assertRegexp('/me/', $config->getValue('username')); - } -} -- The group test can recognise this as long as we include - the appropriate adapter class before we add the test - file... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - require_once('simpletest/adapters/phpunit_test_case.php'); - - $test = &new GroupTest('All file tests'); - $test->addTestFile('config_test.php'); - $test->run(new HtmlReporter()); -?> -- There are only two adapters, the other is for the - PEAR - 1.0 unit tester... -
-<?php - require_once('simpletest/unit_tester.php'); - require_once('simpletest/reporter.php'); - require_once('simpletest/adapters/pear_test_case.php'); - - $test = &new GroupTest('All file tests'); - $test->addTestFile('some_pear_test_cases.php'); - $test->run(new HtmlReporter()); -?> -- The PEAR test cases can be freely mixed with SimpleTest - ones even in the same test file, - but you cannot use SimpleTest assertions in the legacy - test case versions. - This is done as a check that you are not accidently making - your test cases completely dependent on SimpleTest. - You may want to do a PEAR release of your library for example - which would mean shipping it with valid PEAR::PhpUnit test - cases. - - -