Panduan Pemula untuk Pengujian Unit: Membangun Plugin yang Dapat Diuji
Indonesian (Bahasa Indonesia) translation by Taufan Prasetyo Basri (you can also view the original English article)
Pada bagian pertama dari seri ini, kami mengambil pandangan tingkat tinggi pada metodologi pengujian dan memberikan beberapa kasus mengapa itu bermanfaat bagi kita untuk mulai melakukan dalam proyek WordPress kami. Kami juga meluangkan waktu untuk menyiapkan PHPUnit dan Pengujian WordPress untuk mulai membuat plugin pertama kami yang dapat diuji.
Dalam artikel terakhir ini, kita akan mendefinisikan metodologi untuk pengujian unit, mulai memasukkannya ke dalam pekerjaan kita, dan pergi dengan plugin yang berfungsi penuh (meskipun sederhana) yang juga memiliki serangkaian tes kecil untuk memastikan bahwa ia bekerja dengan tepat seperti yang diharapkan.
Unit pengujian metodologi
Ketika datang untuk pengujian, umumnya ada dua cara untuk melakukannya:
- Tulis tes Anda, kemudian tulis kode untuk lulus tes Anda
- Menulis kode Anda, kemudian menulis tes yang lulus
Dalam pengalaman saya, pendekatan pertama selalu lebih baik. Memang, ini hampir mustahil untuk dilakukan dalam konteks aplikasi yang sudah ada, tetapi jika Anda mulai dari bawah ke atas – yang merupakan kita – itu adalah pendekatan yang lebih baik dan inilah mengapa: setelah Anda menulis sebuah aplikasi, Anda tahu cara kerjanya. Dengan demikian, itu bisa sangat sulit untuk menulis tes yang peregangan aplikasi ketika Anda secara inheren tahu bagaimana itu seharusnya berfungsi.
Untuk itu, saya merasa lebih baik untuk menulis tes pertama. Dengan cara ini, tes Anda tidak hanya mencakup cara program seharusnya bekerja, tetapi juga menjadi suatu bentuk dokumentasi menampilkan apa fungsi ini dimaksudkan dan pada akhirnya akan menghasilkan kegagalan ketika fungsi tidak berfungsi sebagaimana mestinya.
Dengan itu dalam pikiran, kita akan membangun dengan metodologi sederhana ini:
- Menulis tes dan menjalankannya. Ini jelas akan gagal.
- Menulis kode yang mencoba untuk menyebabkan tes untuk lulus.
- Jika melewati ujian, kita beralih ke fungsi berikutnya; Jika tidak, kami Ulangi proses ini sampai itu berlalu.
Akhirnya, sebagai penyegaran, plugin kami akan memberikan pesan selamat datang khusus untuk pengunjung berdasarkan jika mereka telah diklik melalui ke situs dari Google atau kegugupan. Kita akan juga menulis ini sedemikian rupa bahwa akan lebih mudah untuk memperluas dengan layanan tambahan, jika Anda ingin melakukannya di masa depan.
Membangun sebuah Plugin yang diuji
Pada titik ini, sudah waktunya untuk mulai menulis beberapa code; Namun, tidak seperti kebanyakan proyek, kita tidak akan melompat ke dalam kode WordPress spesifik dulu. Sebaliknya, kita akan tulisan rintisan keluar kelas kami tes unit. Jika Anda telah terstruktur direktori plugin Anda berdasarkan apa yang kita berbagi di posting pertama atau bagaimana kita telah dikonfigurasi pada GitHub, maka Anda harus memiliki file hello_reader_tests.php yang terletak di direktori wordpress/tes-tes Anda. Anda tidak harus mengikuti organisasi itu, tentu saja, tetapi akan membantu seperti yang kita maju melalui proyek.
Mari kita tulisan rintisan keluar kelas eksperimen unit:
1 |
require_once( '../../plugin.php' ); |
2 |
|
3 |
class Hello_Reader_Tests extends WP_UnitTestCase { |
4 |
|
5 |
} // end class |
Sekarang, mencoba untuk menjalankan tes menggunakan dari terminal menggunakan PHP unit. Dengan asumsi bahwa Anda menjalankan PHP unit dari instalasi MAMP lokal Anda, Anda harus dapat masuk:
$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit ./hello_reader_tests.php
Pada titik ini, Anda harus melihat kegagalan:



