- The heart of SimpleTest is a testing framework built around - test case classes. - These are written as extensions of base test case classes, - each extended with methods that actually contain test code. - Top level test scripts then invoke the run() - methods on every one of these test cases in order. - Each test method is written to invoke various assertions that - the developer expects to be true such as - assertEqual(). - If the expectation is correct, then a successful result is dispatched to the - observing test reporter, but any failure triggers an alert - and a description of the mismatch. -
-- A test case looks like this... -
-<?php -class MyTestCase extends UnitTestCase { - - function testLog() { - $log = &new Log('my.log'); - $log->message('Hello'); - $this->assertTrue(file_exists('my.log')); - } -} -?> -- -
- These tools are designed for the developer. - Tests are written in the PHP language itself more or less - as the application itself is built. - The advantage of using PHP itself as the testing language is that - there are no new languages to learn, testing can start straight away, - and the developer can test any part of the code. - Basically, all parts that can be accessed by the application code can also be - accessed by the test code if they are in the same language. -
-- The simplest type of test case is the - UnitTestCase. - This class of test case includes standard tests for equality, - references and pattern matching. - All these test the typical expectations of what you would - expect the result of a function or method to be. - This is by far the most common type of test in the daily - routine of development, making up about 95% of test cases. -
-- The top level task of a web application though is not to - produce correct output from its methods and objects, but - to generate web pages. - The WebTestCase class tests web - pages. - It simulates a web browser requesting a page, complete with - cookies, proxies, secure connections, authentication, forms, frames and most - navigation elements. - With this type of test case, the developer can assert that - information is present in the page and that forms and - sessions are handled correctly. -
-- A WebTestCase looks like this... -
-<?php -class MySiteTest extends WebTestCase { - - function testHomePage() { - $this->get('http://www.my-site.com/index.php'); - $this->assertTitle('My Home Page'); - $this->clickLink('Contact'); - $this->assertTitle('Contact me'); - $this->assertWantedPattern('/Email me at/'); - } -} -?> -- - -
-
-Feature list
-
-
- The following is a very rough outline of past and future features - and their expected point of release. - I am afraid it is liable to change without warning as meeting the - milestones rather depends on time available. - Green stuff has been coded, but not necessarily released yet. - If you have a pressing need for a green but unreleased feature - then you should check-out the code from sourceforge CVS directly. - A released feature is marked as "Done". -
Feature | Description | Release | -
---|---|---|
Unit test case | -Core test case class and assertions | -Done | -
Html display | -Simplest possible display | -Done | -
Autoloading of test cases | -- Reading a file with test cases and loading them into a - group test automatically - | -Done | -
Mock objects code generator | -- Objects capable of simulating other objects removing - test dependencies - | -Done | -
Server stubs | -- Mocks without expectations to be used outside of test cases, - e.g. for prototyping - | -Done | -
Integration of other unit testers | -- The ability to read and simulate test cases from PHPUnit - and PEAR::PhpUnit - | -Done | -
Web test case | -Basic pattern matching of fetched pages | -Done | -
HTML parsing of pages | -Allows link following and title tag matching | -Done | -
Partial mocks | -- Mocking parts of a class for testing less than a class - or for complex simulations - | -Done | -
Web cookie handling | -Correct handling of cookies when fetching pages | -Done | -
Following redirects | -Page fetching automatically follows 300 redirects | -Done | -
Form parsing | -Ability to submit simple forms and read default form values | -Done | -
Command line interface | -Test display without the need of a web browser | -Done | -
Exposure of expectation classes | -Can create precise tests with mocks as well as test cases | -Done | -
XML output and parsing | -- Allows multi host testing and the integration of acceptance - testing extensions - | -Done | -
Command line test case | -Allows testing of utilities and file handling | -Done | -
PHP Documentor compatibility | -Fully generated class level documentation | -Done | -
Browser interface | -- Exposure of lower level web browser interface for more - detailed test cases - | -Done | -
HTTP authentication | -- Fetching protected web pages with basic authentication - only - | -Done | -
Browser navigation buttons | -Back, forward and retry | -Done | -
SSL support | -Can connect to https: pages | -Done | -
Proxy support | -Can connect via. common proxies | -Done | -
Frames support | -Handling of frames in web test cases | -Done | -
Improved display | -Better web GUI with tree display of test cases | -1.1 | -
Localisation | -Messages abstracted and code generated from XML | -1.1 | -
File upload testing | -Can simulate the input type file tag | -1.1 | -
Mocking interfaces | -Can generate mock objects to interfaces as well as classes | -2.0 | -
Testing exceptions | -Similar to testing PHP errors | -2.0 | -
XPath searching of elements | -Can make use of HTML tidy for faster and more flexible content matching | -2.0 | -
-
-Web resources for testing
-
-
- Process is at least as important as tools. - The type of process that makes the heaviest use of a developer's - testing tool is of course - Extreme Programming. - This is one of the - Agile Methodologies - which combine various practices to "flatten the cost curve" of software development. - More extreme still is Test Driven Development, - where you very strictly adhere to the rule of no coding until you have a test. - If you're more of a planner or believe that experience trumps evolution, - you may prefer the - RUP approach. - I haven't tried it, but even I can see that you will need test tools (see figure 9). -
-- Most unit testers clone JUnit to some degree, - as far as the interface at least. There is a wealth of information on the - JUnit site including the - FAQ - which contains plenty of general advice on testing. - Once you get bitten by the bug you will certainly appreciate the phrase - test infected - coined by Eric Gamma. - If you are still reviewing which unit tester to use the main choices - are PHPUnit - and Pear PHP::PHPUnit. - They currently lack a lot of features found in - SimpleTest, but the PEAR - version at least has been upgraded for PHP5 and is recommended if you are porting - existing JUnit test cases. -
-- Library writers don't seem to ship tests with their code very often - which is a shame. - Library code that includes tests can be more safely refactored and - the test code can act as additional documentation in a fairly standard - form. - This can save trawling the source code for clues when problems occour, - especially when upgrading such a library. - Libraries using SimpleTest for their unit testing include - WACT and - PEAR::XML_HTMLSax. -
-- There is currently a sad lack of material on mock objects, which is a shame - as unit testing without them is a lot more work. - The original mock objects paper - is very Java focused, but still worth a read. - As a new technology there are plenty of discussions and debate on how to use mocks, - often on Wikis such as - Extreme Tuesday - or www.mockobjects.com - or the original C2 Wiki. - Injecting mocks into a class is the main area of debate for which this - paper on IBM - makes a good starting point. -
-- There are plenty of web testing tools, but most are written in Java and - tutorials and advice are rather thin on the ground. - The only hope is to look at the documentation for - HTTPUnit, - HTMLUnit - or JWebUnit and hope for clues. - There are some XML driven test frameworks, but again most - require Java to run. - As SimpleTest does not support JavaScript you would probably - have to look at these tools anyway if you have highly dynamic - pages. -
- -