Wednesday, February 18, 2015

Symfony 2 Hari 9: Unit testing

Artikel ini dirunut berdasarkan Jobeet Tutorial, yang dibuat oleh Fabien Potencier, untuk Symfony 1.4.

Test di Symfony 2

Ada dua macam test di Symfony 2 yaitu unit test dan functional test. Unit test adalah test untuk memverifikasi apakah semua method sudah berjalan denga baik. Dan functional test akan memverifikasi apakah aplikasi sudah menghasilkan ouput yang sesuai dengan harapan.

Symfony 2 terintegrasi secara langsung ke PHPUnit test, jika kamu belum punya PHPUnit test kamu bisa menginstallnya denga perintah berikut:


sudo apt-get install phpunit
sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover pear.symfony-project.com
sudo pear channel-discover components.ez.no
sudo pear channel-discover pear.symfony.com
sudo pear update-channels
sudo pear upgrade-all
sudo pear install pear.symfony.com/Yaml
sudo pear install --alldeps phpunit/PHPUnit
sudo pear install --force --alldeps phpunit/PHPUnit

Semua Class test yang akan digunakan untuk melakukan testing harus berada di dalam subdirektori Test/ . Jika kamu sudah membuat Class testnya dengan benar kamu bisa memulai testnya dengan menjalankan perintah berikut:

phpunit -c app/

Pilihan -c artinya memberitahu PHPUnit untuk masuk ke direktori app dan memeriksa file konfigurasi yang ada di sana. Jika kamu penasaran mengenai pilihan-pilhan yang ada PHPUnit kamu dapat melihat file app/phpunit.xml.dist

Test biasanya dimulai dengan kelas yang spesifik. Mari kita mulai dengan mengetest method Jobeet:slugify().

Buat file baru JobeetTest.php di dalam folder src/Ibw/JobeetBundle/Tests/Utils.


src/Ibw/JobeetBundle/Tests/Utils/JobeetTest.php

namespace Ibw\JobeetBundle\Tests\Utils;
use Ibw\JobeetBundle\Utils\Jobeet;
class JobeetTest extends \PHPUnit_Framework_TestCase
{
    public function testSlugify()
    {
        $this->assertEquals('sensio', Jobeet::slugify('Sensio'));
        $this->assertEquals('sensio-labs', Jobeet::slugify('sensio labs'));
        $this->assertEquals('sensio-labs', Jobeet::slugify('sensio labs'));
        $this->assertEquals('paris-france', Jobeet::slugify('paris,france'));
        $this->assertEquals('sensio', Jobeet::slugify(' sensio'));
        $this->assertEquals('sensio', Jobeet::slugify('sensio '));
    }
}
 
Untuk menjalankan test ini kita tinggal menjalankan perintah ini di terminal:

phpunit -c app/ src/Ibw/JobeetBundle/Tests/Utils/JobeetTest

Jika semua berjalan dengan baik kamu harus melihat tampilan berikut:

PHPUnit 3.7.22 by Sebastian Bergmann.
Configuration read from /var/www/jobeet/app/phpunit.xml.dist
.
Time: 0 seconds, Memory: 8.00Mb
OK (1 test, 6 assertions)

Menambahkan test untuk fitur baru

Mari kita ubah method slugify() agar mengembalikan nilai 'n-a' jika method slugify() berisi string yang kosong.

src/Ibw/JobeetBundle/Tests/Utils/JobeetTest.php


// ...
$this->assertEquals('n-a', Jobeet::slugify(''));
// ...
Sekarang jika kita menjalankan testnya lagi kita akan mendapatkan pesan error

PHPUnit 3.7.22 by Sebastian Bergmann.
Configuration read from /var/www/jobeet/app/phpunit.xml.dist
F
Time: 0 seconds, Memory: 8.25Mb
There was 1 failure:
1) Ibw\JobeetBundle\Tests\Utils\JobeetTest::testSlugify
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'n-a'
+''
/var/www/jobeet/src/Ibw/JobeetBundle/Tests/Utils/JobeetTest.php:13
FAILURES!
Tests: 1, Assertions: 5, Failures: 1.


Edit method Jobeet:slugify() dan tambahkan pengecekan seperti berikut ini:
src/Ibw/JobeetBundle/Utils/Jobeet.php


// ...
    static public function slugify($text)
    {
        if (empty($text)) {
            return 'n-a';
        }
        // ...
    }

Lalu kita jalankan testnya kembali dan sekarang semuanya akan terlihat lebih baik.

Menambahkan test jika terjadi bug

Misalnya suatu ketika seorang user melaporkan ada hal yang aneh. Beberapa link Job mengarahkan ke halaman 404 not found. Seteleah melakukan infestigasi kamu menemukan jika link slug tidak memiliki company, tempat atau posisi. Bagaimana ini terjadi? Setelah kamu cek ternyata di database datanya lengkap.
Dan bingo! kamu menyadari hal terjadi karena ketika string memiliki karankter yang tidak sesuai dengan ASCII maka method slugify akan menkonvertnya string yang kosong. Setelah menemukan bugnya hal pertama yang harus dilakukan adalah melakukan test.

src/Ibw/JobeetBundle/Tests/Utils/JobeetTest.php
 
$this->assertEquals('n-a', Jobeet::slugify(' - '));

Tapi kamu akan menemukan error dalam test tersebut jadi kamu harus memodifikasi method slugify() untuk menyesuaikan dengan test

src/Ibw/JobeetBundle/Utils/Jobeet.php

static public function slugify($text)
{
    // ...

    if (empty($text))
    {
        return 'n-a';
    }

    return $text;
}



Dan jika kamu menjalankan testnya lagi kamu akan melihat pesan suksesnya.


Mengcover kode

Ketika kamu menulis kode kamu bisa saja melupakan kode atau method yang sudah ditambahkan. Untuk melihat semua list dari kode yang kamu buat, kamu bisa menjalankan perintah --coverage-html.

phpunit --coverage-html=web/cov/ -c app/
Untuk mengecek kode yang sudah tercover kamu dapat melihatnya melalui web browser dengan mengakses url berikut:
localhost/sandbox/cov/index.html

No comments:

Post a Comment