Writing tests
|
ATK Howto: Writing tests
|
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 basic test case has the following structure:
atkimport("[modulename].[class you want to test]");
/**
* Unittests for the example class
*
*/
class test_testcase_name extends atkTestCase
{
/**
* This (optional) function will be called before each
* test_* function. Use it to initialise your test.
*/
function setUp()
{
parent::setUp();
}
/**
* This (optional) function will be called after
* each test_* function.
* Useful to do clean-up.
*/
function tearDown()
{
parent::tearDown();
}
/**
* Simple test function
*/
function test_doSomething()
{
// Do the actual test here.
$class = new exampleclass();
$class->doSomething();
$result = $class->getSomeValue();
$this->assertEqual($result,'expected_value','text in the test.');
}
}
Reporting test results is done by the assert* functions. Here is a small list of the most common 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)
Fixtures
In testcases you will sometimes want to use simulated database data. You can use Fixtures for this. See the following howto for using fixtures:
Running the testcases
The following howto explains how to run a suite of testcases:
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");
}