Saya telah menulis sebuah kelas yang mengelola penerima di daftar MailChimp, yang disebut MailChimpRecipient. Ini menggunakan kelas MCAPI, yang merupakan pembungkus API pihak ketiga.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Saya melewatkan objek MCAPI ke konstruktor objek MailChimpRecipient, jadi saya telah menulis unit test menggunakan PHPUnit yang menguji semua logika di kelas saya sendiri (saya tidak menguji kelas MCAPI). Saya memiliki cakupan kode 100% dan semua tes lulus. Ini dilakukan dengan mengejek dan mematikan objek MCAPI.
Langkah saya selanjutnya adalah menulis tes integrasi, juga menggunakan PHPUnit, di mana saya akan membuat fixture MailChimpRecipient menggunakan objek MCAPI nyata, yang diatur untuk menggunakan daftar MailChimp yang asli.
Saya telah menulis apa yang saya pikir merupakan tes integrasi, yang pada dasarnya menjalankan tes terhadap antarmuka publik objek, seperti:
public function testAddedRecipientCanBeFound()
{
$emailAddress = '[email protected]';
$forename = 'Fred';
$surname = 'Smith';
// First, delete the email address if it is already on the list
$oldRecipient = $this->createRecipient();
if($oldRecipient->find($emailAddress))
{
$oldRecipient->delete();
}
unset($oldRecipient);
// Add the recipient using the test data
$newRecipient = $this->createRecipient();
$newRecipient->setForename($forename);
$newRecipient->setSurname($surname);
$newRecipient->setEmailAddress($emailAddress);
$newRecipient->add();
unset($newRecipient);
// Assert that the recipient can be found using the same email address
$this->assertTrue($this->_recipient->find($emailAddress));
}
Tes "integrasi" tidak menguji salah satu internal kelas - itu hanya memastikan bahwa diberikan objek MCAPI nyata, itu berperilaku seperti yang diiklankan.
Apakah ini benar? Apakah ini cara terbaik untuk menjalankan tes intergasi? Bagaimanapun, bagian dalam telah diuji dengan unit test. Apakah saya benar dalam berpikir bahwa tes integrasi ada untuk menguji apakah itu benar-benar berfungsi, sesuai dengan cara perilakunya diiklankan?
Untuk mengambil langkah lebih jauh, kelas MailChimpRecipient mengimplementasikan antarmuka, yang juga akan diimplementasikan oleh kelas lain. Idenya adalah menggunakan pabrik untuk mengirimkan berbagai jenis objek penerima milis ke kode saya, yang semuanya melakukan hal yang sama, walaupun menggunakan penyedia milis yang berbeda. Karena tes integrasi saya menguji antarmuka itu, bagaimana menggunakannya untuk semua kelas yang mengimplementasikan antarmuka? Kemudian, di masa depan, jika saya merancang kelas baru untuk digunakan secara bergantian, saya dapat menjalankan tes integrasi yang sama sebelum memasukkannya ke dalam proyek.
Apakah ini masuk akal? Tes unit menguji internal suatu objek, tes intergrasi memastikan bahwa itu berperilaku seperti yang diiklankan?
sumber
setUp
fungsi untuk membangun alasan untuk menjalankan tes Anda. Jika input tidak ditentukan, Anda tidak dapat benar-benar menguji. Masukan harus tepat, ketat dan selalu sama. Jika prasyarat tes tidak terpenuhi, lewati saja tes. Kemudian menganalisis mengapa lompatan dan jika Anda perlu menambahkan tes tambahan dan / atausetUp
tidak dilakukan dengan benar.DataProvider
(itu adalah fungsi yang menawarkan input sebagai parameter untuk tes).Jawaban:
Saat menguji kode Anda, Anda harus memperhatikan tiga bidang:
Biasanya jumlah tes yang Anda miliki di setiap kategori akan memiliki bentuk piramida, yang berarti banyak tes unit di bagian bawah, beberapa tes fungsional di tengah, dan hanya beberapa tes skenario.
Dengan unit test Anda mengejek segala sesuatu yang digunakan kelas yang diuji dan Anda mengujinya dalam isolasi murni (inilah mengapa penting untuk memastikan bahwa di dalam kelas Anda Anda mengambil semua dependensi melalui injeksi sehingga mereka dapat diganti dengan tes).
Dengan pengujian unit Anda menguji semua kemungkinan, jadi tidak hanya 'jalan bahagia' tetapi juga semua kondisi kesalahan.
Jika Anda benar-benar yakin bahwa semua unit Anda bekerja dalam isolasi Anda menulis beberapa tes (tes fungsional) untuk memastikan unit juga bekerja ketika digabungkan. Kemudian Anda menulis tes skenario, yang menguji kabel antara semua modul fungsional.
Misalnya, Anda sedang menguji mobil.
Anda dapat merakit seluruh mobil dan sebagai pengemudi memeriksa setiap kondisi yang mungkin tetapi itu akan sangat sulit dilakukan.
Sebagai gantinya Anda akan menguji sebagian kecil mesin dengan semua kemungkinan (uji unit)
Kemudian Anda menguji seluruh mesin (terpisah dari mobil) yang akan menjadi tes fungsional.
Sebagai tes terakhir, Anda memasukkan kunci Anda, menyalakan mobil dan mengendarainya ke tempat parkir. Jika itu berfungsi maka Anda tahu bahwa semua bagian (baterai, bahan bakar, mesin, ..) terhubung dan sejak Anda mengujinya secara terpisah, Anda dapat yakin bahwa seluruh mobil berfungsi dengan benar.
Jadi, dalam kasus Anda, Anda menguji semua kondisi kesalahan dan jalur bahagia dalam pengujian unit Anda dan tahu Anda hanya perlu melakukan tes ujung ke ujung dengan 'komponen nyata' untuk memeriksa apakah kabel benar.
Beberapa poin lainnya,
sumber