Panduan Pemula untuk Pengujian Unit: Apa itu Pengujian Unit?
Indonesian (Bahasa Indonesia) translation by Taufan Prasetyo Basri (you can also view the original English article)
Tergantung pada latar belakang Anda, Anda mungkin atau mungkin tidak pernah mendengar tentang pengujian unit, pengembangan berbasis tes, pengembangan berdasarkan perilaku, atau beberapa jenis metodologi pengujian lainnya. Sering kali, metodologi ini diterapkan dalam konteks sistem perangkat lunak atau aplikasi yang lebih besar dan kurang dalam konteks proyek berbasis WordPress (meskipun sudah semakin baik!)
Terus terang, komunitas pengembangan sedikit terbagi pada pengujian perangkat lunak otomatis - Anda memiliki beberapa orang yang berpikir Anda harus memiliki tes untuk 100% dari semua kode Anda, beberapa percaya bahwa 80% cukup, sekitar 50%, dan beberapa konten dengan 20% atau lebih. Apa pun yang mungkin terjadi, artikel ini bukan tentang berdebat kasus untuk tingkat tes Anda harus dalam proyek Anda juga itu mengambil posisi pada pengujian perangkat lunak umum.
Sebaliknya, kita akan melihat apa yang diperlukan untuk mendapatkan dan menjalankan dengan unit pengujian proyek-proyek pembangunan WordPress Anda. Kita akan mendekati seri ini dari perspektif pemula mutlak agar kita dapat memahami manfaat pengujian unit dan cara mengkonfigurasi lingkungan kita untuk mendukung perpustakaan pengujian unit sehingga kita dapat mulai melakukan hal ini dalam pekerjaan masa depan kita. Akhirnya, Semua ini akan dilakukan dengan membangun dan menguji plugin sederhana, diuji dari tanah.
Apa itu Pengujian Unit?
Sebelum kita mulai mengatur lingkungan kita dan menulis kode apa pun, mari kita tentukan secara persis apa pengujian unit, mengapa hal itu layak dilakukan, dan bagaimana memulainya dalam menggabungkannya dalam proyek-proyek kami.
Pada tingkat tinggi, pengujian unit mengacu pada praktik pengujian fungsi dan area tertentu - atau unit - dari kode kami. Ini memberikan kita kemampuan untuk memverifikasi bahwa fungsi kita bekerja seperti yang diharapkan. Itu adalah untuk mengatakan bahwa untuk setiap fungsi dan diberi satu set input, kita dapat menentukan apakah fungsi kembali nilai-nilai yang tepat dan akan anggun menangani kegagalan selama eksekusi harus disediakan input tidak valid.
Pada akhirnya, ini membantu kami mengidentifikasi kegagalan dalam algoritme dan / atau logika kami untuk membantu meningkatkan kualitas kode yang menyusun fungsi tertentu. Ketika Anda mulai untuk menulis lebih banyak dan lebih tes, Anda akan menciptakan sebuah suite tes bahwa Anda dapat menjalankan setiap saat selama pengembangan terus memverifikasi kualitas pekerjaan Anda.
Keuntungan kedua mendekati pengembangan dari perspektif pengujian unit adalah bahwa Anda akan mungkin menulis kode yang mudah untuk menguji. Karena pengujian unit memerlukan bahwa kode Anda akan dengan mudah dapat diuji, itu berarti bahwa kode Anda harus mendukung jenis tertentu dari evaluasi. Dengan demikian, Anda lebih mungkin untuk memiliki jumlah yang lebih tinggi lebih kecil, lebih fokus fungsi yang menyediakan operasi yang satu pada satu set data daripada besar fungsi yang melakukan sejumlah operasi yang berbeda.
Keuntungan ketiga untuk menulis padat unit test dan teruji kode adalah bahwa Anda dapat mencegah perubahan masa depan dari melanggar fungsi. Karena Anda menguji kode Anda ketika Anda memperkenalkan fungsi Anda, Anda akan mulai mengembangkan sebuah suite uji kasus yang dapat dijalankan setiap kali Anda bekerja pada logika Anda. Ketika terjadi kegagalan, Anda tahu bahwa Anda memiliki sesuatu untuk alamat.
Tentu saja, ini datang dengan mengorbankan menginvestasikan waktu untuk menulis sebuah suite tes awal dalam pembangunan, tetapi sebagai proyek tumbuh Anda hanya dapat menjalankan tes yang Anda telah dikembangkan untuk memastikan bahwa fungsi yang ada tidak rusak ketika fungsi baru diperkenalkan.
Perencanaan kami Plugin
Salah satu cara terbaik untuk memulai dengan pengujian unit adalah untuk melakukannya dalam konteks aplikasi praktis. Seluruh dua bagian seri ini kita akan membangun sebuah plugin sederhana dan menulis tes untuk mencakup semua fungsi.
Pertama, mari kita rencana proyek: kita akan menulis sebuah plugin kecil yang akan menambahkan pesan sederhana di atas satu posting yang menyambut pengguna berdasarkan bagaimana mereka telah menemukan posting blog tertentu. Ide ini sangat mirip dengan pembaca Selamat datang tapi itu tidak termasuk dekat fungsi sebanyak-kita hanya sedang membangun demo untuk mempelajari seluk-beluk pengujian.
Anyway, di sini adalah bagaimana plugin akan bekerja:
- Jika pengguna menavigasi ke situs dari Google, kami akan memberikan pesan unik
- Jika pengguna menavigasi ke situs dari Twitter, kami akan memberikan pesan unik
- Jika tidak, kami tidak akan menampilkan apa-apa
Sederhana saja, kan? Ini juga akan menyediakan landasan untuk menambahkan pesan kustom untuk layanan lainnya dan memperluas unit kami pengujian kemampuan untuk melakukannya.
Mempersiapkan lingkungan
Dalam rangka untuk unit test kode kita, kita akan membutuhkan sebuah perpustakaan pihak ketiga yang kami sertakan ke proyek kami yang benar-benar akan mengeksekusi tes kita menulis. Dalam seri ini, kita akan menggunakan PHPUnit. Anda dapat mengambil salinan di sini.
Selanjutnya, kita perlu menyiapkan lingkungan pengembangan kami, tulisan rintisan keluar plugin kami dan termasuk Perpustakaan diperlukan untuk pengujian kode kita. Artikel ini mengasumsikan bahwa Anda sudah memiliki instalasi WordPress yang fungsional dan berjalan.
Jadi, pertama, mari kita Siapkan direktori plugin:
- Dalam /wp-content/plugins membuat sebuah direktori yang disebut Halo-pembaca
- Dalam direktori Halo-Reader, buat file bernama plugin.php dan direktori yang disebut tes
- Kita akan tulisan rintisan keluar plugin untuk memastikan bahwa WordPress adalah benar melihat proyek kami
- Kita akan mengimpor unit pengujian Perpustakaan sehingga kita dapat mulai menulis kami tes
Berikut adalah kerangka untuk plugin yang kami akan membuat:
1 |
/*
|
2 |
Plugin Name: Hello Reader
|
3 |
Plugin URI: https://github.com/tommcfarlin/Hello-Reader
|
4 |
Description: A simple plugin used to help demonstrate unit testing in the context of WordPress.
|
5 |
Version: 1.0
|
6 |
Author: Tom McFarlin
|
7 |
Author URI: http://tom.mcfarl.in
|
8 |
Author Email: tom@tommcfarlin.com
|
9 |
License:
|
10 |
|
11 |
Copyright 2012 Tom McFarlin (tom@tommcfarlin.com)
|
12 |
|
13 |
This program is free software; you can redistribute it and/or modify
|
14 |
it under the terms of the GNU General Public License, version 2, as
|
15 |
published by the Free Software Foundation.
|
16 |
|
17 |
This program is distributed in the hope that it will be useful,
|
18 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
19 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
20 |
GNU General Public License for more details.
|
21 |
|
22 |
You should have received a copy of the GNU General Public License
|
23 |
along with this program; if not, write to the Free Software
|
24 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
25 |
|
26 |
*/
|
27 |
// Only create an instance of the plugin if it doesn't already exists in GLOBALS
|
28 |
if( ! array_key_exists( 'hello-reader', $GLOBALS ) ) { |
29 |
|
30 |
class Hello_Reader { |
31 |
|
32 |
function __construct() { |
33 |
|
34 |
} // end constructor |
35 |
|
36 |
} // end class |
37 |
|
38 |
// Store a reference to the plugin in GLOBALS so that our unit tests can access it
|
39 |
$GLOBALS['hello-reader'] = new Hello_Reader(); |
40 |
|
41 |
} // end if |
Pada titik ini, Anda harus dapat untuk menavigasi ke "Plugin" di WordPress Dashboard Anda dan melihat entri untuk "Halo pembaca." Jelas, plugin ini tidak melakukan apa-apa hanya belum -kita akan berfokus pada yang (serta mengapa kami sedang memanfaatkan $GLOBALS array) dalam artikel berikutnya.
Akhirnya, mari kita setup kerangka pengujian sehingga kami akan mampu menulis kami tes. Pertama, kita akan perlu untuk menginstal PHPUnit dan kemudian kita akan perlu menginstal WordPress tes.
Catatan: Bagian berikutnya akan membutuhkan melakukan beberapa pekerjaan dengan terminal dan mungkin akan membutuhkan bahwa Anda masalah beberapa perintah untuk membuat link simbolik. Saya sudah berusaha untuk membuat ini sederhana dan mudah mungkin, tetapi setiap sistem operasi dan konfigurasi akan berbeda. Ikuti dengan hati-hati dan saya mengundang Anda untuk berbagi petunjuk untuk sistem operasi Anda di komentar.
Instalasi PHPUnit
PHPUnit adalah kerangka pengujian unit paket khusus untuk PHP. Tes WordPress dan kerangka bahwa kita akan menggunakan untuk menulis kami tes WordPress tergantung pada hal ini. Sayangnya, pemasangan bervariasi berdasarkan pada platform Anda. Saat ini saya menjalankan Mac OS X Lion dengan MAMP Pro dan PHP 5.3.6. Jika Anda menjalankan platform yang berbeda, pastikan untuk merujuk ke dokumentasi dan / atau merasa bebas untuk membagikan langkah Anda di komentar.
Pertama buka terminal dan perbarui pir (ini adalah fasilitas yang akan kami gunakan untuk menginstal PHPUnit):
$ cd /Applications/MAMP/bin/php/php5.3.6/bin$ sudo ./pear memutakhirkan pir
Selanjutnya, instruksikan Pear untuk menggunakan repositori yang akan kami tentukan di terminal:
$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear config-set auto_discover 1
Setelah itu, pasang Pear dengan mengeluarkan perintah berikut:
$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear menginstal pear.phpunit.de/PHPUnit
Ini akan menginstal PHPUnit dalam konteks instalasi MAMP. Untuk menguji itu, jalankan perintah berikut di sesi terminal:
$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit - versi
Setelah pesan berikut harus ditampilkan:
PHPUnit 3.6.11 oleh Sebastian Bergmann.
Catatan: Jika Anda mendapatkan kesalahan terminal yang menyebutkan "unserialize ()", lalu ada perbedaan antara konfigurasi pir dan versi pir. Untuk mengatasi, mengeluarkan perintah berikut (ini hanya mengganti nama file jika Anda ingin mengembalikannya nanti):
$ /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf.old
Menginstal WordPress tes
Sekarang bahwa kita punya PHPUnit terinstal dan bekerja, itu adalah waktu untuk men-setup WordPress kerangka pengujian. Anda dapat mengambil paket dari GitHub. Jika Anda merasa nyaman kloning repositori, maka jangan ragu untuk melakukannya. Jika tidak, cukup download arsip proyek dan ekstrak ke direktori tes yang kita buat sebelumnya dalam artikel ini.
Sebelum benar-benar menjalankan tes, kita akan perlu untuk membuat file config untuk menjalankan tes WordPress. Ini adalah persis seperti mengedit file wp-config.php dengan instalasi WordPress baru, tetapi kita melakukannya untuk tes database sebagai gantinya. Di bawah ini, saya telah menyisipkan file konfigurasi saya dan telah menambahkan komentar. Aku akan pastikan untuk melakukan ini untuk artikel ini GitHub repositori, terlalu.
1 |
/* Path to the WordPress codebase in relation to the location of these tests. Since they are included with our plugin, we refer to a few directories above. */
|
2 |
define( 'ABSPATH', '../../../../../' ); |
3 |
|
4 |
/* The name of the database for running the tests. Make sure this is a database just for testing as it's created and trashed during tests. */
|
5 |
define( 'DB_NAME', 'throwaway' ); |
6 |
|
7 |
/* The usual credentials for a local database. */
|
8 |
define( 'DB_USER', 'root' ); |
9 |
define( 'DB_PASSWORD', '' ); |
10 |
define( 'DB_HOST', 'localhost' ); |
11 |
define( 'DB_CHARSET', 'utf8' ); |
12 |
define( 'DB_COLLATE', '' ); |
13 |
|
14 |
define( 'WPLANG', '' ); |
15 |
define( 'WP_DEBUG', true ); |
16 |
define( 'WP_DEBUG_DISPLAY', true ); |
17 |
|
18 |
define( 'WP_TESTS_DOMAIN', 'localhost' ); |
19 |
define( 'WP_TESTS_EMAIL', 'tom@tommcfarlin.com' ); |
20 |
define( 'WP_TESTS_TITLE', 'Test Blog' ); |
21 |
|
22 |
/* Not worried about testing networks or subdomains, so setting to false. */
|
23 |
define( 'WP_TESTS_NETWORK_TITLE', 'Test Network' ); |
24 |
define( 'WP_TESTS_SUBDOMAIN_INSTALL', false ); |
25 |
$base = '/'; |
26 |
|
27 |
/* Cron tries to make an HTTP request to the blog, which always fails, because tests are run in CLI mode only */
|
28 |
define( 'DISABLE_WP_CRON', true ); |
29 |
|
30 |
/* Also not interested in testing multisite for this project, so setting to false. */
|
31 |
define( 'WP_ALLOW_MULTISITE', false ); |
32 |
if ( WP_ALLOW_MULTISITE ) { |
33 |
define( 'WP_TESTS_BLOGS', 'first,second,third,fourth' ); |
34 |
}
|
35 |
if ( WP_ALLOW_MULTISITE && !defined('WP_INSTALLING') ) { |
36 |
define( 'SUBDOMAIN_INSTALL', WP_TESTS_SUBDOMAIN_INSTALL ); |
37 |
define( 'MULTISITE', true ); |
38 |
define( 'DOMAIN_CURRENT_SITE', WP_TESTS_DOMAIN ); |
39 |
define( 'PATH_CURRENT_SITE', '/' ); |
40 |
define( 'SITE_ID_CURRENT_SITE', 1); |
41 |
define( 'BLOG_ID_CURRENT_SITE', 1); |
42 |
}
|
43 |
|
44 |
$table_prefix = 'wp_'; |
Untuk memverifikasi bahwa Anda telah menginstal tes dengan benar, Anda dapat menjalankan perintah berikut dalam Terminal:
$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit semua
Jika Anda mendapatkan error, hal ini karena tes WordPress mencoba menggunakan soket untuk MySQL database daripada salah satu yang digunakan oleh MAMP. Untuk memperbaiki ini, kita perlu membuat symlink dari soket MAMP's ke lokasi pada disk yang menggunakan unit test. Mengeluarkan perintah berikut di sesi terminal:
1 |
$ sudo mkdir /var/mysql |
2 |
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock |
3 |
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock |
Sekarang, upaya untuk menjalankan tes lagi dan Anda harus melihat sesuatu seperti screenshot berikut.



Sekali lagi, Anda mungkin berbeda berdasarkan pada platform yang menggunakan Anda sehingga merasa bebas untuk berbagi pengalaman Anda di komentar atau bahkan berkomitmen untuk file README GitHub serta sehingga orang lain dapat memiliki titik acuan.
Pada titik ini, kita sudah siap untuk mulai membangun plugin kami dan menulis unit test. Kode di atas telah ditambahkan ke GitHub dan aku akan membangun keluar saat kami bekerja melalui artikel berikutnya dalam seri. Sementara itu, pastikan bahwa Anda mendapatkan Anda setup lingkungan dan bahwa Anda siap untuk memulai pembangunan. Dalam artikel berikutnya, kami akan benar-benar mulai menulis tes, membangun plugin kami, dan melihat seluruh proyek datang bersama-sama dari awal sampai akhir.