Itu bagus! Itu berarti PHPUnit diinstal dan berjalan dan bahwa kerangka pengujian WordPress siap untuk pergi. Tes gagal hanya karena kita belum benar-benar menulis tes apapun. Mari kita mulai melakukan hal itu.
Tes Pertama kami
Pertama, mari tulis tes untuk memastikan bahwa plugin kami diinisialisasi, dibuat instance, dan siap untuk diuji. Ingat sebelumnya di artikel pertama bahwa kami menyimpan referensi ke instance Hello Reader ke dalam array PHP $ GLOBALS. Ini adalah bagaimana kita akan mengakses instance tersebut menggunakan kerangka pengujian. Jadi mari perbarui uji unit kami agar terlihat seperti ini:
Perhatikan bahwa demi ruang, saya akan meninggalkan komentar kode tetapi plugin dan tes yang sepenuhnya dikomentari akan tersedia di GitHub.
1 |
require_once( '../../plugin.php' ); |
2 |
|
3 |
class Hello_Reader_Tests extends WP_UnitTestCase { |
4 |
|
5 |
private $plugin; |
6 |
|
7 |
function setUp() { |
8 |
|
9 |
parent::setUp(); |
10 |
$this->plugin = $GLOBALS['hello-reader']; |
11 |
|
12 |
} // end setup |
13 |
|
14 |
function testPluginInitialization() { |
15 |
$this->assertFalse( null == $this->plugin ); |
16 |
} // end testPluginInitialization |
17 |
|
18 |
} // end class |
Di atas, kami telah menyiapkan referensi ke instance plugin sehingga kami dapat mengaksesnya di seluruh pengujian unit kami. Kami menggunakan metode setUp untuk mengambil referensi ke plugin dari $ GLOBAL. Namun, perlu diketahui bahwa kami telah memperkenalkan fungsi lain yang disebut testPluginInitialization. Fungsi ini memverifikasi bahwa referensi yang kami siapkan dalam metode setup tidak nol.
Jika Anda menjalankan kembali tes, Anda sekarang harus mendapatkan tes kelulusan dan terminal Anda akan terlihat seperti ini:



