Model Factory dan Database Seeder di Laravel


Di Laravel 5.4, terdapat sebuah fitur baru untuk mempermudah pembuatan data baru pada pangkalan data. Fitur ini bernama model factory.

Model factory sendiri umumnya digunakan untuk testing dan seeder. Tentunya, data yang dimasukkan merupakan data palsu yang bersumber dari librari Faker.

Model factory didefinisikan pada berkas database/factories/ModelFactory.php. Jika kita buka berkas tersebut, akan kita dapati potongan skrip untuk factory User. Tentunya, kita bisa membuat Model Factory untuk model (tabel lain) dengan skrip serupa.

Sebagai bahan percobaan, kita akan membuat model factory untuk model Blog. Ada beberapa langkah yang harus dilakukan sebelum Model Factory siap digunakan, mulai dari membuat migration untuk tabel blog, membuat model factory untuk blog itu sendiri, kemudian menggunakan Model Factory dalam Seeder.

Membuat Migration

Untuk mempercepat langkah ini, buat migration menggunakan Artisan console dengan perintah:

$ php artisan make:migration create_blogs_table

Created Migration: 2017_04_13_035503_create_blogs_table

Buka berkas di atas pada direktori database/migration, dan tambahkan beberapa field di dalamnya. Saya sendiri menambahkan field seperti di bawah.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBlogsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->increments('id');
            $table->string('slug')->unique();
            $table->string('title')->index();
            $table->text('content');
            $table->boolean('is_published')->default(false);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('blogs');
    }
}

Membuat Model Blog

Model Blog nantinya pasti akan digunakan pada aplikasi. Tentunya, model ini juga akan digunakan pada model factory.

$ php artisan make:model Blog

Model created successfully.

Tambahkan atribut-atribut di dalam model Blog sesuai dengan field yang ada pada migration.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected $fillable = [
        'slug',
        'title',
        'content',
        'is_published',
    ];

    protected $casts = [
        'is_published' => 'blog',
    ];
}

Membuat Model Factory

Migration sudah ada, model Blog pun sudah tersedia. Langkah selanjutnya adalah membuat model factory.

Buka berkas database/factories/ModelFactory.php, tambahkan skrip di bawah pada berkas tersebut.

$factory->define(\App\Blog::class, function (Faker\Generator $faker) {
    return [
        'slug'         => $faker->slug,
        'title'        => $faker->text,
        'content'      => $faker->paragraph,
        'is_published' => true,
    ];
});

Model factory untuk blog dapat digunakan di mana saja pada aplikasi (controller, model, facade) menggunakan fungsi factory($model, $number). Di mana, argumen pertama merupakan class model Blog, sedangkan argumen kedua merupakan jumlah row yang akan ditambahkan pada pangkalan data. Jangan lupa menambahkan method create() atau make() di belakangnya.

$users = factory(\App\Blog::class, 2)->create(); // insert 2 rows

Apa yang membedakan method create() dan make()?

Method make() akan membuat model instance, sedangkan method create() akan membuat model instance dan menyimpannya ke pangkalan data menggunakan method save() pada ORM.

Membuat Database Seeder (Optional)

Langkah ini merupakan opsional, tapi saya rekomendasikan dibuat apabila aplikasi yang kita kembangkan akan didistribusikan ke khalayak umum. Untuk apa? Untuk memudahkan pemrogram lain dalam membuat tabel baru berserta data contoh di dalamnya.

 

$ php artisan make:seeder BlogTableSeeder

Seeder created successfully.

Buka berkas database/seeds/BlogTableSeeder.php, dan tambahkan model factory di dalamnya.

<?php

use Illuminate\Database\Seeder;

class BlogTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = factory(\App\Blog::class, 10)->create();
    }
}

Untuk menjalankan database seeder yang berisi model factory tersebut, kita bisa menggunakan Artisan console dengan perintah berikut:

$ php artisan db:seed --class=BlogTableSeeder

Jalankan perintah di atas secara berulang untuk membuat lebih banyak data.

Model Factory untuk Test

Tentunya, model factory tidak hanya digunakan pada database seeder. Seringkali model factory digunakan oleh pemrogram untuk test (unit test, feature test, atau browser test) pada aplikasi. Seperti pembuatan data dummy misalnya. Tidak selalu kan pemrogram membuka editor pangkalan data, dan menambahkan data secara manual satu per satu.

Buat unit test baru untuk blog dengan perintah:

$ php artisan make:test BlogTest

Test created successfully.

Di Laravel 5.4, berkas BlogTest.php secara bawaan disimpan dalam direktori tests/Feature. Untuk menyimpannya ke dalam berkas tests/Unit, kita bisa menambahkan opsi --unit saat pembuatan menggunakan Artisan console.

$ php artisan make:test BlogTest --unit

Apa yang membedakan Unit dan Feature?

Unit tests are tests that focus on a very small, isolated portion of your code. In fact, most unit tests probably focus on a single method. Feature tests may test a larger portion of your code, including how several objects interact with each other or even a full HTTP request to a JSON endpoint.

Tambahkan method baru di dalam BlogTest untuk memastikan bahwa data berhasil disimpan ke pangkalan data. Kita buat saja dengan nama testInsert() misalnya.

<?php

namespace Tests\Feature;

use Tests\TestCase;

class BlogTest extends TestCase
{

    /**
     * Insert into table
     */
    public function testInsert()
    {
        $user = factory(\App\Blog::class, 1)->make([
            'title' => 'Unit Test',
        ]);

        return $this->assertDatabaseHas('blogs', [
            'title' => 'Unit Test',
        ]);
    }
}

Untuk untuk mengujinya, cobalah jalankan phpunit dengan perintah sebagai berikut:

$ ./vendor/bin/phpunit

Kemudian, lihat hasilnya. 😉

PHPUnit 5.7.19 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 179 ms, Memory: 12.00MB

Model factory umumnya lebih sering digunakan di tahap pengembangan. Fungsinya adalah sebagai “pabrik” produsen data palsu. Model factory lebih sering diimplementasikan pada database seeder dan test di aplikasi Laravel. Tentunya, dengan model factory, kita bisa menghemat banyak sumber daya hanya untuk sekadar membuat contoh data.

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

2 comments

    • Tergantung kebutuhan, seeder bisa digunakan untuk berbagai environment. Baik untuk data asli, maupun palsu.

Tinggalkan Balasan