A fast test suite for CakePHP applications
composer require --dev vierge-noire/cakephp-test-suite-light "^3.0"
composer require --dev vierge-noire/cakephp-test-suite-light "^2.0"
composer require --dev vierge-noire/cakephp-test-suite-light "^1.0"
For CakePHP ^4.3 application, no additional listener is required. See the doc here.
Prior to CakePHP 4.3:
Make sure you replace the native CakePHP listener by the following one inside your phpunit.xml
(or phpunit.xml.dist
) config file, per default located in the root folder of your application:
<!-- Setup a listener for fixtures -->
<listeners>
<listener class="CakephpTestSuiteLight\FixtureInjector">
<arguments>
<object class="CakephpTestSuiteLight\FixtureManager" />
</arguments>
</listener>
</listeners>
Between each test, the package will truncate all the test tables that have been used during the previous test.
The fixtures will be created in the test database(s) defined in your configuration.
Important: you should not add the CakePHP native listener to your phpunit.xml
file.
Only one listener is required, which is the one described in the section Installation.
Use the CakephpTestSuiteLight\Fixture\TruncateDirtyTables
trait in a test case class
in order to clean up the database prior to each of its tests.
The package will empty by default the dirty tables in all test databases.
If you with to ignore the truncation for a given test case, you may use the
CakephpTestSuiteLight\SkipTablesTruncation
trait
If you wish to ignore a given connection, you may
provide the skipInTestSuiteLight
key to true
in your config/app.php
. E.g.:
In config/app.php
<?php
...
'test_connection_to_be_skipped' => [
'className' => Connection::class,
'driver' => Mysql::class,
'persistent' => false,
...
'skipInTestSuiteLight' => true
],
This can be useful for example if you have connections to a third party server in the cloud that should be ignored.
Here is the only step performed by the Fixture Factories Fixture Manager, and how to disable it.
The Fixture Manager truncates the dirty tables at the beginning of each test. This is the only action performed.
Dirty tables are tables on which the primary key has been incremented at least one. The detection of dirty tables is made
with an SQL query by dedicated classes. These are called TableSniffers
and are located in the src/TestSuite/Sniffer
folder
of the package. These are provided for:
- Sqlite
- MySQL
- Postgres (Postgresql >= 11 supported. A custom Sniffer is required for lower Postgres versions.)
If you use a different database engine, you may provide your own. It should extend
the BaseTableSniffer
class.
You should then map in your config/app.php
file the driver to
the custom table sniffer for each relevant connection. E.g.:
In config/app.php
<?php
...
'test' => [
'className' => Connection::class,
'driver' => Mysql::class,
'persistent' => false,
...
'tableSniffer' => '\Your\Custom\Table\Sniffer'
],
One of the advantage of the present test suite, consists in the fact that the test database is cleaned before each test, rather than after. This enables the developer to perform queries in the test database and observe the state in which a given test left the database.
The present plugin collects the dirty tables in a dedicated table with the help of triggers. This table is per default permanent, but it can be set to temporary in order to keep it invisible to the code.
In ordert to do so, in your test DB settings, set the key 'dirtyTableCollectorMode'
to 'TEMP'
.
It is still possible to use the native CakePHP fixtures. To this aim, you may simply load them as described here.
The suite comes with a statistic tool. This will store the execution time, the test name, the number and the list of the dirty tables for each test.
In order to activate it, add a second argument set to true to the FixtureInjector
in the following manner:
<!-- Setup a listener for fixtures -->
<listeners>
<listener class="CakephpTestSuiteLight\FixtureInjector">
<arguments>
<object class="CakephpTestSuiteLight\FixtureManager" />
<boolean>true</boolean>
</arguments>
</listener>
</listeners>
The statistics will be store after each suite in tmp/test_suite_light/test_suite_statistics.csv
.
With the help of your IDE, you can easily order the results and track the slow tests, and improve their respective performance.
Note that the statistic tool does not perform any query in the database. It uses information that is being gathered regardless of its actvation. It has no significant impact on the overall speed of your tests.
- Juan Pablo Ramirez
- Nicolas Masson
Contact us at [email protected] for professional assistance.
The CakephpTestSuiteLight plugin is offered under an MIT license.
Copyright 2020 Juan Pablo Ramirez and Nicolas Masson
Licensed under The MIT License Redistributions of files must retain the above copyright notice.