PHP Unit VS Pest PHP

Pest PHP untuk kemudahan Unit Testing di projek Laravel

Muhammad Hafid
8 min readFeb 10, 2021

--

Latar Belakang

Halo teman-teman semua jika anda seorang Quality Assurance Engineer ataupun Developer projek PHP spesifiknya Laravel, pasti sudah akrab dengan yang namanya PHP Unit. PHPUnit adalah tools yang sangat populer untuk melakukan unit testing di PHP spesifiknya Laravel, Library yang ada cukup lengkap mulai dari assertion, mocking dan bahkan sudah ada dalam dokumentasi Laravel.

Sama seperti kebanyakan orang, sebelumnya saya juga pernah menggunakan PHPUnit untuk melakukan Automation Testing projek Laravel. Lalu singkat cerita tiba saat Training Internship di PT. Digdaya Olah Teknologi Indonesia, salah satu mentor mengenalkan tools Automation Testing bernama Pest PHP.

Studi Kasus

Nah pada Artikel ini saya ingin mengangkat studi kasus berikut, Apa sih Pest PHP? lalu apa yang membedakan dari sebuah testing script menggunakan PHPUnit ? apakah sesuai dengan subjudul artikel ini?

let’s see

Apa sih Pest PHP?

Pest PHP atau bisa disebut Pest dibuat oleh Nuno Maduro seorang Software Engineer Laravel, Pest merupakan software testing yang tergolong baru, rilis pada awal tahun ini (2020) dan sekarang dilisensikan di bawah lisensi MIT. Pest adalah framework agnostik dan dapat digunakan dalam project PHP apapun, dikutip dari dokumentasinya mereka mengatakan bahwa :

“Pest is a Testing Framework with a focus on simplicity. It was carefully crafted to bring the joy of testing to PHP”

Dari sini bisa dikatakan tujuan dari dibuatnya Pest ini adalah untuk memudahkan testing PHP dengan adanya kerangka pengujian atau script test yang sangat sederhana untuk memudahkan kita dalam pengujian suatu project PHP.

▶ Lalu apa yang membedakan dari sebuah testing script menggunakan PHPUnit ?

Oke sekarang kita masuk case bagaimana perbedaan test script menggunakan Pest dengan yang menggunakan PHPUnit. Pertama kita lihat contoh script testing yang menggunakan PHPUnit :

Script Testing fitur ganti password menggunakan PHPUnit.

Disini saya mengambil contoh Script Testing fitur ganti password di sebuah projek Laravel, agar bisa kita bandingkan dengan contoh Script Testing menggunakan Pest PHP. Jika ingin melihat dokumentasi lengkap PHPUnit teman-teman bisa mengunjungi https://phpunit.de/.

Saya sudah mencoba Pest ini di projek Laravel sederhana yang sudah saya buat, projek yang dimaksud ini adalah sebuah apps sederhana berbasis API konsepnya hampir sama dengan Medium jadi terdapat role User, Artikel, Artikel Category dan, Artikel Comment. Untuk lebih jelasnya teman-teman bisa melihat atau clone projectnya :

https://github.com/MuhammadHafid/TestingPest.php/tree/GithubPest

Dan saya akan menjelaskan secara singkat bagaimana proses membuat sebuah Test Script projek ini menggunakan Pest PHP.

📌 Sebelum itu teman-teman bisa melakukan instalasi Pest terlebih dahulu sesuai link berikut : https://pestphp.com/docs/installation/

Oke, setelah melakukan instalasi tersebut buka folder test di project PHP teman-teman, jika terdapat folder dan file sesuai gambar dibawah maka kita sudah siap membuat Script Automation Testing menggunakan Pest.

Terdapat folder feature dan unit, apa sih perbedaan dari keduanya?

▶ Unit : test yang berhubungan dengan sudut pandang programmer untuk memastikan bahwa metode tertentu / sebuah unit dari suatu kelas melakukan tugas sesuai tasknya.

▶ Feature : testing yang berhubungan dengan user prespective dapat menguji Sebagian besar kode, termasuk beberapa objek berinteraksi satu sama lain ataupun permintaan HTTP ke Endpoint JSON.

Next, untuk membuat Test fitur Article maka buat file untuk menulis Script Test di folder feature menggunakan command berikut :

Setelah membuat file ArticleTest.php maka artinya kita sudah siap untuk menulis Script Testing untuk menguji masing-masing endpoint yang ada pada Article. Pada fitur Article ini user dapat melakukan :

1 User yang sudah Login bisa create Artikel.

2 User yang sudah Login bisa update Artikel tapi hanya artikelnya sendiri.

