mohamadtsn / laravel-fast-refresh-database
Quickly refresh your large database in tests.
Package info
github.com/mohamadtsn/laravel-fast-refresh-database
pkg:composer/mohamadtsn/laravel-fast-refresh-database
Requires
- php: 8.0.*|8.1.*|8.2.*|8.3.*|8.4.*|8.5.*
- laravel/framework: 8.*|9.*|10.*|11.*|12.*|13.*
Requires (Dev)
- orchestra/testbench: >=3.0.0
- phpunit/phpunit: >=6.0.0
This package is auto-updated.
Last update: 2026-07-13 13:44:02 UTC
README
For large databases with more than 100 tables, it is very slow to drop all the tables and migrate again.
It is also still very slow to run the truncate query against all the tables.
The idea of this package is to truncate only the tables that are involved in that particular test and ignore the rest.
This way, only 5 to 6 tables need to be truncated after each test and not 200 tables.
Note that no table gets dropped or migrated. It only runs the truncate table_name query.
Install:
composer require mohamadtsn/laravel-fast-refresh-database --dev
How to Use:
Add the trait to your test class. The package automatically starts watching write queries (insert, insert ignore, replace into, upsert) before each test and truncates only the tables that were touched after each test. Tracking is event-based (Connection::listen), so the query log is never enabled and flushing it has no effect:
use MohamadTsn\DatabaseFresh\FastRefreshDatabase; class MyTest extends TestCase { use FastRefreshDatabase; public function test_user_can_run() { // ... your test code } }
Tip: Put the trait on your base Tests\\TestCase to enable it for all tests.
Manual setup:
Laravel calls setUpFastRefreshDatabase() automatically through its setUpTraits() convention. If your base test case overrides that mechanism, invoke it yourself in setUp():
protected function setUp(): void { parent::setUp(); $this->setUpFastRefreshDatabase(); }
Configuration
Exclude tables from truncation
Tables listed here are never truncated by the trait (per-test refresh and truncateAllTables() both respect it):
protected array $excludeFromRefresh = ['lookups', 'countries'];
Always truncate tables
Tables truncated after every test even when no tracked write hit them (e.g. rows written through raw PDO or a stored procedure):
protected array $alwaysTruncate = ['audits'];
Truncate everything once (initial setup)
For a one-off full cleanup before a test run — truncates every table except migrations and $excludeFromRefresh:
$this->truncateAllTables(); // default connection $this->truncateAllTables('tenant'); // named connection
Cleanup after the whole test run (opt-in, default off)
When enabled, a shutdown callback truncates every table written during the run once PHPUnit finishes:
protected bool $cleanupAfterAllTests = true; // optionally keep some tables protected array $excludeFromCleanup = ['audits'];
To change the strategy entirely (e.g. wipe all tables), override:
protected function tablesToCleanupAfterAllTests(string $connectionName): array { return $this->getAllTables($this->app->make('db')->connection($connectionName)); }
Multiple connections
protected array $connectionsToUnseed = ['mysql', 'tenant'];
Every array property above can also be provided as a method of the same name if you need dynamic values.
You may also check my other package as well:
Credits
License
The MIT License (MIT). Please see License File for more information.