Writing tests
(This howto is a work in progress) To create a test you need to take the following steps:
Create a directory 'testcases' in your module directory.
In the directory you need to place one or more files with the name:
class.test_[testnaam].inc
A test cases needs the following structure:
require_once(moduleDir("[modulename]")."class.[class you want to test].inc");
//Take for example the class 'class.example.inc'
/**
* Unittests for the example class
*
*/
class test_testcase_name extends atkTestCase
{
//Warning: This is PHP5.
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.
}
//Deze functie wordt steeds voor alle andere test_* functies aangeroepen.
function setUp()
{
//Niet vergeten ook de setUp van de parent te doen.
parent::setUp();
}
//Deze functie wordt steeds na alle andere test_* functies aangeroepen.
function tearDown()
{
//Niet vergeten ook de tearDown van de parent te doen.
parent::tearDown();
}
//Simpele test functie
function test_doSomething()
{
//Doe dingen
$class = new exampleclass();
$class->doSomething();
$result = $class->getSomeValue;
$this->assertEqual($result,'waarde_die_ik_had_dit_verwacht','tekst die in de tests wordt getoond.');
}
}
Het eigenlijke testen wordt door de assert* functies gedaan. Er zijn er verschillende, en de naam geeft goed aan wat de eigenlijke functie is:
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)
En vele anderen. Zie
platform/atk/test/
voor meer mogelijkheden.
Meer informatie op
http://www.achievo.org/wiki/Using_a_test_database
Overloaders
Soms gebruikt een functie een klasse waarvoor je veel extra setup moet doen, dan kan het handig zijn een 'mock' klasse te gebruiken die standaard resultaten oplevert. Dan kun je die klasse overloaden door middel van een overloader:
Dit werkt overigens alleen wanneer de klasse in kwestie geladen wordt door atkNew().
Een voorbeeld:
function test_eenclass()
{
// ik weet dat deze funktie atkSoap gebruikt maar dat wil ik effe niet voor deze test.
atkClassLoader::addOverloader("atk.utils.atksoap", "mycustomsoapstub");
$result = eenfunktie();
$this->assertEqual($result, "blabla", "resultaat moet blabla zijn");
}