Mengimplementasikan Test Driven Development Pada Framework Laravel Part 2

Halo teman-teman , kita sudah membahas sedikit tentang Test Driven Development pada artikel sebelumnya yaitu Mengimplementasikan Test Driven Developme...

cover Mengimplementasikan Test Driven Development Pada Framework Laravel Part 2

Halo teman-teman , kita sudah membahas sedikit tentang Test Driven Development pada artikel sebelumnya yaitu Mengimplementasikan Test Driven Development Pada Framework Laravel Part 1. Saatnya kita melakukan implementasi nya secara langsung. Disini saya akan menggunakan framework Laravel 7

Pada f ramework Laravel kita dapat melakukan konfigurasi terkait testing pada file phpunit.xml yang bisa kita temukan pada direktori utama project laravel kita.

Setelah kita melakukan instalasi framework Laravel kita akan menjumpai folder tests dan didalam nya terdapat 2 buah folder yaitu Feature dan Unit yang masing-masing memiliki file ExampleTest.php. Mari kita lihat contoh test sederhana pada direktori tests/Feature/ExampleTest.php

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Mari kita fokus kepada line 15 , dalam penulisan method test harus diawali dengan prefix(awalan) test. Prefix test ini kita tuliskan agar method tersebut dikenali sebagai function yang berisikan test

Kita dapat menjalankan test nya dengan menggunakan command sebagai berikut

vendor/bin/phpunit

Maka hasilnya akan seperti pada gambar dibawah ini

Bisa kita lihat kalau terdapat 2 buat test dan 2 buah assertions yang status nya adalah pass / ok (berwarna hijau). Nah 2 buah test ini berasal dari file ExampleTest.php yang terdapat didalam folder Feature dan Unit begitu juga assertions nya. Ohh iya teman-teman saya ingin memberitahukan bahwa dalam method test boleh terdapat lebih dari 1 assertions.

Sebagai pemakai framework Laravel kehidupan ngoding kita sudah di permudah dengan adanya command artisan. Begitu juga dengan membuat file test pada framework Laravel, kita dapat memanfaatkan command artisan tersebut. Studi kasus yang akan kita pakai kali ini adalah create data Mahasiswa Diploma 3 Teknologi Informasi Institut Teknologi Del dan melakukan validasi untuk tiap field nya.

Kita akan memulai dengan membuat file test mahasiswa, silahkan ketikan command dibawah ini untuk membuat file test nya.

php artisan make:test MahasiswaTest

Setelah itu kita akan mendapatkan file MahasiswaTest.php didalam Folder Feature

> Sedikit informasi untuk teman-teman yang menggunakan visual studio code sebagai code editor nya saya menyarankan beberapa extension yang berguna untuk melakukan php unit test yaitu PHPUnit Snippets dan PHPUnit

Selanjutnya kita mulai dengan membuat test untuk menyimpan data mahasiswa pada file MahasiswaTest.php

<?php

namespace Tests\Feature;

use App\Mahasiswa;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class MahasiswaTest extends TestCase
{

    use DatabaseMigrations;
    use RefreshDatabase;
    /**
     * @test
     */

    public function create_new_mahasiswa(){
        $this->withoutExceptionHandling();
        $response = $this->post('/api/mahasiswa/add', [
            'namaDepan' => 'Kornelius',
            'namaBelakang' => 'Sipayung',
            'jenisKelamin' => 'L',
            'fakultas' => 'FITE',
            'prodi' => 'D3 Teknologi Informasi',
            'email' => 'sipayung09091999@gmail.com'
        ]);
        $response->assertOk();
    }
}

> Kita dapat menggunakan annotation yang sudah diberikan PHPUnit sebagai alternatif agar kita lebih mudah membaca method test kita dan juga kita bisa menggunakan style snake_case untuk nama method nya.

Nah pada method create_new_mahasiswa memiliki http method post dengan route /api/mahasiwa/add di ikuti dengan beberapa field seperti namaDepan dan value nya sebagai representasi data yang nantinya akan di simpan. Untuk mempermudah kita dalam membaca error dari test nya saya menambahkan fungsi bawaan dari laravel yaitu $this-&gt;withoutExceptionHandling();

Setelah itu kita jalankan kembali test nya dan kita akan mendapatkan testnya error

Error tersebut kita dapatkan karena kita belum membuat route pada file web.php. Langkah yang harus kita lakukan adalah membuat route nya terlebih dahulu pada file web.php

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
Route::post('/api/mahasiswa/add', 'MahasiswaController@create');

Setelah kita selesai membuat route nya selanjutnya kita kembali menjalankan test nya kembali.

Ternyata test nya masih error, karena kita belum memiliki file Mahasiswa Controller. Hal yang perlu kita lakukan adalah membuat sebuah controller dengan nama MahasiswaController seperti yang ada pada route yang sudah kita buat sebelumnya. Kita dapat menggunakan perintah artisan untuk membuat controller.

Silahkan ketikan command dibawah ini.

php artisan make:controller MahasiswaController

Kita jalankan kembali testnya

Ternyata hasil yang kita dapat masih error/ test nya belum pass karena method create pada MahasiswaController belum ada. Hal yang harus kita lakukan adalah membuat method create di dalam MahasiswaController.

<?php

namespace App\Http\Controllers;

use App\Mahasiswa;
use Illuminate\Http\Request;

class MahasiswaController extends Controller
{
    public function create() {

      }
}

Berikutnya kita jalankan kembali test nya

Akhirnya test kita pass,

