ownCloud uses PHPUnit >= 4.8 for unit testing PHP code.
If you are using ownCloud 10.0 or higher, running
make in your
terminal from the
webroot directory will prepare everything for
testing. This will install beside necessary dependencies, a local
version of PHPUnit at
make helpto get a list of parameters
To update your testing environment run
Take care that the php phpunit file in the path provided has the executable permission set.
If you are on any version earlier than 10.0 you have to setup PHPUnit (and run the tests) manually. There are three ways to install it:
composer require phpunit/phpunit
Use your package manager (if you’re using a Linux distribution)
# When using a Debian-based distribution sudo apt-get install phpunit
Install it manually
wget https://phar.phpunit.de/phpunit.phar chmod +x phpunit.phar sudo mv phpunit.phar /usr/local/bin/phpunit
After the installation the command
phpunit is available
|Please be aware that PHPUnit 6.0 and above require PHP 7.0.|
And you can update it using:
This option is not supported from PHPUnit 6.0 onward. If you’re using this version or higher, please use either Composer or your package manager to upgrade to the latest version.
You can find more information in the PHPUnit documentation.
There are existing tests provided by ownCloud which are ready to run.
make helpto see tests and parameters available.
To run the tests for a specific app with the provided PHPUnit version, change into
To get started, do the following:
Create a directory called
tests/unitin the top level of your application
Create a PHP file in the directory and
require_onceyour class which you want to test.
Then you can run the created test with
If you use ownCloud functions in your class under test (i.e: OC::getUser()) you’ll need to bootstrap ownCloud or use dependency injection.
You’ll most likely run your tests under a different user than the Web server.
This might cause problems with your PHP settings (i.e.,
Given the class
MyClass in your app:
Unresolved include directive in modules/developer_manual/pages/core/unit-testing.adoc - include::example$core/unit-testing/MyClass.php
An example for a simple test would be:
Unresolved include directive in modules/developer_manual/pages/core/unit-testing.adoc - include::example$core/unit-testing/MyClassTest.php
The class under test and the test class should share the same namespace so you do not need to use a dedicated
/srv/http/owncloud/apps/myapp/ you run the test with the following command:
Make sure to extend the
\Test\TestCase class with your test and always call the parent methods, when overwriting
tearDownAfterClass() method from the
These methods set up important stuff and clean up the system after the test so that the next test can run without side effects, such as clearing files and entries from the file cache, etc.
For more resources on writing tests for PHPUnit visit the writing tests section of the PHPUnit documentation.
If you use ownCloud functions or classes in your code, you’ll need to make them available to your test by bootstrapping ownCloud.
To do this, you’ll need to provide the
--bootstrap argument when
phpunit --bootstrap tests/bootstrap.php apps/myapp/tests/testsuite.php
If you run the test suite as a user other than your Web server, you’ll have to adjust your php.ini and file rights.
open_basedir = none
su -c "chmod a+r config/config.php" su -c "chmod a+rx data/" su -c "chmod a+w data/owncloud.log"
The core project provides a script that runs all the core unit tests
using the specified database backend like
oci (for Oracle), the default is
To run tests on
pgsql you need a database user called
oc_autotest with the password
owncloud. This user needs the
privilege to create and delete the database called
CREATE DATABASE oc_autotest; CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY 'owncloud'; GRANT ALL ON oc_autotest.* TO 'oc_autotest'@'localhost';
su - postgres # Use password "owncloud" createuser -P oc_autotest # Give the user the privilege to create databases psql -c 'ALTER USER oc_autotest CREATEDB;'
local all all trust to
To run all tests, run the following command:
To run tests only for MySQL, run the following command:
make test-php TEST_DATABASE=mysql
To run a particular test suite, use the following command as a guide:
make test-php TEST_DATABASE=mysql TEST_PHP_SUITE=tests/lib/share/share.php
By default, a code coverage report is generated after the test run. To
avoid the time taken for that, specify
make test-php NOCOVERAGE=true TEST_DATABASE=mysql TEST_PHP_SUITE=tests/lib/share/share.php
This will also automatically set up your test environment.
To debug tests in the browser, this will run Karma in browser mode
From there, open the URL http://localhost:9876 in a web browser. On that
page, click on the
Debug button. An empty page will appear, from
which you must open the browser console (F12 in Firefox/Chrome). Every
time you reload the page, the unit tests will be relaunched and will
output the results in the browser console.