Nafies Luthfi

Life will always feel wonderful if we always think positively.

Testing Laravel: Tentang Automated Testing

Melanjutkan dari artikel sebelumnya, kita sudah membahas bahwa Automated Testing itu penting untuk dipelajari dan diterapkan dalam pembangunan aplikasi. Kali ini kita akan membahas lebih lanjut tentang apa itu Automated Testing atau disebut juga Testing Automation.

Menerjemahkan pengertian dari Wikipedia, menurut pemahaman saya :

Automated Testing adalah sebuah metode pengujian software yang menggunakan suatu Software Testing (terpisah dari sistem/aplikasi yang sedang diuji), dengan tujuan untuk membandingkan antara “output yang diprediksikan” dengan “output yang dihasilkan” oleh sistem.

Jadi kita memanfaatkan sebuah software/framework testing sebagai pengganti manusia untuk menguji, apakah sistem/aplikasi yang kita buat sudah sesuai dengan spesifikasi yang ditentukan atau tidak.

Tahapan umum melakukan Automated Testing

Secara umum tahapan melakukan Automated Testing adalah sebagaimana berikut :

  1. Memasang software testing pada sistem/aplikasi yang kita bangun.
  2. Menulis “kode/script pengujian” pada software testing untuk menguji masing-masing fitur yang ada di sistem.
  3. “Kode/script pengujian” yang ditulis pada software testing disesuaikan dengan kebutuhan/output yang diinginkan pada setiap fitur.
  4. Menjalankan software testing untuk melihat apakah fitur yang ada pada sistem/aplikasi “lulus uji” oleh software testing atau tidak.
    • Jika fitur yang diuji lulus, maka status hasil pengujian adalah passed atau “lulus”.
    • Jika fitur yang diuji tidak lulus, maka si-software testing akan menampilkan pesan error yang didapatkannya dari sistem kita.

Catatan:
Untuk mempermudah penyebutannya, “Kode pengujian” ini kita sebut dengan testing script atau singkatnya testing saja.

Contoh kasus : Testing Fitur Ganti Password dengan PHPUnit dan Laravel

Misalkan di sistem kita, terdapat satu fitur untuk user mengganti password, di mana untuk menggunakan fitur tersebut user melakukannya dengan cara :

  1. Meng-klik link Ganti Password
  2. Mengisi Password yang lama
  3. Mengisi Password yang baru
  4. Mengisi Konfirmasi password
  5. Klik Tombol Update Password
  6. Password baru tersimpan dalam database
  7. Tampil pesan “Password anda berhasil diubah.”

Nah, dengan Automated Testing kita melakukan simulasi proses/tahapan aktifitas tersebut dengan bantuan komputer (Software Testing). Dalam contoh kasus ini kita menggunakan sebuah software/framework testing bernama phpunit yang sudah tersedia dan terintegrasi dengan framework Laravel.

Dengan catatan bahwa fitur ganti password di dalam sudah bekerja sesuai cara di atas, berikut adalah contoh testing script-nya :

<?php

namespace Tests\Feature\Auth;

use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\BrowserKitTestCase;

// Kelas penguji untuk tujuan pengelompokan
class UserChangePasswordTest extends BrowserKitTestCase
{
    use DatabaseMigrations;

    /** @test */
    public function user_can_change_password() // Kasus fitur yang diuji
    {
        // Kondisi/Permisalan
        // generate user
        $user = factory(User::class)->make(['username' => '123456']);
        $this->actingAs($user); // Login/Acting sebagai user

        // Action
        $this->visit(route('change-password')); // Kunjungi url /change-password
        $this->type('secret', 'old_password'); // Input form
        $this->type('member', 'password');
        $this->type('member', 'password_confirmation');
        $this->press(trans('auth.change_password')); // Tekan tombol

        // Asumsi hasil
        $this->see(trans('auth.old_password_success')); // Melihat pesan
        $this->seePageIs(route('change-password'));

        // Cek bahwa passsword sudah berubah (password sebelumnya : secret)
        $this->assertTrue(app('hash')->check('member', $user->password));
    }
}
?>

Sumber: “UserChangePasswordTest.php” pada repo di github dengan sedikit modifikasi.

Testing Lulus

Okey, untuk mecoba apaka testingnya berhasil, kita coba jalankan PHPUnit pada Laravel, dengan perintah berikut pada terminal :

$ vendor/bin/phpunit tests/Feature/Auth/UserChangePasswordTest.php

Dan hasilnya :

Automated Testing 01

Sip, kita dapat hijau artinya “lulus tes”, berarti output yang diharapkan pada testing script yang kita buat ini sudah cocok dengan output yang dihasilkan oleh fitur Ganti Password pada sistem kita.

Testing Gagal

Bagaimana jika pengujian gagal? Misalkan setelah kita memodifikasi script yang terkait dengan fitur Ganti Password ini, maka PHPUnit akan menampilkan pesan error seperti contoh berikut :

