Pengujian unit PHP dengan PHPUnit

Posted on

[ad_1]

PHPUnit adalah kerangka perangkat lunak pengujian unit sumber terbuka untuk perangkat lunak yang ditulis dalam bahasa pemrograman PHP. PHPUnit, dibuat oleh Sebastian Bergman, adalah salah satu dari kerangka kerja keluarga xUnit yang dikembangkan dengan SUnit Kent Beck. Artikel ini secara khusus membahas PHPUnit sebagai cara untuk memperkenalkan dasar-dasar pengujian unit otomatis. Anda memerlukan pemahaman dasar tentang bahasa pemrograman PHP untuk melanjutkan!

Pengarang: Kendrick Curtis, Perangkat Lunak Stainless, http://www.stainless-software.com/

Perkenalan

Pengujian unit adalah proses pengujian objek kode diskrit—seperti fungsi, kelas, atau metode—menggunakan kode pengujian khusus atau menggunakan kerangka pengujian yang sudah ada sebelumnya seperti JUnit, PHPUnit, atau Cantata++. Kerangka kerja pengujian unit menyediakan serangkaian fungsi umum dan berguna untuk menulis pengujian unit otomatis, seperti pernyataan untuk memeriksa apakah nilai yang diberikan sesuai dengan yang diharapkan, dan sering menyertakan laporan cakupan garis dan keputusan untuk memberi tahu Anda berapa banyak basis kode yang Anda miliki.

Instalasi

PHPUnit tersedia sebagai paket PEAR, paket Composer, atau sebagai file PHAR. Bagaimanapun Anda menginstalnya, Anda juga harus menginstal dependensi pembungkus kode PHP terlebih dahulu. Di PEAR, Anda perlu menambahkan saluran phpunit.de dan kemudian menginstal dua paket dari baris perintah:

Pengujian unit PHP dengan PHPUnit

(Perhatikan bahwa pada saat penulisan, instalasi PEAR default dengan XAMPP rusak: Anda perlu mendapatkan PEAR PHAR dan menginstalnya dari baris perintah sebelum melakukan hal di atas).

Uji kelas sederhana

Pertimbangkan kelas PHP yang sangat sederhana dengan satu metode:

class TruthTeller
{
public function() tellTruth
{
return true;
}
}

Tentu, tellTruth selalu mengembalikan true sekarang, tapi bagaimana kita bisa mengujinya dengan unit test untuk memastikannya selalu mengembalikan hasil ini di masa mendatang?

Dengan PHPUnit, setiap rangkaian pengujian adalah kelas yang diperluas dari kelas PHPUnit_Framework_TestCase, yang menyediakan fungsi utilitas umum seperti pernyataan. Berikut adalah tes dasar untuk metode tellTruth di atas:

require_once 'PHPUnit/Autoload.php';
require_once 'TruthTeller.class.php';
class TruthTester extends PHPUnit_Framework_TestCase
{
function testTruthTeller()
{
$tt = new TruthTeller();
$this->assertTrue($tt->tellTruth());
}
}

Perhatikan bahwa Anda harus menyertakan autoloader PHPUnit dan “objek yang diuji” dalam hal ini, file kelas TruthTeller.

Yang kita lakukan dengan sisa kode adalah mengatakan bahwa jika metode tellTruth dipanggil, itu akan mengembalikan nilai true. Pernyataan-pernyataan ini adalah inti dari PHPUnit – pernyataan-pernyataan inilah yang menentukan lulus atau gagalnya sebuah tes.

Jika Anda ingin menjalankan baris perintah, buka direktori dengan pengujian Anda dan jalankan phpunit TruthTester (parameter nama file adalah file pengujian Anda, minus ekstensi php), PHPUnit akan menjalankan semua pengujian yang dapat dilakukan. Temukan di file yang ditentukan (tes adalah metode apa pun yang dimulai dengan kata “tes”).

Pengujian unit PHP dengan PHPUnit

Dan jika Anda kembali ke kelas TruthTeller dan mengembalikannya ke FALSE, Anda akan melihat sesuatu seperti ini:

Pengujian unit PHP dengan PHPUnit
Ini adalah inti dari pengujian unit – menulis pernyataan yang lulus atau gagal. Ketika pernyataan yang diverifikasi sebelumnya gagal dalam uji coba berikutnya, Anda tahu bahwa perubahan kode telah dilakukan yang berdampak buruk pada kode Anda yang ada.

Tes yang lebih kompleks

Pada kenyataannya, tentu saja, Anda akan menghadapi situasi yang jauh lebih rumit daripada situasi di atas. Tes umum adalah untuk memeriksa apakah suatu metode mengembalikan array data dari struktur tertentu.

class ArrayTeller
{
public function outputArray()
{
return array(1,2,3);
}
}

Tes sederhana untuk metode ini mungkin sebagai berikut:

class ArrayTester extends PHPUnit_Framework_TestCase
{
function testArrayTeller()
{
$at = new ArrayTeller();
$result = $at->outputArray(1);
$this->assertInternalType("array", $result);
$this->assertCount(3, $result);
$this->assertEquals(1, $result[0]);
$this->assertEquals(3, $result[2]);
}
}

