Jump to content

Writing tests

From NusaATK
Revision as of 17:54, 14 May 2007 by bahtiar (talk | contribs) (Highlighting, cleanup, adherence to coding standards.)

(This howto is a work in progress) To create a test you need to take the following steps:

Create a directory 'testcases' in the directory where the class is located that you want to write a testcase for.

In the directory you need to place one or more files with the name:

 class.test_[testname].inc

A test cases needs the following structure:

  atkimport("[modulename].[class you want to test]");

  /**
   * Unittests for the example class
   *
   */
  class test_testcase_name extends atkTestCase 
  {
    /**
     * Default constructor.
     */
    public function __construct()
    {
      parent::__construct(); //Not necessary now, but maybe in the future.
      $this->addFixture('module.table'); //Fixtures need to be loaded in the constructor.
    }

    /**
     * This function will be called before all other test_* functions. Use it to initialise
     * your testclass.
     */
    function setUp()
    {
      //Don't forget to call the setUp of the parent.
      parent::setUp();
    }

    /**
     * This function will be called after all other test_* functions. 
     * Useful to clean stuff up.
     */
    function tearDown()
    {
      //Don't forget to call the teadDown of the parent.
      parent::tearDown();
    }

    /**
     * Simple test function
     */
    function test_doSomething()
    {
      //Do some stuff
      $class = new exampleclass();
      $class->doSomething();
      $result = $class->getSomeValue();
      $this->assertEqual($result,'expected_value','text in the test.');
    }
  }

The actual testing is done by the assert* functions. Here is a small list of the most used ones:

  assertNull($value, $message = "%s")
  assertIsA($object, $type, $message = "%s")
  assertEqual($first, $second, $message = "%s")
  assertIdentical($first, $second, $message = "%s")
  assertReference(&$first, &$second, $message = "%s")
  assertCopy(&$first, &$second, $message = "%s")
  assertWantedPattern($pattern, $subject, $message = "%s")
  assertNoUnwantedPattern($pattern, $subject, $message = "%s")
  assertNoErrors($message = "%s")
  assertError($expected = false, $message = "%s")
  assertErrorPattern($pattern, $message = "%s")
  assertTrue($result, $message = false)
  assertFalse($result, $message = false)

More information:

Simpletest

Using a test database

Run tests

Overloaders

Sometimes a function uses a class for which you need to do some extra setup, at that point it can be handy to use a 'mock' class which will return some default results. Then you can overload this class by using an overloader:

This only works when a class is loaded with atkNew().

An example:

  function test_aclass()
  {
    // I know this function uses atkSoap, but we don't want to use it for this test
    atkClassLoader::addOverloader("atk.utils.atksoap", "mycustomsoapstub");
    $result = afunction();
    $this->assertEqual($result, "blabla", "result should be blabla");
  }