Using SQLite to dramatically increase speed of integrated tests in Lumen
Table of contents
Problem
I had a problem in Lumen where each of my integrated tests ran for about a minute. This was slow and counterproductive for me. My initial setup was using a separate MySQL testing database to conduct the integrated tests. I tried to use an SQLite connection instead and I surprisingly garnered some surprising results.
Solution
In our case, override the testing environment variables in your phpunit.xml
to use SQLite instead.
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
This will tell the testing environment to set up an in-memory database.
Results
As an example, my test suite uses the Lumen DatabaseMigrations
trait and has three feature test cases.
Using MySQL:
PHPUnit 9.5.6 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 03:21.588, Memory: 28.00 MB
Using SQLite:
PHPUnit 9.5.6 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 00:00.475, Memory: 30.00 MB
It is a dramatic reduction from 3 minutes to 475 milliseconds. How surprising!
Closing thoughts and risky caveats
Although blazingly fast, proceed to use SQLite with caution! There may be some drawbacks in using a database engine that is different from your production environment.
We can never guarantee that the behavior of using an SQLite database would reflect the same behavior in a MySQL behavior. At best, use the same database engine for both your testing and production database.
Using a more conservative RefreshDatabase
trait with a separate same-engine testing database is commonly advised. However, in Lumen, the aforementioned trait does not exist and only exists in Laravel.