GNU/Linux Free Software & Open Source, Programming & Web Development

Easy PHP code test development with SimpleTest unit testing framework

Simpletest, Unit Testing for PHP

Testing is a task every developer has to do eventually on any programming project. You can do it manually after writing all your code to see if it works as you intended, or better yet, before writing your code, using test driven development techniques that will save you time and frustrations down the road. One of those techniques is called Unit Testing.

Ideally, unit testing takes place before writing any code. Its a way to plan out how your functions, classes and objects will behave. The basic idea is that you plan the outcomes of each part of your program, then you write those parts to provide that outcome. So think of it as a black box that you will give some input and expect some output. This way you know how objects will be organized, what methods to write in each class, what needs to be their input and how are they going to output the results. Having all your code in tests will help you add new features, change or refactor parts of your code faster without the fear of breaking something else in your software. If you changed something and all your tests still pass, you’re good to go, if not, you can easily track down where the error is and what got affected.

PHP is famous for having spaghetti code and being too flexible that you can mess things out pretty fast, specially when you’re not an experienced programmer, or you have a team of developers with different programming styles and experience working on several components of the same project.

Although there are several unit testing frameworks for PHP, I’ll talk about SimpleTest since its very light, easy to install and easy to learn. Also, if you’re a Drupal developer, its the testing framework of choice.

Setup

To install it, go to the Simpletest download page and get the latest version. Extract the files to your PHP path, or use require_once() calls to the autorun file:

<?php 
require_once('simpletest/autorun.php');

Usage

Here’s an example of a class’ tests (testfile.php):

<?php
/* SimpleTest framework 
 set the path to where your simpletest folder is located.
 in this case, its in the same directory as the test file */
require_once('simpletest/autorun.php');

/* The class file I want to test */
require_once('myclass.php');

class MyclassTest extends UnitTestCase {

    function testGetList() {
       /* Create instance of class */
       $obj = new MyClass();

       /* call method to test */
       $result = $obj->getList(5);

       /* test result is an array */
       $this->assertTrue(is_array($result));

       /* test correct number of output elements */
       $this->assertEqual(count($result), 5);

       /* make a different call with different parameter */
       $result = $obj->getList();

       /* confirm that output is always an array, even with 0 elements */
       $this->assertTrue(is_array($result));
    }
}

Now you have a basic skeleton of you methods and their behaviors, now you can go ahead and write the real code (myclass.php).

<?php   
class MyClass {
   /**
   * Create a list of numbers
   * @param integer $size The number of elements of the list
   * @return array The list of numbers
   */
   public function getList($size = Null) {
       $list = array();
       if(!$size) {
           return $list;
       } 
       else {
           for($i=0;$i<$size;$i++) {
              $list[] = $i;
           }
       }
       return $list;
   }
}

Run it

Once we’ve written the class, we can test out its methods by running our tests script. You can do that by using the command line, or by viewing the php script in a browser window.

Personally, I prefer to use the command line for convenience and faster testing without needing even to setup any web server. Running it will look like this:

$ php testfile.php 
testfile.php
OK
Test cases run: 1/1, Passes: 3, Failures: 0, Exceptions: 0

Do more

This is a very small and simple test, but you can also test out the interface of your project. SimpleTest has a browser class that can perform some events like simulating browser visits, doing clicks on your interface’s links and checking the HTML structure of the web server responses.

Check out the full documentation, which is very easily laid out as a big tutorial, and start testing all your code!

About the author

Gabriel Saldaña Gabriel Saldaña is a web developer, photographer and free software advocate. Connect with him on and Twitter

Creative Commons License
Easy PHP code test development with SimpleTest unit testing framework by Gabriel Saldaña, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Share Alike 2.5 Mexico License.

Standard

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>