menu

Laravel - Unit Test


Unit test merupakan bagian terpenting saat anda membuat sebuah project besar, fungsi dari unit test merupakan memastikan atau mengecheck apakah coding anda berjalan dengan baik sebagaimana semestinya.

Dalam unit test sendiri kita akan membuat sebuah sistem dimana saat coding dijalankan jika coding success maka akan menghasilkan apa, begitu juga jika coding fail maka akan menghasilkan apa.

Proses ini bertujuan untuk mengurangi terjadinya bugs pada suatu project yang sedang kita buat.

Tutorial ini meneruskan tutorial sebelumya tentang Laravel - Grouping Route 2.

Oke langsung saja kita mulai membuat sebuah unit test pada project yang sudah dibuat sebelumnya pada website ini.

Pertama buat configurasi terlebih dahulu database yang akan kita gunakan untuk unit test ini.
Buat file baru bernama database.php pada path protected/app/config/testing dan isikan code berikut,
<?php

return array(

 /*
 |--------------------------------------------------------------------------
 | Database Connections
 |--------------------------------------------------------------------------
 |
 | Here are each of the database connections setup for your application.
 | Of course, examples of configuring each database platform that is
 | supported by Laravel is shown below to make development simple.
 |
 |
 | All database work in Laravel is done through the PHP PDO facilities
 | so make sure you have the driver for your particular database of
 | choice installed on your machine before you begin development.
 |
 */

 'connections' => array(

  'mysql' => array(
   'driver'    => 'mysql',
   'host'      => 'localhost',
   'database'  => 'project-blog-testing',
   'username'  => 'root',
   'password'  => 'root',
   'charset'   => 'utf8',
   'collation' => 'utf8_unicode_ci',
   'prefix'    => '',
  ),

  'pgsql' => array(
   'driver'    => 'mysql',
   'host'      => 'localhost',
   'database'  => 'project-blog-testing',
   'username'  => 'root',
   'password'  => 'root',
   'charset'   => 'utf8',
   'collation' => 'utf8_unicode_ci',
   'prefix'    => '',
  ),

  'sqlite' => array(
   'driver'   => 'sqlite',
   //'database' => ':memory:',
   'database' => app_path() . '/database/testing.sqlite',
   'prefix'   => ''
  ),

 ),
);

Setelah itu buat database baru pada phpmyadmin bernama project-blog-testing(sesuai dengan configurasi database.php yang sudah kita buat), seperti ini.



Selanjutnya tambahkan testsuite baru pada file phpunit.xml pada path protected
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
>
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./app/tests/</directory>
        </testsuite>

        <testsuite name="controllers">
            <directory>./app/tests/controllers</directory>
        </testsuite>

        <testsuite name="crud">
            <directory>./app/tests/controllers/crud</directory>
        </testsuite>

        <testsuite name="create">
            <directory>./app/tests/controllers/crud/CreateControllerTest</directory>
        </testsuite>

    </testsuites>
</phpunit>

Kemudian buat file test baru bernama CreateControllerTest.php pada path protected/app/tests/controllers/crud, controllers dan crud adalah folder baru silahkan tambahkan sendiri sehingga akan tampak seperti ini.


Isikan code berikut pada file CreateControllerTest,
<?php

use Model\User;

class CreateControllerTest extends \TestCase {

    private static $setupDatabase = true;

    /**
     * Default preparation for each test
     *
     */
    public function setUp()
    {
        parent::setUp();
     
        if(self::$setupDatabase) {
            $this->setupDatabase();
        }

        \Mail::pretend(true);
    }

    /**
     * Migrates the database and set the mailer to 'pretend'.
     * This will cause the tests to run quickly.
     *
     */
    private function setupDatabase()
    {
        fwrite(STDERR, print_r("\n\n--- Initializing Migration and Seeding DB ---\n", TRUE));
        
        Artisan::call('migrate');
        $this->seed();

        self::$setupDatabase = false;

        fwrite(STDERR, print_r("--- End Migration and Seeding DB ---\n\n", TRUE));
    }

    //begin test
    //test koneksi ke route
    public function testConnectionRoute()
    {
        $crawler = $this->client->request('GET', 'crud/create');

        $this->assertTrue($this->client->getResponse()->isOk());
    }

    //test view pada route crud/create
    public function testCreateUser()
    {
        $crawler = $this->client->request('GET', 'crud/create');
        
        $this->assertCount(1, $crawler->filter('td:contains("Name")'));
        $this->assertCount(1, $crawler->filter('td:contains("Username")'));
        $this->assertCount(1, $crawler->filter('td:contains("Email")'));
        $this->assertCount(1, $crawler->filter('td:contains("Password")'));
    }

    //test jika berhasil menyimpan database
    public function testCreatePostUserSuccess()
    {
        $input = array(
            'name' => 'test1',
            'username' => 'Username_test',
            'email' => 'test1@mail.com',
            'password' => 'xxxxxx',
        );
        // dd($input);
        $this->call('POST', 'crud/create', $input);

        $check = User::where('name', 'test1')->first();
        $this->assertEquals('test1', $check['name']);
    }

    //test jika gagal menyimpan database karena password kurag dari 6 char
    public function testCreatePostUserFail()
    {
        $input = array(
            'name' => 'testFail',
            'username' => 'Username_test_fail',
            'email' => 'testfail@mail.com',
            'password' => 'xxx',
        );
        // dd($input);
        $this->call('POST', 'crud/create', $input);

        $check = User::where('name', 'testFail')->first();
        $this->assertNotEquals('testFail', $check['name']);
    }
}

Dapat dilihat pada code tersebut yang pertama adalah kita migrate dan seed terlebih dahulu field database unit test kemudian menjalankan testnya. Silahkan pahami sendiri comment yang sudah saya buat pada code tersebut.

Untuk menjalankannya buka terminal masuk ke path protected dan ketikkan code berikut.


===DONE!===