Belajar Membuat Test Driven Development Di Laravel
Apakah itu Test Driven Development (TDD)
Dengan singkat, Test Driven Development ialah sebuah sistem pengembangan perangkat lunak yang dikontrol oleh pengetesan atau tes . Maka, lebih simpelnya ialah kita diharuskan menulis code untuk testing lebih dahulu saat sebelum menulis code untuk program. Kurang lebih jalur kerjanya semacam ini :
- Menulis skrip pengetesan / tes, upayakan menulikan semua peluang atau harapan yang dapat terjadi dalam kasus itu.
- Lakukan tes, pasti menemukan kegagalan, sudah pasti karena kita belum menulis code implementasinya.
- Catat code sama sesuai harapan dari skrip pengetesan / tes, maksudnya supaya bisa memenuhi skrip pengetesan.
- Lakukan ulangi tes, jika ada tes yang tidak berhasil, karena itu perbaiki kembali kodenya sampai penuhi semua skrip pengetesan / tes.
- Bila berasa code yang dicatat berantakan, kurang maksimal, kerjakan refactor. Bila tes dijalankan kembali dan hasilnya masih tetap penuhi tes, jadi tidak ada permasalahan hasil dari refactoring kita.
Memahami Susunan File dan Komposisi Tes di Laravel
Untuk komposisi testing di Laravel bisa dikonfigurasikan pada file phpunit.xml
yang ada pada directory khusus project Laravel. Kita juga bisa membuat file .env.testing
pada directory khusus project, file itu akan mengoverride file.env
tuliskan kita jalankan tes PHPUnit.
Laravel mempunyai class TestCase
sendiri yang extends dari class TestCase
punya PHPUnit dengan beberapa penyesuaian dari Laravel. Mari kita lihat pada file ExampleTest
pada directory tests/Fitur
atau tes/Unit
mereka sama mengextends class TestsTestCase.
Di mana class TestsTestCase
extends ke BaseTestCase
yang disebut alias dari IlluminateFoundationTestingTestCase
dalam class itu ada banyak beberapa fungsi yang tidak kita ulas dalam artikel ini, hanya agar kita cukup memahami mengenai asal mula class tes dari Laravel
.
Saat sebelum menulis tes pertama kita, sebaiknya kita melihat contoh tes yang berada di class ExampleTest
.
<?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);
}
}
Bila kita lihat, dalam penulisan metode tes diawali dengan tes atau umum disebutkan prefix. Hal itu ialah harus hukumnya saat menulis metode untuk testing supaya metode teersebut dipandang seperti mehod yang berisi tes.
Menjalankan Tes Contoh
Untuk menjalankan tes kita pakai perintah pada CLI (Command Line Interface) atau Terminal. Perintah yang dijalankan seperti berikut :
vendor/bin/phpunit
Sesudah kita jalankan perintah itu, kita akan menemui penampilan kurang lebih seperti ini pada terminal kita.
Hasil menjalankan PHPUnit
Oke, kita dapat membaca ada 2 tes dan 2 assertion. 2 tes ini datang dari 2 file ExampleTest
yang ada pada directory Fitur
dan Unit
. Dalam pada itu 2 assertion (tuntutan) berasal dari tiap-tiap file itu. Untuk assertiion di dalam 1 metode tes dapat ada banyak assertion.
Membuat dan Menulis Tes Pertama
Seperti umumnya, dengan Laravel kehidupan kita dipermudahkan dengan perintah Artisan. Begitupun untuk membuat file tes kita dapat manfaatkan perintah Artisan yang ada. Oke, mari kita buat file tes pertama kita dengan Artisan, misalkan kita akan membuat suatu tes simpel untuk CRUD Artikel.
php artisan make:test ArticleTest
Secara default file tes akan dibuat di dalam direktori Fitur. Jika ingin membuat testing unit kita bisa menambahkan flag --unit
.
php artisan make:test ArticleTest --unit
Kurang lebih file / class yang dibuat akan berisi seperti ini.
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class ArticleTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function testExample()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Pertama, kita akan mengganti nama metode lebih dulu supaya sesuai tes yang akan kita buat. Pertama kita akan membuat tes untuk pastikan pada halaman artikel, pemakai dapat melihat semua artikel. Untuk nama metode akan kita buat testUserCanSeeAllArticles()
, oke nama tes telah kita tetapkan, tetapi cukup sulit membaca nama semacam ini. Untungnya PHPUnit memberi alternative untuk menulis tes, yakni dengan annotation, dan kita dapat memakai snake_case
untuk nama metodenya. Maka lebih kurang semacam ini.
/**
* @test
*/
public function user_can_see_all_articles()
{
$response = $this->get('/');
$response->assertStatus(200);
}
Saat ini silahkan kita coba untuk jalankan tesnya, tetapi ini kali dengan Artisan saja ya, lebih enak menulis perintahnya. Ohya perlu dicatat, perintah ini ada mulai Laravel 7 ya.
php artisan test
Tampilan artisan test
Tes yamg kita tulis tidak memberi error, Oke. Selainnya memudahkan untuk jalankan tes, dengan Artisan, penampilan hasil tes lebih rapi serta lebih nyaman dibaca.
Baik, silahkan kita coba buat sebuah scenario untuk tampilkan halaman artikel kita, lebih kurang semacam ini scenario sederhananya.
- Halaman artikel akan diakses pada url /articles.
- Halaman artikel akan tampilkan judul artikel
- Untuk tambahan, kita dapat mendefinisikan secara detail untuk file view yang ingin digunakan untuk halaman ini.
/**
* @test
*/
public function user_can_see_all_articles()
{
$response = $this->get('/articles');
$response->assertStatus(200);
$response->assertSee('Judul Blog');
$response->assertViewIs('article.index');
}
Ketika kita menjalankan, akan menghasilkan pesan error yang menandakan bahwa aplikasi kita belum memenuhi test yang kita tulis.
Test Gagal
Menulis Code untuk Memenuhi Test
Seperti kita ketahui di atas jika saat dijalankan tesnya, kita menemui hasil yang tidak berhasil. Kita kenali jika 404
ialah code untuk halaman yang tidak diketemukan maknanya tidak ada route /articles yang kita harap. Untuk menuntaskan, mari kita catat sebuah route di web.php
.
Route::get('/articles', function () {
//
});
Kemudian, coba jalankan testnya lagi. Dan kita akan menemui error yang berbeda kali ini. Kita mengharapkan ada tulisan “Judul Blog” pada test tapi kita tidak memberikan respon yang diharapkan.
Error mengharapkan repson yang sesuai.
Setelah itu kita coba berikan response yang diinginkan
Route::get('/articles', function () {
return 'Judul Blog';
});
Mari kita lakukan lagi tesnya. Masih tetap ada error, ini kali karena pada tes kita menginginkan responnya ialah sebuah view.
Error karena semestinya tanggapan berbentuk view.
Silahkan kita samakan kembali kodenya dan buat file view article/index.blade.php
seperti yang kita harap pada tes dan isi dalam kata "Judul Website".
Judul Blog
Lalu, route juga perlu kita sesuaikan agar memberikan respon view.
Route::get('/articles', function () {
return view('article.index');
});
Setelah itu kita coba jalankan lagi tesnya, kali ini kita akan menemui pesan “PASS” yang artinya kode kita sudah lolos pengujian.
Test Sukses
Nah, sekarang kita coba untuk refactor pada file web.php
.
Route::view('articles', 'article.index');
Selanjutnya kita dapat jalankan tes untuk memastikan jika refactor yang kita kerjakan masih tetap sama sesuai tes. Dan berikut salah satunya keuntungan kita menulis sebuah tes, kita dapat lakukan perubahan lebih optimis karena kita dapat jalankan tes secara automatis dan memperoleh masukan dari perubahan kita.