Automated Testing 02

Begitu menemukan seperti ini, kita langsung dapat mengetahui bahwa ada kesalahan di script aplikasi kita. Sehingga dapat segera memperbaiki tanpa harus diuji secara manual atau menunggu “laporan” dari User yang menggunakan sistem.

“Automated Testing” Menghemat Waktu

Jika kita lihat pada contoh di atas (Testing Lulus) pada bagian time: 193 ms, artinya satu pengujian/testing script tersebut hanya memakan waktu 193 mili detik. Jauh lebih cepat jika kita mengujinya dengan cara manual dengan cara : Buka Browser, lalu Login, lalu klik Ganti Password, dan seterusnya.. mungkin perlu waktu sekitar 5-10 detik.

Dalam hati mungkin kita bilang : “Ga masalah sih, waktu 5-10 detik itu ga lama kok”. Tapi perlu kita ingat, bahwa waktu 5-10 detik itu hanya untuk menguji satu fitur saja. Bayangkan kalau kita memiliki 20 fitur dengan formulir pengisian yang lebih banyak.

Jika kita hitung rata-rata 1 fitur kita perlu waktu 5 detik untuk menguji secara manual dan continue, maka untuk 20 fitur kita perlu waktu 100 detik (1 menit 40 detik). Dibandingkan dengan bantuan Automated Testing yang hanyar perlu waktu sekitar 4 detik (20 x ~200ms). Tentunya jauh lebih efektif, kan? Itu baru 20 Fitur, lho.. :)

Contoh Testing Keseluruhan

Ini adalah capture automated testing PHPUnit yang dijalankan pada aplikasi Grosir Obat di atas yang telah dibuat untuk semua fiturnya.

Automated Testing 03

Bisa kita lihat, dalam waktu 2,7 detik, PHPUnit membantu men-simulasikan penggunaan fitur dengan hasil “Lulus”

Teman-teman bisa melihat dan mencoba testing script keseluruhan dari aplikasi tersebut di github pada direktori grosir-obat/tests/.

Konsep penulisan “Kode Pengujian”

Jika kita ingin membuat sebuah testing script untuk suatu fitur, bagaimana menulisnya? Konsep penulisan yang saya sering terapkan kurang lebih mengikut alur berikut :

  1. Kita buat sebuah kasus yang ingin kita uji.
  2. Tuliskan testing script untuk menentukan kondisi, action dan asumsi dengan urutan :
    1. Kondisi atau permisalan
    2. Action yang dilakukan
    3. Asumsi hasil yang diinginkan
  3. Pastikan testing script tadi sudah sesuai dengan tugas atau langkah kerja fitur yang kita ujikan.
  4. Jalankan software testing / (PHPUnit) untuk melihat hasilnya.
  5. Jika pada kasus pengujian ini lulus tes, maka fitur tersebut cocok dengan asumsi hasil yang diinginkan oleh “kode pengujiannya”
  6. Jika pada kasus pengujian ini tidak lulus, berarti ada yang salah, baik di sisi kode pengujian atau dari sisi fiturnya

Untuk mempermudah pemahaman, kita coba analogikan konsep penulisannya mirip seperti konsep yang diajarkan oleh guru kita sejak SD, ketika kita menjawab soal tugas atau ujian (imho).

Masih ingat dengan kata kunci ini: Pertanyaan, Diketahui, Ditanya, dan Jawab?

Pasti sebagian besar sudah pernah menerapkan konsep ini untuk menjawab soal, kan?

Contoh :

Pertanyaan :
    Hitunglah luas persegi panjang dengan panjang 5 meter dan lebar 3 meter.

Diketahui : 
    p = 5 meter
    l = 3 meter

Ditanya : Luas persegi panjang (L)

Jawab : 
    L = p x l
      = 5 x 3
      = 15
    Maka luas persegi panjang = 15 meter persegi

Nah, pada konsep penulisan testing script kita juga memiliki 4 kata kunci:
Fitur yang ingin diuji, Kondisi/Permisalan, Action atau ketika script dieksekusi, dan Asumsi hasil yang diinginkan.

Jadi :

  1. Fitur yang ingin diuji setara dengan Pertanyaan
  2. Kondisi/Permisalan setara dengan Diketahui
  3. Action setara dengan Ditanyakan
  4. Asumsi Hasil setara dengan Jawab

Dengan mengingat konsep ini, harapannya kita akan lebih mudah dalam menulis testing script.

Pada beberapa artikel kedepan, kita akan menerapkan konsep tersebut untuk mulai membangun “kode pengujian” atau testing script kita.

Nah, bagaimana jika kita ingin menerapkan Test-Driven Development (TDD)? Yaitu membuat testing script terlebih dahulu sebelum mulai menulis kode untuk membangun sistem? Kita akan bahas pada artikel Tentang TDD.

Terima kasih teman-teman sudah berkenan membaca.