Writing tests
From Achievo/ATK Wiki
|
ATK Howto: Writing tests
|
Contents |
Basic testcase
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)
PHPUnit testcases
As of 20-05-2008 the nightly of ATK also supports PHPUnit testcases, to add a phpunit testcase simple follow the above instructions for creating a testcase only name it as follows:
class.test_[testname].phpunit.inc
A basic PHPUnit testcase will have the following structure:
class test_foo extends PHPUnit_Framework_TestCase { public function testBar() { $this->assertEquals('foo','bar','This test will fail'); } }
Most assert function of SimpleTest are also in phpUnit, for more information, please search online for 'writing phpunit testcases'.
To run all phpunit testcases, make sure the atkappsuite.php file from atk/skel is in your application root, the atkroot and appplication_dir configuration values in the atkappsuite.php file are properly set and you have phpunit installed on your server, then run:
phpunit atkappsuite
And PHPUnit will make ATK look up all the phpunit testcases in your application and run them, resulting in output like the following:
PHPUnit 3.2.9 by Sebastian Bergmann. F. Time: 0 seconds There was 1 failure: 1) testBar(test_foo) Failed asserting that two strings are equal. expected string <foo> difference <xxx> got string <bar> /var/www/html/atkapp/modules/foomodule/testcases/class.test_foo.phpunit.inc:7 FAILURES! Tests: 1, Failures: 1.
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"); }