Laravel Dusk adalah sahabat terbaik bagi developer Laravel yang ingin memastikan website mereka bekerja sebagaimana mestinya. Dalam artikel ini, kita akan membahas secara mendalam tentang Laravel Dusk: apa itu, mengapa penting, bagaimana cara menggunakannya, dan best practices untuk pengujian end-to-end (E2E) pada website Laravel Anda. Siap menyelam lebih dalam ke dunia pengujian dengan Dusk? Mari kita mulai!
Apa Itu Laravel Dusk dan Mengapa Pengujian End-to-End Penting?
Laravel Dusk adalah tool pengujian otomatisasi E2E yang memungkinkan Anda mensimulasikan interaksi pengguna di browser untuk menguji seluruh flow aplikasi Anda. Bayangkan Anda bisa menyuruh browser untuk membuka website, mengisi formulir, mengklik tombol, dan memeriksa apakah hasilnya sesuai dengan yang Anda harapkan. Itulah yang dilakukan Dusk.
Mengapa pengujian E2E penting?
Pengujian E2E memvalidasi seluruh sistem, dari frontend hingga backend, dan semua komponen di antaranya. Ini memastikan bahwa semuanya bekerja bersama secara harmonis. Tanpa pengujian E2E, Anda mungkin hanya menguji unit-unit kecil kode, tetapi tidak menjamin bahwa mereka akan berfungsi dengan baik ketika digabungkan.
Beberapa manfaat utama pengujian E2E meliputi:
- Mendeteksi Bug Tingkat Tinggi: Menemukan masalah yang mungkin terlewatkan dalam pengujian unit atau integrasi.
- Memastikan Pengalaman Pengguna yang Baik: Memastikan bahwa pengguna dapat melakukan tugas-tugas penting di website Anda dengan lancar.
- Meningkatkan Kepercayaan pada Deployment: Memberikan keyakinan bahwa perubahan yang dilakukan tidak akan merusak fungsionalitas yang ada.
- Mengurangi Biaya Perbaikan Bug: Menemukan dan memperbaiki bug lebih awal dalam siklus pengembangan, yang jauh lebih murah daripada memperbaikinya setelah website diluncurkan.
- Dokumentasi Fungsionalitas: Test E2E dapat berfungsi sebagai dokumentasi hidup tentang bagaimana aplikasi Anda seharusnya bekerja.
Dengan Laravel Dusk, Anda bisa menjalankan pengujian E2E ini dengan mudah dan efisien, memastikan website Laravel Anda berjalan dengan baik di berbagai browser dan lingkungan.
Instalasi dan Konfigurasi Laravel Dusk untuk Pengujian
Sebelum kita mulai menulis test dengan Laravel Dusk, kita perlu menginstalnya dan melakukan konfigurasi awal. Ikuti langkah-langkah berikut:
-
Instalasi melalui Composer:
Buka terminal atau command prompt Anda dan jalankan perintah berikut:
composer require laravel/dusk --dev
Perintah ini akan mengunduh dan menginstal Laravel Dusk sebagai dependency pengembangan.
-
Registrasi Service Provider:
Setelah instalasi selesai, Anda perlu mendaftarkan service provider Dusk di
config/app.php
. Namun, ini biasanya sudah dilakukan secara otomatis oleh Laravel. Jika tidak, tambahkan baris berikut ke arrayproviders
:AppProvidersDuskServiceProvider::class,
Catatan: Anda hanya perlu mendaftarkan service provider ini di lingkungan pengembangan (local atau testing).
-
Instalasi ChromeDriver:
Laravel Dusk menggunakan ChromeDriver untuk mengontrol browser Chrome secara otomatis. Anda perlu mengunduh ChromeDriver yang sesuai dengan versi Chrome yang Anda gunakan. Anda bisa mengunduhnya dari situs web resmi ChromeDriver: https://chromedriver.chromium.org/downloads. Setelah diunduh, letakkan ChromeDriver di lokasi yang mudah diakses oleh Dusk.
-
Konfigurasi
.env
:Pastikan Anda memiliki variabel
APP_URL
di berkas.env
Anda yang menunjuk ke URL website Laravel Anda. Misalnya:APP_URL=http://localhost:8000
Anda juga mungkin perlu mengatur
DB_CONNECTION
ke database testing agar pengujian tidak memengaruhi data produksi Anda. -
Perintah
dusk:install
:Setelah menginstal dan mengkonfigurasi, jalankan perintah berikut untuk membuat direktori
tests/Browser
dan beberapa boilerplate test awal:php artisan dusk:install
-
Memulai Server Selenium (Opsional):
Dusk secara default menggunakan ChromeDriver lokal. Namun, Anda juga bisa menggunakan server Selenium remote. Untuk menggunakan Selenium, Anda perlu mengunduh dan menjalankan server Selenium. Ikuti petunjuk di dokumentasi Selenium: https://www.selenium.dev/documentation/. Kemudian, konfigurasi Dusk untuk menggunakan server Selenium di berkas
tests/DuskTestCase.php
.
Dengan langkah-langkah di atas, Laravel Dusk siap digunakan untuk pengujian E2E website Laravel Anda.
Menulis Test Pertama Anda dengan Laravel Dusk: Studi Kasus Form Login
Sekarang, mari kita coba menulis test sederhana untuk menguji form login di website Anda. Asumsikan Anda memiliki form login dengan field email
dan password
, serta tombol submit.
-
Membuat Test Baru:
Gunakan perintah
artisan
untuk membuat test baru:php artisan dusk:make LoginTest
Ini akan membuat berkas
tests/Browser/LoginTest.php
. -
Menulis Test:
Buka berkas
LoginTest.php
dan tambahkan kode berikut:<?php namespace TestsBrowser; use IlluminateFoundationTestingDatabaseMigrations; use LaravelDuskBrowser; use TestsDuskTestCase; class LoginTest extends DuskTestCase { use DatabaseMigrations; // Optional: Migrasi database sebelum test /** * A Dusk test example. * * @return void */ public function testSuccessfulLogin() { $this->browse(function (Browser $browser) { $browser->visit('/login') // Ganti dengan URL halaman login Anda ->type('email', '[email protected]') // Ganti dengan email pengguna ->type('password', 'password') // Ganti dengan password pengguna ->press('Login') // Ganti dengan teks tombol submit Anda ->assertPathIs('/dashboard'); // Ganti dengan URL setelah login berhasil }); } public function testFailedLogin() { $this->browse(function(Browser $browser) { $browser->visit('/login') ->type('email', '[email protected]') ->type('password', 'wrongpassword') ->press('Login') ->assertSee('The email or password you entered is incorrect'); }); } }
Penjelasan Kode:
use DatabaseMigrations;
: (Opsional) Menggunakan trait ini akan menjalankan migrasi database sebelum setiap test, memastikan database Anda dalam keadaan bersih.$this->browse(function (Browser $browser) { ... });
: Membungkus kode pengujian Anda dalam closure ini, memberikan akses ke objek$browser
.$browser->visit('/login')
: Membuka URL/login
di browser.$browser->type('email', '[email protected]')
: Mengisi field dengan namaemail
dengan nilai[email protected]
. Pastikan Anda mengganti nilai ini dengan email pengguna yang valid di database Anda.$browser->type('password', 'password')
: Mengisi field dengan namapassword
dengan nilaipassword
. Pastikan Anda mengganti nilai ini dengan password yang valid.$browser->press('Login')
: Menekan tombol dengan teksLogin
. Pastikan teks ini sesuai dengan teks tombol submit di form login Anda.$browser->assertPathIs('/dashboard')
: Memastikan bahwa URL saat ini adalah/dashboard
setelah menekan tombol Login. Pastikan Anda mengganti nilai ini dengan URL yang seharusnya setelah login berhasil.$browser->assertSee('The email or password you entered is incorrect')
: Memastikan bahwa teks tertentu muncul setelah login gagal. Ganti teks ini dengan pesan kesalahan yang tepat di website anda.
-
Menjalankan Test:
Jalankan test dengan perintah:
php artisan dusk
Dusk akan membuka browser Chrome, menjalankan test, dan melaporkan hasilnya. Anda akan melihat browser melakukan interaksi sesuai dengan kode yang Anda tulis.
-
Membuat User untuk Testing (Jika Belum Ada):
Jika Anda belum memiliki pengguna di database, Anda bisa membuatnya dengan menggunakan factory dan seeder. Misalnya, buat factory untuk model
User
:php artisan make:factory UserFactory
Kemudian, edit berkas
database/factories/UserFactory.php
dan tambahkan kode berikut:<?php namespace DatabaseFactories; use AppModelsUser; use IlluminateDatabaseEloquentFactoriesFactory; use IlluminateSupportStr; class UserFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } }
Selanjutnya, buat seeder untuk membuat pengguna:
php artisan make:seeder UserSeeder
Edit berkas
database/seeders/UserSeeder.php
dan tambahkan kode berikut:<?php namespace DatabaseSeeders; use AppModelsUser; use IlluminateDatabaseSeeder; class UserSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { User::factory()->create([ 'name' => 'Test User', 'email' => '[email protected]', 'password' => bcrypt('password'), ]); } }
Terakhir, jalankan seeder dengan perintah:
php artisan db:seed --class=UserSeeder
Pastikan database Anda sudah dimigrasi sebelum menjalankan seeder.
Dengan test sederhana ini, Anda telah berhasil menjalankan pengujian E2E dengan Laravel Dusk. Anda bisa mengembangkan test ini lebih lanjut untuk menguji berbagai aspek form login Anda, seperti validasi field, pesan kesalahan, dan lain-lain.
Tips dan Best Practices Penggunaan Laravel Dusk
Untuk memaksimalkan efektivitas Laravel Dusk, berikut beberapa tips dan best practices yang perlu diperhatikan:
-
Gunakan CSS Selectors yang Spesifik: Gunakan CSS selectors yang unik dan stabil untuk mengidentifikasi elemen HTML. Hindari menggunakan selectors yang bergantung pada struktur DOM yang mungkin berubah. Lebih baik lagi, tambahkan atribut
data-testid
ke elemen HTML Anda dan gunakan atribut ini sebagai selector (contoh:[data-testid="login-button"]
). -
Gunakan Waits: Terkadang, website memerlukan waktu untuk memuat konten atau menyelesaikan operasi. Gunakan wait untuk memastikan bahwa elemen yang Anda cari sudah tersedia sebelum berinteraksi dengannya. Contoh:
$browser->visit('/products') ->waitFor('#product-list') // Menunggu elemen dengan ID 'product-list' muncul ->assertSee('Product 1');
-
Abstraksikan Logika yang Berulang: Jika Anda memiliki logika yang digunakan di beberapa test, abstraksikan logika tersebut ke dalam method yang terpisah. Ini akan membuat test Anda lebih mudah dibaca dan dipelihara. Misalnya, buat helper method untuk login:
protected function login(Browser $browser, $email, $password) { $browser->visit('/login') ->type('email', $email) ->type('password', $password) ->press('Login'); }
Kemudian, gunakan method ini di test Anda:
public function testSuccessfulLogin() { $this->browse(function (Browser $browser) { $this->login($browser, '[email protected]', 'password'); $browser->assertPathIs('/dashboard'); }); }
-
Gunakan Database Transactions: Gunakan database transactions untuk memastikan bahwa test Anda tidak memengaruhi data yang ada di database. Laravel secara otomatis menjalankan setiap test dalam transaction, tetapi Anda bisa mengaktifkannya secara manual jika diperlukan:
use IlluminateFoundationTestingDatabaseTransactions; class ExampleTest extends DuskTestCase { use DatabaseTransactions; // ... }
-
Jalankan Test Secara Paralel: Untuk mempercepat waktu eksekusi, Anda bisa menjalankan test secara paralel. Laravel Dusk mendukung ini dengan mudah:
php artisan dusk --parallel
-
Screenshot pada Kegagalan: Konfigurasi Dusk untuk mengambil screenshot secara otomatis ketika test gagal. Ini akan membantu Anda mengidentifikasi masalah dengan lebih mudah. Tambahkan kode berikut ke method
tearDown()
ditests/DuskTestCase.php
:protected function tearDown(): void { parent::tearDown(); foreach (static::$browsers as $browser) { if (isset($browser)) { $browser->driver->quit(); } } if ($this->hasFailed()) { foreach (static::$browsers as $browser) { if (isset($browser)) { $browser->screenshot(get_class($this) . '_' . $this->getName()); } } } }
-
Konsisten dalam Penamaan Test: Beri nama test Anda secara deskriptif dan konsisten. Ini akan memudahkan Anda untuk memahami apa yang diuji oleh setiap test.
-
Jangan Menguji Hal yang Sama Berulang Kali: Hindari membuat test yang menguji fungsionalitas yang sama berulang kali. Fokus pada pengujian flow yang penting dan kompleks.
-
Gunakan Test Environments: Konfigurasi lingkungan test yang terpisah dari lingkungan pengembangan dan produksi. Ini akan memastikan bahwa test Anda tidak memengaruhi data atau konfigurasi yang sebenarnya.
-
Dokumentasikan Test Anda: Beri komentar pada test Anda untuk menjelaskan apa yang diuji dan mengapa. Ini akan membantu orang lain (dan diri Anda sendiri di masa depan) untuk memahami test Anda.
Studi Kasus: Pengujian CRUD dengan Laravel Dusk
Mari kita lihat contoh yang lebih kompleks: pengujian operasi CRUD (Create, Read, Update, Delete) pada data. Asumsikan kita memiliki resource Posts
dengan form untuk membuat, mengedit, dan menghapus post.
-
Membuat Test:
php artisan dusk:make PostsTest
-
Menulis Test:
<?php namespace TestsBrowser; use IlluminateFoundationTestingDatabaseMigrations; use LaravelDuskBrowser; use TestsDuskTestCase; use AppModelsPost; class PostsTest extends DuskTestCase { use DatabaseMigrations; public function testCreatePost() { $this->browse(function (Browser $browser) { $browser->visit('/posts/create') ->type('title', 'My New Post') ->type('content', 'This is the content of my new post.') ->press('Create Post') ->assertSee('My New Post'); }); } public function testUpdatePost() { $post = Post::factory()->create(['title' => 'Original Title']); $this->browse(function (Browser $browser) use ($post) { $browser->visit('/posts/' . $post->id . '/edit') ->type('title', 'Updated Title') ->press('Update Post') ->assertSee('Updated Title'); }); } public function testDeletePost() { $post = Post::factory()->create(['title' => 'Post to Delete']); $this->browse(function (Browser $browser) use ($post) { $browser->visit('/posts') ->click('#delete-post-' . $post->id) // Pastikan ada tombol delete dengan ID ini ->assertDontSee('Post to Delete'); }); } }
Penjelasan:
testCreatePost()
: Menguji pembuatan post baru.testUpdatePost()
: Menguji pembaruan post yang sudah ada.testDeletePost()
: Menguji penghapusan post.
Pastikan Anda menyesuaikan selector dan nilai yang digunakan dalam test dengan struktur HTML dan data yang ada di website Anda.
Mengatasi Masalah Umum dengan Laravel Dusk: Debugging dan Troubleshooting
Meskipun Laravel Dusk adalah tool yang hebat, Anda mungkin menghadapi beberapa masalah saat menggunakannya. Berikut beberapa masalah umum dan cara mengatasinya:
-
Elemen Tidak Ditemukan:
- Penyebab: Elemen yang Anda cari belum dimuat atau selector yang Anda gunakan salah.
- Solusi: Gunakan
waitFor()
untuk menunggu elemen muncul. Periksa kembali selector Anda. Gunakan developer tools di browser untuk memastikan selector Anda benar.
-
Timeout:
- Penyebab: Operasi membutuhkan waktu lebih lama dari yang diharapkan.
- Solusi: Tingkatkan nilai timeout di konfigurasi Dusk (
config/dusk.php
). Gunakan wait yang lebih spesifik. Optimalkan kode website Anda untuk meningkatkan kinerja.
-
ChromeDriver Tidak Kompatibel:
- Penyebab: Versi ChromeDriver tidak sesuai dengan versi Chrome yang Anda gunakan.
- Solusi: Unduh ChromeDriver yang sesuai dengan versi Chrome Anda.
-
Test Gagal Secara Acak:
- Penyebab: Masalah sinkronisasi atau kondisi balapan.
- Solusi: Gunakan wait yang lebih banyak. Pastikan test Anda bersifat deterministik (tidak bergantung pada waktu atau faktor eksternal lainnya).
-
Session Cookies Tidak Tersimpan:
- Penyebab: Konfigurasi session yang salah atau masalah dengan cookie.
- Solusi: Pastikan konfigurasi session Anda benar (
config/session.php
). Periksa apakah domain dan path cookie sudah benar.
-
Error “Call to undefined method FacebookWebDriverRemoteRemoteWebDriver::setFileDetector()”:
- Penyebab: Versi
facebook/webdriver
yang tidak kompatibel. - Solusi: Update atau downgrade package
facebook/webdriver
menggunakan Composer.
- Penyebab: Versi
Untuk membantu debugging, Anda bisa menggunakan:
$browser->pause(milliseconds)
: Menunda eksekusi test untuk memberikan waktu bagi Anda untuk mengamati browser.$browser->screenshot('debug')
: Mengambil screenshot dari browser pada saat tertentu.dump($browser->element('#element-id')->getAttribute('innerHTML'))
: Menampilkan konten HTML dari elemen tertentu.error_log($message)
: Menulis pesan ke log PHP.
Dengan kombinasi tips dan best practices yang telah kita bahas, Anda akan dapat mengatasi sebagian besar masalah yang mungkin Anda hadapi saat menggunakan Laravel Dusk.
Kesimpulan: Memanfaatkan Laravel Dusk untuk Kualitas Website Laravel yang Lebih Baik
Laravel Dusk adalah tool yang ampuh untuk pengujian E2E website Laravel Anda. Dengan Dusk, Anda dapat memastikan bahwa seluruh sistem bekerja bersama secara harmonis, memberikan pengalaman pengguna yang baik, dan mengurangi risiko bug yang mahal.
Meskipun awalnya mungkin terasa sedikit rumit, dengan latihan dan pemahaman yang baik, Anda akan dapat memanfaatkan Laravel Dusk untuk meningkatkan kualitas dan keandalan website Laravel Anda secara signifikan. Jangan ragu untuk bereksperimen, mencoba berbagai teknik, dan terus belajar. Selamat mencoba dan semoga sukses dengan pengujian E2E Anda!