Pertanyaan selanjutnya adalah bagaimana kita dapat mengetahui bahwa data-data mahasiswa tersebut tersimpan ke database? Disini saya akan mencoba mengecek data-data mahasiswa yang sudah kita masukan dengan cara mengambil seluruh data dan menghitung jumlah datanya jika data mahasiswa tersebut berhasil masuk maka akan ada 1 buah data didalam database.

Saya akan meng update kode pada file MahasiswaTest.php dibagian method create_new_mahasiwa seperti dibawah ini

public function create_new_mahasiswa(){
        $this->withoutExceptionHandling();
        $response = $this->post('/api/mahasiswa/add', [
            'namaDepan' => 'Kornelius',
            'namaBelakang' => 'Sipayung',
            'jenisKelamin' => 'L',
            'fakultas' => 'FITE',
            'prodi' => 'D3 Teknologi Informasi',
            'email' => 'sipayung09091999@gmail.com'
        ]);
        $mhs = Mahasiswa::all();
        $response->assertOk();
        $this->assertEquals(1, count($mhs));
    }

Selanjutnya kita jalankan kembali test nya.

Hasilnya bisa kita tebak kalau test kita akan error, karena model Mahasiswa belum ada tetapi kita sudah deklarasikan didalam method create_new_mahasiswa. Hal yang harus kita lakukan adalah membuat model Mahasiswa. Kita bisa membuat model Mahasiswa dengan memanfaatkan command artisan.

Silahkan ketikan command dibawah ini

php artisan make:model Mahasiswa

Setelah model Mahasiswa berhasil dibuat, kita import model Mahasiswa kedalam file MahasiswaTest.php

use App\Mahasiswa;

Selanjutnya kita jalankan kembali test nya

Dan hasilnya masih error karena kita belum memiliki table mahasiswa didalam database kita. Hal yang perlu kita lakukan adalah kita membuat migration untuk tabel mahasiswa.

Silahkan teman-teman ketikan command dibawah ini untuk membuat migration mahasiswa

php artisan make:migration create_mahasiswas_table

Setelah selesai maka akan muncul file migration pada folder database/migration dan kita jalankan kembali testnya.

Loh test nya kok masih belum pass ya ? padahal kita sudah buat migration nya. Yap, itu karena kita perlu menambahkan

use Illuminate\Foundation\Testing\DatabaseMigrations;

use DatabaseMigrations;

didalam file MahasiswaTest.php yang berfungsi untuk menjalankan migration nya setelah itu akan menghapus nya kembali ketika test nya sudah selesai.

Selanjutnya kita jalankan kembali test nya

Dan ternyata test nya masih belum pass, karena masih belum ada data yang tersimpan. kan tadi di awal kita expect nya kalau misal nya akan ada satu data yang muncul, ternyata data nya masih belum ada (0) dan kondisi $this-&gt;assertEquals(1, count($mhs)); masih belum terpenuhi. Hal yang harus kita lakukan adalah memperbaiki method create untuk menyimpan data mahasiswa tersebut didalam MahasiswaController yang sudah kita buat sebelumnya.

Silahkan modifikasi method create pada MahasiswaController seperti dibawah ini

<?php

namespace App\Http\Controllers;

use App\Mahasiswa;
use Illuminate\Http\Request;

class MahasiswaController extends Controller
{
    public function create(Request $request) {
        Mahasiswa::create([
            'namaDepan' => request('namaDepan'),
            'namaBelakang' => request('namaBelakang'),
            'jenisKelamin' => request('jenisKelamin'),
            'fakultas' => request('fakultas'),
            'prodi' => request('prodi'),
            'email' => request('email')
        ]);
    }
}

Setelah itu kita jalankan kembali test nya.

Ternyata test nya masih belum pass, karena kita belum memiliki properti fillable didalam model Mahasiswa.Hal yang harus kita lakukan adalah menambahkan properti fillable kedalam model Mahasiwa.

Silahkan ketikan kode dibawah ini pada file Mahasiwa.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Mahasiswa extends Model {
    protected $fillable = ['namaDepan','namaBelakang','jenisKelamin','fakultas','prodi','email'];
}

Selanjutnya silahkan jalankan kembali test nya

Ternyata test nya masih belum pass karena kita belum memiliki column namaDepan. Hal yang harus kita lakukan adalah menambahkan column namaDepan pada file migration yang sudah kita buat sebelumnya.

<?php

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

class CreateMahasiswasTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('mahasiswas', function (Blueprint $table) {
            $table->id();
            $table->string('namaDepan');
            $table->timestamps();
        });
    }

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

Setelah itu jalankan kembali test nya.

Dan benar saja test kita masih belum pass, karena kita juga masih belum memiliki column namaBelakang. Hal yang harus kita lakukan adalah menambahkan semua column kedalam file migration kita tadi.

Menjadi seperti ini

<?php

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

class CreateMahasiswasTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('mahasiswas', function (Blueprint $table) {
            $table->id();
            $table->string('namaDepan');
            $table->string('namaBelakang');
            $table->string('jenisKelamin');
            $table->string('fakultas');
            $table->string('prodi');
            $table->string('email');
            $table->timestamps();
        });
    }

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

Selanjutnya kita menjalankan kembali test nya

Dan akhirnya berhasil …

Kita juga bisa melihat datanya dengan menuliskan code berikut dd($mhs);

 $mhs = Mahasiswa::all();
 // $response->assertOk();
 dd($mhs);
 $this->assertEquals(1, count($mhs));

Kita jalankan kembali test nya

Akhirnya selesai juga, berlanjut ke part 3

avatar nel09
@nel09

0 Kontribusi 0 Poin

Diperbarui 3 tahun yang lalu

Bagian dari artikel seri

Belum ada Jawaban. Jadi yang pertama Jawaban

Login untuk ikut Jawaban