3 User yang sudah Login bisa read Artikel semua atau hanya satu Artikel.

4 User yang sudah Login bisa delete Artikel tapi hanya artikelnya sendiri.

Next, jangan lupa siapkan Factory, Factory adalah semacam Seeder yang akan dipanggil saat dibutuhkan saat menyusun sebuah Script Test. Disini saya sudah menyiapkan Factory untuk Artikel, Category dan Comment karena untuk UserFactory sudah ada dari sana nya. Untuk script dari masing-masing factory teman-teman bisa lihat di :

Nah saatnya kita beralih ke file ArticleTest.php pertama jangan lupa untuk import class nya termasuk faker nya juga, faker untuk mempermudah kita mendapatkan data acak sesuai dengan yang kita butuhkan, seperti inilah isi dari Script Testing fitur Artikel menggunakan Pest PHP atau teman-teman bisa membuka di link projek yang sudah saya cantumkan tadi :

( Import Class yang dibutuhkan & Script Test Create Article )

<?php//Import class Article,Category, User termasuk untuk Fakeruse App\Models\Article;
use App\Models\Category;
use App\Models\User;
use Faker\Factory;
use function Tests\actingAs;
use Illuminate\Foundation\Testing\RefreshDatabase;
//Refresh Database agar migration dijalankan
uses(\Illuminate\Foundation\Testing\RefreshDatabase::class);
test('Create_Article_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.
$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.
$article = new stdClass(); //Membuat object untuk menampung data article.$article->title = "Ini Title Article";
$article->content = "Bismillahirrahmanirrahim";
$this->actingAs($user, 'api') //Acting as berfungsi untuk autentikasi sebagai user
->post(route('articles.store'), [ //Mengarahkan method post ke route articles.store, fungsinya mengarah ke fungsi store.
//isi parameter sesuai kebutuhan request'title' => $article->title, //Mengisi 'title' dengan data title dari object yang dibuat tadi.
'content' => $article->content, //Mengisi 'content' dengan data content yang dibuat tadi
'user_id' => $user->id, //Mengisi 'user_id' dengan data user_id dari faker yang sudah kita buat di factory
'category_id' => $category->id, //Mengisi 'category_id' dengan data category_id dari faker yang sudah kita buat di factory
])->assertSuccessful(); //Asumsi hasil yang diinginkan adalah succesful atau bisa diisi assertStatus (201)$this->assertDatabaseHas('articles', [ //Memastikan bahwa data berhasil masuk ke Database.'title' => $article->title,
'content' => $article->content,
'user_id' => $user->id,
'category_id' => $category->id,
]);
});

( Script Test Update Article )

it('Update_Article_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.
$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.
$article = factory(Article::class)->make(); //Membuat objek article dengan user_id dan category_id yang sudah ada.$article->user_id = $user->id;
$article->category_id = $category->id;
$user->articles()->save($article); //Save data Artikel.$article->title = "Test Title 2"; //Set data artikel title yang baru.
$article->content = "Bismillahirrahmanirrahim2"; //Set data artikel content yang baru.
$this->actingAs($user, 'api') //Acting as berfungsi untuk autentikasi sebagai user
->put(route('articles.update', $article->id), [ //Mengarahkan method put ke route articles.update, fungsinya mengarah ke fungsi update.
'title' => $article->title, //Mengisi 'title' dengan data title dari object baru yang dibuat tadi.
'content' => $article->content, //Mengisi 'content' dengan data content baru yang dibuat tadi.
'user_id' => $article->id,
'category_id' => $category->id,
])->assertSuccessful(); //Asumsi hasil yang diinginkan adalah succesful atau bisa diisi assertStatus (200)$this->assertDatabaseHas('articles', [ //Memastikan bahwa data berhasil masuk ke Database.'title' => $article->title,
'content' => $article->content,
'user_id' => $user->id,
'category_id' => $category->id,
]);
});

( Script Test Show Article )

it('Show_Article_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.$this->actingAs($user, 'api'); //Acting as berfungsi untuk autentikasi sebagai user.$article = factory(Article::class)->make(); //Membuat objek article dengan user_id dan category_id yang sudah ada.$article->user_id = $user->id;
$article->category_id = $category->id;
$user->articles()->save($article);$this->get(route('articles.show', $article->id)) //Mengarahkan method get ke route show, fungsinya mengarah ke fungsi show.->assertStatus(200); //Asumsi hasil yang diinginkan adalah succesful atau bisa diisi assertStatus (200)
});

( Script Test Delete Article )

