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 = 'fred@fredsdomain.com';
$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?
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 / atau setUp
tidak dilakukan dengan benar.
DataProvider
(itu adalah fungsi yang menawarkan input sebagai parameter untuk tes).