Ada takeaway penting di sini: Perhatikan bahwa fungsi tunggal yang kami berikan di atas memiliki tujuan yang jelas: untuk memverifikasi bahwa plugin telah diinisialisasi dengan benar. Nama fungsinya jelas dan berisi pernyataan pernyataan tunggal. Ini adalah cara yang bagus untuk model kami tes yang tersisa terutama karena itu membuat mudah untuk menemukan bug ketika mereka muncul. Pikirkan cara ini: jika Anda menyertakan sejumlah berbeda menegaskan pernyataan dalam fungsi tunggal, itu akan sulit untuk menentukan yang menegaskan pernyataan gagal.
Fungsi pertama
Sekarang bahwa kita telah mendapatkan diperkenalkan ke bagaimana menulis unit test, menjalankan unit test, dan mengevaluasi bagaimana mereka lulus atau bagaimana mereka gagal, mari kita mulai menerapkan fungsi untuk plugin. Pertama, kita akan perlu untuk men-setup filter untuk konten karena kita akan pergi untuk menambahkan teks ke awal konten. Dalam berikut dengan metodologi yang kita didefinisikan sebelumnya dalam artikel ini, mari kita menulis tes kami pertama.
Tes tertentu ini akan melihat untuk melihat jika kita telah ditambahkan kumpulan teks ke bagian pertama post:
1 |
function testAddWelcomeMessage() { |
2 |
$this->assertEquals( 'TEST CONTENT', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' ); |
3 |
} // end testAddWelcomeMessage |
Jika Anda menjalankan percobaan persis seperti itu, itu bahkan tidak akan gagal-sebaliknya, PHPUnit akan kembali kesalahan fatal karena metode tidak ditetapkan di plugin. Jadi mari kita menambahkan bahwa sekarang. Update plugin untuk terlihat seperti ini:
1 |
class Hello_Reader { |
2 |
|
3 |
function __construct() { |
4 |
add_filter( 'the_content', array( &$this, 'add_welcome_message' ) ); |
5 |
} // end constructor |
6 |
|
7 |
public function add_welcome_message( $content ) { |
8 |
|
9 |
} // end add_welcome_message |
10 |
|
11 |
} // end class |
Mencoba untuk menjalankan tes. Ujian tidak akan bom, tapi Anda harus benar-benar melihat kegagalan bersama dengan pesan yang jelas mengenai mengapa tes gagal:
1 |
1) Hello_Reader_Tests::testAddWelcomeMessage |
2 |
add_welcome_message() appends welcome message to the post content. |
3 |
Failed asserting that null matches expected 'TEST CONTENT' |
Jadi, sesuai dengan metodologi kami, kami ingin membuat tes ini lulus. Untuk melakukannya, kita perlu memastikan bahwa konten tulisan berisi string teks-dalam kasus ini, 'Konten pengujian', untuk membuat hal itu berlalu. Jadi mari kita coba ini. Memperbarui fungsi yang sesuai di plugin untuk menambahkan string sebelum konten:
1 |
public function add_welcome_message( $content ) { |
2 |
return 'TEST CONTENT' . $content; |
3 |
} // end add_welcome_message |
Dan lagi, kami jalankan kembali tes hanya untuk melihat bahwa itu gagal. Jika Anda melihat tes kami, hal ini karena itu adalah mencari untuk melihat sama konten kami string 'Menguji konten'. Sebaliknya, kita perlu memastikan bahwa string dimulai pada konten. Ini berarti bahwa kita perlu memperbarui pengujian kami. Untungnya, PHPUnit memiliki fungsi assertContains. Jadi mari kita Perbarui kode kami untuk menggunakannya:
1 |
function testAddWelcomeMessage() { |
2 |
$this->assertContains( 'TEST CONTENT', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' ); |
3 |
} // end testAddWelcomeMessage |
Sekali lagi, jalankan kembali tes dan Anda akan melihat bahwa tes sekarang lewat. Keren! Sekarang kita perlu untuk menulis pesan kustom untuk orang-orang yang datang dari kegugupan dan orang-orang yang datang dari Google.
Menyambut pengunjung Twitter kami
Ada sejumlah cara yang berbeda yang kita dapat memeriksa untuk melihat bagaimana pengguna telah tiba di halaman tertentu. Kadang-kadang kita dapat memeriksa nilai-nilai di $_GET array, kadang-kadang kita dapat menginterogasi $_SERVER array, atau kadang-kadang kita dapat memeriksa sesi pengguna. Untuk tujuan dari contoh ini, kita akan mencari 'twitter.com' ditemukan dalam $_SERVER ['HTTP_REQUEST']. Saya mengatakan ini hanya supaya kalian dapat mengikuti bersama dengan apa yang kita lakukan dalam kode.
Jadi, pada umumnya, add_welcome_message harus memeriksa untuk melihat jika permintaan datang dari kegugupan dan kemudian menyesuaikan pesan yang tepat. Karena kita berada dalam bisnis pengujian setiap bagian dari fungsi, kita dapat menulis sebuah fungsi yang dapat mengevaluasi jika permintaan datang dari Twitter. Jadi mari kita menulis tes baru:
Di plugin:
1 |
public function is_from_twitter() { |
2 |
|
3 |
} // end is_from_twitter |
Dalam tes:
1 |
function testIsComingFromTwitter() { |
2 |
|
3 |
$_SERVER['HTTP_REFERER'] = 'https://twitter.com'; |
4 |
$this->assertTrue( $this->plugin->is_from_twitter(), 'is_from_twitter() will return true when the referring site is Twitter.' ); |
5 |
|
6 |
} // end testIsComingFromTwitter |
Kami sedang jelas spoofing nilai HTTP_REFERER, tapi tidak apa-apa untuk tujuan dari contoh ini. Titik masih tetap: menjalankan tes, akan gagal, dan jadi kita akan perlu menerapkan fungsi dalam plugin untuk memilikinya lulus:
1 |
public function is_from_twitter() { |
2 |
return strpos( $_SERVER['HTTP_REFERER'], 'twitter.com' ) > 0; |
3 |
} // end is_from_twitter |
Saat menjalankan tes kembali harus sekarang menghasilkan tes lewat. Tapi tunggu-kita perlu menjadi lengkap. Mari kita pastikan bahwa kita jalankan pengujian untuk memastikan bahwa fungsi ini gagal ketika pengarah tidak dari Twitter.
1 |
function testIsNotComingFromTwitter() { |
2 |
|
3 |
// Spoofing the HTTP_REFERER for purposes of this test and the companion blog post
|
4 |
$_SERVER['HTTP_REFERER'] = 'http://facebook.com'; |
5 |
$this->assertFalse( $this->plugin->is_from_twitter(), 'is_from_twitter() will return true when the referring site is Twitter.' ); |
6 |
|
7 |
} // end testIsNotComingFromTwitter |
Perhatikan bahwa kami telah memperbarui HTTP_REFERER dan kami telah mengubah assertTrue to assertFalse. Mengizinkan yang lain benar, jalankan tes dan mereka harus lulus.
Mengulangi sama untuk Google
Memberikan pesan kustom untuk Google akan memerlukan hal yang sama yang kita lakukan untuk berkicau, yaitu spoof HTTP_REFERER dan kemudian kembali true atau false untuk fungsi pembantu. Jadi, untuk menghindari terdengar berlebihan, saya akan menjaga bagian ini sesingkat mungkin. Langkah yang sama harus diikuti seperti untuk Twitter.
Pertama, kita tulisan rintisan fungsi pembantu di plugin:
1 |
public function is_from_google() { |
2 |
|
3 |
} // end is_from_google |
Kemudian kami tulisan rintisan keluar tes:
1 |
function testIsComingFromGoogle() { |
2 |
|
3 |
$_SERVER['HTTP_REFERER'] = 'http://google.com'; |
4 |
$this->assertTrue( $this->plugin->is_from_google(), 'is_from_google() will return true when the referring site is Google.' ); |
5 |
|
6 |
} // end testIsComingFromGoogle |
Menjalankan tes seperti sekarang akan mengakibatkan kegagalan. Jadi, mari kita menerapkan fungsi is_from_google():
1 |
public function is_from_google() { |
2 |
return strpos( $_SERVER['HTTP_REFERER'], 'google.com' ) > 0; |
3 |
} // end is_from_twitter |
Dan sekarang, tes harus lulus. Tapi, sekali lagi, kita perlu menjadi lengkap jadi mari kita menulis tes kegagalan untuk menganggap bahwa fungsi tidak kembali benar ketika pengguna datang dari tempat lain:
1 |
function testIsNotComingFromGoogle() { |
2 |
|
3 |
// Spoofing the HTTP_REFERER for purposes of this test and the companion blog post
|
4 |
$_SERVER['HTTP_REFERER'] = 'http://facebook.com'; |
5 |
$this->assertFalse( $this->plugin->is_from_google(), 'is_from_google() will return true when the referring site is Google.' ); |
6 |
|
7 |
} // end testIsNotComingFromGoogle |
Akhirnya, menjalankan tes Anda. Mengizinkan segala sesuatu yang lain benar, Anda harus memiliki enam lewat tes.
Menariknya semua bersama-sama
Pada titik ini, kami telah mendapat semua yang kita butuhkan untuk mulai menampilkan pesan selamat datang kustom untuk pengguna kami. Satu-satunya hal adalah bahwa kita harus refactor kami pengujian awal yang memeriksa untuk "Tes konten." Sekarang, kita akan perlu memperkenalkan tes untuk kasus-kasus berikut:
- Ketika pengguna datang dari Twitter, kami akan mengatakan "Selamat datang dari Twitter!"
- Ketika pengguna datang dari Google, kami akan mengatakan "Selamat datang dari Google!"
- Ketika pengguna datang dari tempat lain, kita tidak akan menambahkan apa-apa.
Jadi mari kita hapus tes yang kami buat sebelumnya testAddWelcomeMessage di tempat menambahkan tiga tes baru.
Pertama, kami akan menambahkan tes yang memeriksa pesan selamat datang Twitter.
Di plugin, kami akan mengurangi add_welcome_message ke ini:
1 |
public function add_welcome_message( $content ) { |
2 |
return $content; |
3 |
} // end add_welcome_message |
Dan kami akan menambahkan tes Twitter, pertama:
1 |
function testDisplayTwitterWelcome() { |
2 |
|
3 |
// Spoof the HTTP_REFERER for Twitter
|
4 |
$_SERVER['HTTP_REFERER'] = 'http://twitter.com'; |
5 |
$this->assertContains( 'Welcome from Twitter!', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' ); |
6 |
|
7 |
} // end testDisplayTwitterWelcome |
Pada titik ini, ini topi lama, kan? Menjalankannya, tes akan gagal. Menerapkan add_welcome_message agar terlihat seperti ini:
1 |
public function add_welcome_message( $content ) { |
2 |
|
3 |
if( $this->is_from_twitter() ) { |
4 |
$content = 'Welcome from Twitter!' . $content; |
5 |
} // end if |
6 |
|
7 |
return $content; |
8 |
|
9 |
} // end add_welcome_message |
Jalankan itu lagi, dan itu akan berlalu. Selanjutnya adalah menguji Google:
1 |
function testDisplayGoogleWelcome() { |
2 |
|
3 |
// Spoof the HTTP_REFERER for Google
|
4 |
$_SERVER['HTTP_REFERER'] = 'http://google.com'; |
5 |
$this->assertContains( 'Welcome from Google!', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' ); |
6 |
|
7 |
} // end testDisplayGoogleWelcome |
Menjalankan tes, itu gagal, kemudian update add_welcome_message di plugin mengandung cek menggunakan fungsi pembantu kami menulis sebelumnya:
1 |
public function add_welcome_message( $content ) { |
2 |
|
3 |
if( $this->is_from_twitter() ) { |
4 |
$content = 'Welcome from Twitter!' . $content; |
5 |
} else if( $this->is_from_google() ) { |
6 |
$content = 'Welcome from Google!' . $content; |
7 |
} // end if |
8 |
|
9 |
return $content; |
10 |
|
11 |
} // end add_welcome_message |
Pada titik ini, Anda harus memiliki sebuah plugin yang berfungsi penuh yang memiliki tujuh lewat unit test!
Kesimpulan
Seperti yang Anda lihat, pengujian unit memperkenalkan tingkat pengembangan tambahan tetapi dapat membayar secara signifikan dalam kode yang dapat dipelihara, terorganisir dengan baik, dan dapat diuji. Sebagai aplikasi Anda tumbuh, terus menjalankan tes untuk memastikan bahwa proyek Anda bekerja seperti yang diharapkan dapat memberikan potongan pikiran. Tentu saja, ini hanyalah sebuah contoh kecil dari bagaimana pengujian unit bekerja. Menerapkan praktek-praktek ini dapat membayar dalam banyak proyek-proyek yang lebih besar dan/atau rumit.
Akhirnya, Anda dapat menemukan plugin ini, WordPress tes, dan Halo pembaca unit test sepenuhnya berkomentar pada GitHub.