Automated Testing Menggunakan PHPUnit di Bitbucket Pipelines

Bagi yang terbiasa mengembangkan aplikasi dengan metode Test Driven Development (TDD), maka sudah pasti sering berurusan dengan testing. Di PHP, framework testing yang paling populer dan sering digunakan adalah PHPUnit.

Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: requirements are turned into very specific test cases, then the software is improved to pass the new tests, only.

Berkenalan dengan Test di Laravel

Laravel sudah menyediakan fitur test yang terintegrasi dengan framework. Fitur test yang tersedia pada Laravel dibagi dalam dua jenis, yaitu feature test dan unit test.

Berkas feature test disimpan dalam direktori tests/Feature. Di dalam direktori tersebut sudah tersimpan sebuah contoh test dengan nama ExampleTest.php.

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

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

        $response->assertStatus(200);
    }
}

Sedangkan untuk unit test, berkasnya tersimpan dalam direktori tests/Unit. Sebagai contoh unit test yang sudah tersedia dapat dilihat pada snippet di bawah.

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

Unit test biasanya fokus pada skala kecil, untuk porsi skrip yang terisolasi. Faktanya, unit test seringkali digunakan hanya untuk menguji satu buah method saja.

Feature test jangkauannya lebih luas. Biasanya dilakukan untuk menguji porsi skrip yang lebih luas dan penggunaan method yang saling berkaitan. Sebagai contoh paling sederhana adalah pengujian HTTP.

Menjalankan Test

Setelah Laravel diinstal ke dalam mesin lokal, kita dapat menjalankan unit test dengan perintah di bawah.

$ ./vendor/bin/phpunit

Test pertama (feature test) berfungsi untuk mengakses URL root dan memastikan bahwa kode HTTP-nya adalah 200 (OK). Jika kode yang dikembalikan oleh HTTP selain 200, maka dipastikan test dianggap gagal.

Test kedua (unit test) hanya menguji sebuah argumen bernilai true. Di test ini sebenarnya tidak menguji apa-apa. Bisa dipastikan status test ini pasti selalu dianggap sukses.

Test dengan PHPUnit

Test dengan PHPUnit

Membuat Test Baru

Sebelum lebih jauh berpindah menggunakan Bitbucket Pipelines, mari kita buat sebuah test baru. Test ini berfungsi untuk menguji tautan login (domain.com/login) sudah tersedia dan mengembalikan kode HTTP 200 (OK).

Untuk pembuatan berkas test lebih cepat, kita dapat menggunakan generator yang disediakan oleh Artisan.

$ php artisan make:test LoginTest

Test created successfully.

Buka berkas LoginTest.php yang tersimpan dalam test/Feature. Modifikasi method testExample() pada berkas menjadi potongan skrip di bawah.

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response->assertStatus(200);
    }
}

Jika kita menjalankan PHPUnit, maka akan didapati kesalahan kalau test login tersebut gagal dijalankan. Alih-alih mendapati kode HTTP 200 (OK), malah yang didapat adalah kode 404 (Not Found). Untuk memastikan, kalian bisa mengakses URL /login langsung melalui peramban.

Unit test gagal

Unit test gagal

Untuk mengaktifkan fitur auth di Laravel, kalian bisa menjalankan perintah di bawah. Dengan mengaktifkan fitur auth di Laravel, ada beberapa URL baru yang didaftarkan pada aplikasi, seperti /register, /logout, dan /login itu sendiri.

$ php artisan make:auth

Authentication scaffolding generated successfully.

Sekarang, jalankan kembali unit test dengan PHPUnit. Apakah kalian mendapati kalau test berhasil dilewati? Ya tentu saja. Karena tautan /login sudah tersedia di aplikasi dan dapat diakses melalui peramban.

Bitbucket Pipelines

Bitbucket merupakan salah satu penyedia repositori Git (dan Mercurial) yang cukup populer. Salah satu fitur yang cukup menarik dari Bitbucket adalah Pipelines. Pipelines bisa disebut sebagai Continuous Integration (CI) / Continuous Delivery (CD). Dengan Pipelines ini, kita dapat melakukan test pada aplikasi berbasis Laravel. Tak hanya Laravel sih, plain PHP pun bisa, bahkan bahasa pemrograman lain.