Seperti yang Anda lihat, ada banyak hal yang dapat diperiksa dengan pengujian unit dengan satu baris kode di PHPUnit: kita dapat memeriksa bahwa ArrayTeller mengembalikan array daripada tipe data lainnya, kita dapat memeriksa panjangnya. array dan kita dapat memeriksa nilai individual dalam array. Bergantung pada kebutuhan Anda, harus ada pernyataan untuk dicocokkan, dan jika Anda memerlukan sesuatu yang lebih kompleks—misalnya, Anda ingin memastikan nilai kembalian berada dalam kisaran dua bilangan bulat—selama Anda dapat menyatakannya sebagai hasilnya . Anda dapat menguji pernyataan if dengan assertTrue. Periksa dokumentasi PHPUnit untuk daftar semua pernyataan yang tersedia.

Uji jalur kode

Pengujian unit sebagian adalah tentang menulis pengujian yang mencakup perilaku yang diharapkan dari metode yang diuji, lebih disukai dengan mengacu pada dokumen spesifikasi, tetapi jika Anda menulis pengujian untuk mencakup kode yang ada, ada gunanya menulis pengujian unit sebagai bentuk out- of-the-box Pertimbangkan putih. Pengujian. Jika Anda tahu bahwa suatu metode adalah sakelar sederhana seperti ini:

class Switcher
{
public function aOrB($switch, $a, $b)
{
if ($switch == TRUE)
{
return $a;
}
else
{
return $b;
}
}
}

… maka Anda tahu Anda ingin menulis dua tes, satu untuk setiap kasus. Tetapi Anda harus bertanya bagaimana Anda mengetahui hal ini – jika metode ini berubah di masa mendatang dan mengembalikan $a untuk true, $b untuk false, dan melempar pengecualian jika tidak, idealnya harus ada dalam dokumen spesifikasi di suatu tempat. . Bagaimanapun, tes di atas adalah sebagai berikut:

class SwitcherTester extends PHPUnit_Framework_TestCase
{
function testSwitchTrue()
{
$switcher = new Switcher();
$result = $switcher->aOrB(TRUE, 1, 2);
$this->assertEquals(1, $result);
}
function testSwitchFalse()
{
$switcher = new Switcher();
$result = $switcher->aOrB(FALSE, 1, 2);
$this->assertEquals(2, $result);
}
}

Menjalankan kedua pengujian semudah menjalankan phpunit SwitcherTester dari baris perintah.

Gunakan setup untuk menyederhanakan beberapa pengujian

Karena pengujian Anda perlu mencakup lebih banyak kombinasi masukan dan kumpulan data, ada gunanya untuk mulai mengandalkan fungsi praktis: setUp. setUp adalah metode kelas PHPUnit_Framework_TestCase yang dapat Anda ganti untuk menyediakan kode yang berjalan sebelum setiap pengujian di kelas. (Catatan: ada metode serupa, tearDown, yang dijalankan segera setelah setiap pengujian – ini benar-benar hanya berguna untuk hal-hal seperti menutup soket dan penunjuk file).

Contoh sederhana tentang bagaimana ini dapat menyederhanakan kode Anda adalah sebagai berikut. Pertimbangkan metode yang bergantung pada beberapa data objek dan input:

class DataTeller
{
private $data;
public function __construct($data)
{
$this->data = $data;
}
public function outputData($switch)
{
if ($switch == TRUE)
{
if (!empty($this->data))
return $this->data;
else
return FALSE;
}
else
{
return "switch off";
}
}
}

Jika kami melanjutkan dengan rencana sederhana kami di atas, kami akan menulis tiga pengujian di setiap pengujian dan memberi contoh tiga objek DataTeller. Namun, dengan setUp, kami dapat mengalihdayakan pembuatan DataTellers untuk setidaknya 2 dari 3 kasus. Ini adalah satu-satunya tes terakhir yang membutuhkan pembuatan DataTeller baru.

class DataTellerTester extends PHPUnit_Framework_TestCase
{
private $dt;
protected $data = "valid data";
function setUp()
{
$this->dt = new DataTeller($this->data);
}
function testOutputArraySwitchOff()
{
$this->assertEquals("switch off", $this->dt->outputData(FALSE));
}
function testOutputArraySwitchOn()
{
$this->assertEquals($this->data, $this->dt->outputData(TRUE));
}
function testOutputArrayEmptySwitchOn()
{
$new_dt = new DataTeller("");
$this->assertEquals(FALSE, $new_dt->outputData(TRUE));
}
}

Hasil

PHPUnit menggunakan pernyataan untuk memberi tahu Anda jika kode Anda berfungsi seperti yang diharapkan. Anda sekarang seharusnya dapat menulis beberapa tes sederhana untuk menutupi kelas dengan fungsionalitas yang cukup independen. Namun, tantangan sebenarnya adalah saat menggunakan kelas yang berinteraksi satu sama lain. Simak lain kali untuk mempelajari cara menulis pengujian untuk kelas statis, dan cara menggunakan mock dan stub untuk mengisolasi objek pengujian Anda dari kode lain di lingkungannya.

Baca selengkapnya

* Panduan PHPUnit
* Pelatihan PHPUnit di situs PEAR

Tentang Penulis

Kendrick Curtis adalah pengembang web dengan pengalaman sepuluh tahun. Dia adalah salah satu pendiri Stainless Software, sebuah perusahaan desain, pengembangan, pengujian, dan produksi konten independen. Informasi lebih lanjut di http://www.stainless-software.com/

[ad_2]

Source link

Leave a Reply

Your email address will not be published. Required fields are marked *