dees040/festing

Fasten up your unit tests in Laravel by more than 100%

1.0.5 2019-03-06 10:16 UTC

README

Latest Stable Version Total Downloads Build status

Festing is a very very great name made by combining the words fast and testing. Because that is what this package is for. Faster tests in Laravel. The package is inspired by a great article from Nate Denlinger.

Before 'Festing':

Before fast database tests

After 'Festing':

After fast database tests

Installation

Installation and setup time is estimated to be around 5 minutes in existing Laravel projects and 2 minutes in new projects. Install this package via composer.

composer require --dev dees040/festing

If you're using Laravel >= 5.5 this package will automatically be added to your providers list. If using a lower version, add the service provider to the providers array in config/app.php.

Dees040\Festing\ServiceProvider::class,

You're now ready for setup.

The package comes with a small config file. The default config should be good in most use cases. However, feel free to change it. To publish the config file run the following command

php artisan vendor:publish --provider="Dees040\Festing\ServiceProvider" --tag="config"

Setup

First you should update the database.php config file. We should add a connection specifically for testing. You can use the following array.

'testing' => [
    'driver' => 'sqlite',
    'database' => database_path('testing.sqlite'),
    'prefix'   => '',
],

In the package config you can specify which connection to use while testing. By default it will use the testing connection, which we've just added to the connections array. You should also add or update this in <php> tag located in the phpunit.xml file.

<env name="DB_CONNECTION" value="testing"/>

Because Laravel don't have an option to boot your testing traits like the model traits we need to add a little bit of functionality in our tests/TestCase.php file. If you haven't overwritten the setUpTraits() method yet, you can add this to the TestCase.php.


use Dees040\Festing\FestTheDatabase;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication, FestTheDatabase;


    /**
     * Boot the testing helper traits.
     *
     * @return array
     */
    protected function setUpTraits()
    {
        $uses = parent::setUpTraits();
    
        if (isset($uses[\Dees040\Festing\ShouldFest::class])) {
            $this->runFester();
        }
    
        return $uses;
    }

If you already have overwritten the setUpTraits() method just add the if statement to the method body. Also your TestCase.php should use the FestTheDatabase trait. In the examples directory you can see an example TestCase.php and unit test.

In test cases

To actually execute the database refresher you need to use ShouldFest trait in your test cases. This traits is used like the ShouldQueue interface, it only executes the code if it's detected. It also replaces the RefreshDatabase trait from Laravel.

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Dees040\Festing\ShouldFest;

class ExampleTest extends TestCase
{
    use ShouldFest;
    
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

Command

The package come with a command (make:fest) which is the same as php artisan make:test. The only difference is that it uses the ShouldFest trait instead of the default RefreshDatabase trait provided by Laravel.

Config

Check the config file for descriptions about all the config.

Cached data

Before we cache the data to make the tests significantly faster we run a list of artisan commands. Be default we run php artisan migrate. But if you'd like to change this or want to run more commands (i.e. php artisan db:seed) you can change the commands array config value.