In software engineering, continuous integration (CI) is the practice of merging all developer working copies to a shared mainlineseveral times a day.[1] Grady Booch first named and proposed CI in his 1991 method,[2] although he did not advocate integrating several times a day. Extreme programming (XP) adopted the concept of CI and did advocate integrating more than once per day – perhaps as many as tens of times per day.

Ketika menggunakan Pipelines, maka test pada aplikasi tersentral pada satu tempat. Setiap pengguna yang tergabung dalam repositori mendapatkan notifikasi apabila terdapat test gagal, dan paling penting, setiap user tak perlu repot menjalankan test pada mesin lokal.

Konfigurasi Test pada Bitbucket Pipelines

Hal perama yang dilakukan sebelum membuat Pipelines adalah membuat repositori baru pada Bitbucket dan meng-commit proyek berbasis Laravel ke repositori tersebut.

Akses menu Pipelines dan buat Pipelines baru dengan memilih template bahasa pemrograman PHP. Tanpa memodifikasi isi berkasnya, lanjutkan dengan meng-commit Pipelines tersebut. Dengan meng-commit berkas konfigurasi tersebut, maka kita akan mendapati berkas baru pada source dengan nama bitbucket-pipelines.yml.

Bitbucket Pipelines

Bitbucket Pipelines

Secara default, isi dari berkas bitbucket-pipelines.yml adalah sebagai berikut:

# This is a sample build configuration for PHP.
# Check our guides at https://confluence.atlassian.com/x/e8YWN for more examples.
# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image: php:7.1.1

pipelines:
  default:
    - step:
        caches:
          - composer
        script:
          - apt-get update && apt-get install -y unzip
          - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
          - composer install
          - vendor/bin/phpunit

Pipelines otomatis akan berjalan setelah konfigurasi di-commit. Tapi tunggu dulu, konfigurasi belum berakhir di sini. Jika kita ikuti progress Pipelines, maka akan didapati kalau test tersebut gagal dilewati.

Bitbucket Pipelines gagal

Bitbucket Pipelines gagal

Dari pesan kesalahan, kita dapati sebuah pesan yang berisi:

RuntimeException: No application encryption key has been specified.

Dari pesan tersebut sudah dapat dipahami kalau encryption key belum didefinisikan. Di mesin lokal, kita cukup menjalankan perintah php artisan key:generate untuk membuat key baru.

Tapi bagaimana membuat jika ingin membuat encryption key baru di Bitbucket Pipelines? Kita cukup menambahkan step perintah  php artisan key:generate pada berkas bitbucket-pipelines.yml yang ada pada source repositori.

Jangan lupa sebelum meng-generate encryption key baru, pastikan juga berkas .env sudah tersedia. Kita dapat menyalinnya dari berkas .env.example.

# This is a sample build configuration for PHP.
# Check our guides at https://confluence.atlassian.com/x/e8YWN for more examples.
# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image: php:7.1.1

pipelines:
  default:
    - step:
        caches:
          - composer
        script:
          - apt-get update && apt-get install -y unzip
          - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
          - composer install
          # copy file .env.example to .env
          - cp .env.example .env
          # generate new encryption key
          - php artisan key:generate
          - vendor/bin/phpunit

Jika kita jalankan lagi Pipelines, maka beberapa issue di atas sudah tertangani dan test dianggap sukses.

Test berhasil

Test berhasil

Selamat!
Kalian sudah berhasil membuat test dan mengujinya di lokal. Tak hanya sampai di sana, kalian juga mampu membuat test dengan memanfaatkan tool yang disediakan oleh Bitbucket, yaitu Pipelines.

Contoh repositori dan test menggunakan Pipelines: https://bitbucket.org/arvernester/laravel-test/addon/pipelines/home#!/.

Tidak semua hal dapat dijelaskan mendetail pada pos ini. Ada beberapa bagian yang memang sengaja dilewatkan karena saya yakin kalian dapat memahaminya sendiri. Oleh karenanya, teruslah mencoba dan menjelajah hal-hal baru dalam dunia pemrograman, khususnya test menggunakan Bitbucket Pipelines. 😉

Tinggalkan Balasan