Seri artikel Test Driven Development Pada Framework Laravel versi 7
Postingan lainnya
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...
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->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->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
Bagian dari artikel seri
Belum ada Jawaban. Jadi yang pertama Jawaban
Login untuk ikut Jawaban