it('Delete_Article_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.
$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.
$this->actingAs($user, 'api'); //Acting as berfungsi untuk autentikasi sebagai user.$article = factory(Article::class)->make(); //Membuat objek article dengan user_id dan category_id yang sudah ada.$article->user_id = $user->id;
$article->category_id = $category->id;
$user->articles()->save($article);$this->delete(route('articles.destroy', $article->id)) //Mengarahkan method delete ke route articles.destroy, fungsinya mengarah ke fungsi destroy.
->assertStatus(200); //Asumsi hasil yang diinginkan adalah succesful atau bisa diisi assertStatus (200)
});

( Script Negative Test Create & Update Article )

test('Create_Article_Negative_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.$this->actingAs($user, 'api'); //Acting as berfungsi untuk autentikasi sebagai user//isi parameter sesuai kebutuhan request
$article = [
'content' => "Bismillahirrahmanirrahim",
'user_id' => $user->id,
'category_id' => $category->id,
];
$this->json('POST', route('articles.store'), $article) //Mengarahkan method put ke route article.store, fungsinya mengarah ke fungsi store.
->assertStatus(422); //Asumsi hasil yang diinginkan adalah assertStatus (422) karena kita tidak input title.
});
it('Update_Article_Negative_Test', function () {$user = factory(User::class)->create(); //Membuat objek user yang otomatis menambahkannya ke database.$category = factory(Category::class)->create(); //Membuat objek category yang otomatis menambahkannya ke database.$article = factory(Article::class)->make(); //Membuat objek article dengan user_id dan category_id yang sudah ada.$user->articles()->save($article); //Save data Artikel.$user->id = 2; //Set user id menjadi 2.$this->actingAs($user, 'api') //Acting as berfungsi untuk autentikasi sebagai user->put(route('articles.update', $article->id), [ //Mengarahkan method put ke route articles.update, fungsinya mengarah ke fungsi update.'title' => $article->title,
'content' => $article->content,
'user_id' => $user->id,
'category_id' => $category->id,
])->assertStatus(403); //Asumsi hasil yang diinginkan adalah assertStatus (403) atau Forbidden karena kita tidak input title.});])->assertStatus(403); //Asumsi hasil yang diinginkan adalah assertStatus (403) atau Forbidden karena kita tidak input title.});

Nah kurang lebih seperti itu untuk Script Test fitur Artikel, dibawah sendiri ada case untuk Negative Test create dan update. Disitu kita test endpoint create tapi kita kosongi title artikel nya nah ekspektasi kita bakal muncul error 422 karena validasi error, dan untuk Negative Testing update case nya adalah jika kita mau edit artikel tapi yang bukan milik kita maka assert statusnya 403 karena unauthorized.

apakah sesuai dengan subjudul artikel ini?

Sesuai subjudul di artikel ini “Pest PHP untuk kemudahan Automation Testing di projek Laravel” saya rasa sangat relevan. Karena memang secara penggunaan memudahkan saya menyusun sebuah Test Script Automation Testing di projek Laravel, dengan penulisan yang simpel pun juga bagi yang sebelumnya menggunakan PHPUnit juga dipermudah dengan tidak perlu adaptasi lagi karena memang Pest dibangun diatas kerangkan PHPUnit ( https://nunomaduro.com/using-pest-in-laravel/ ). Dokumentasi nya juga saya rasa sangat memudahkan untuk dipelajari 😀

Kesimpulan

Dikutip dari pernyataan creator Pest PHP, beliau mengatakan “mengapa kita harus memakai Pest PHP ini?” karena Pest merupakan sebuah Testing Framework yang dibuat untuk memudahkan kita menulis Script Testing dengan sangat sederhana, minimal dan elegan.

Kesimpulan yang bisa saya ambil, Pest PHP sangat membantu untuk kemudahan dalam penyusunan Test Script Automation Test dalam projek PHP terlebih pada projek Laravel. Kalau saya pribadi lebih prefer untuk menggunakan Pest sebagai Testing Framework untuk projek Laravel,bagi anda yang baru belajar Automation Testing untuk project PHP spesifik Laravel saya menyarankan untuk menggunkan Pest ataupun bagi anda yang sudah pernah menggunakan Software Testing untuk PHP tidak ada salahnya anda mencoba Pest dan akan merasakan kemudahan menggunakan Pest PHP ini 😀

Sekian Artikel dari saya apabila ada kurang atau salah kata mohon maaf sebesar-besarnya, Semoga Bermanfaat!

Refrensi :

https://pestphp.com/

https://github.com/pestphp/pest

https://nunomaduro.com/talks/

https://laravel.com/docs/5.1/testing

--

--

Muhammad Hafid
Muhammad Hafid

No responses yet