PHPUnit testing support in Moodle
Documentation
Installation
- install PHPUnit PEAR extension - see PHPUnit docs for more details
- edit main config.php - add $CFG->phpunit_prefix and $CFG->phpunit_dataroot - see config-dist.php for more details
- execute
php admin/tool/phpunit/cli/util.php --installfrom dirroot to initialise test database and dataroot - it is necessary to reinitialise the test database manually after every upgrade or installation of new plugins
Test execution
- optionally generate phpunit.xml by executing
php admin/tool/phpunit/cli/util.php --buildconfig- it collects test cases from all plugins - execute
phpunitshell command from dirroot directory - you can also execute a single test
phpunit core_phpunit_basic_testcase lib/tests/phpunit_test.php - or all tests in one directory
phpunit --configuration phpunit.xml lib/tests/*_test.php - it is possible to create custom configuration files in xml format and use
phpunit -c myconfig.xml
How to add more tests?
- create
testsdirectory in your plugin if does not already exist - add
*_test.phpfiles with custom class that extendsbasic_testcaseoradvanced_testcase - execute your new test, for example
phpunit core_phpunit_basic_testcase local/mytest/tests/mytest_test.php - optionally build new phpunit.xml by executing
php admin/tool/phpunit/cli/util.php --buildconfigand run all tests - core developers have to add all core unit test locations to
phpunit.xml.dist
How to convert existing tests?
- create new test file in
xxx/tests/yyy_test.php - copy contents of the old test file
- replace
extends UnitTestCasewithextends basic_testcase - fix setUp, tearDown, asserts, etc.
- some old SimpleTest tests can be executed directly - mocking, database operations, assert(), etc. does not work, you may need to add
global $CFG;before includes
FAQs
- Why is it necessary to execute the tests from the command line? PHPUnit is designed to be executed from shell, existing Moodle globals and constants would interfere with it.
- Why
testssubdirectory? It is very unlikely that it will collide with any plugin name because plugin names use singular form. - Why is it necessary to include core and plugin suites in configuration files? PHPUnit does not seem to allow dynamic loading of tests from our dir structure.
TODO
- add plugin callbacks to data generator
- convert remaining tests
- delete all simpletests
- hide old SimpleTests in UI and delete Functional DB tests
- shell script that prepares everything for the first execution
- optional support for execution of tests and cli/util.php from web UI (to be implemented via shell execution)