Я написав клас, який керує одержувачами у списку MailChimp, який називається MailChimpRecipient. Він використовує клас MCAPI, який є стороннім обгорткою API.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Я передаю об’єкт MCAPI в конструктор об'єкта MailChimpRecipient, тому я написав тестові одиниці за допомогою PHPUnit, які перевіряють всю логіку в моєму власному класі (я не тестую клас MCAPI). У мене 100% покриття коду і всі тести проходять. Це робиться глузуванням та заглушкою об'єкта MCAPI.
Наступним моїм кроком було написання тесту на інтеграцію, також за допомогою PHPUnit, де я побудував би кріплення MailChimpRecipient за допомогою реального об’єкта MCAPI, створеного для використання реального списку MailChimp.
Я написав те, що, на мою думку, є інтеграційним тестом, який, в основному, виконує тести, пов'язані з публічним інтерфейсом об'єкта, наприклад:
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));
}
Тест "інтеграції" не перевіряє жоден внутрішній клас класу - він просто переконує, що, даючи реальний об'єкт MCAPI, він поводиться так, як рекламується.
Це правильно? Це найкращий спосіб провести тест на інтергацію? Зрештою, внутрішні тести перевірені за допомогою одиничного тесту. Я маю рацію, думаючи, що тест на інтеграцію існує, щоб перевірити, чи справді він працює, відповідно до способів рекламування його поведінки?
Щоб зробити крок далі, клас MailChimpRecipient реалізує інтерфейс, який також буде реалізований іншими класами. Ідея полягає у використанні фабрики для передачі різних типів об’єктів одержувачів списку розсилки до мого коду, які всі роблять те саме, хоча і з використанням різних постачальників списків розсилки. Оскільки мої інтеграційні тести перевіряють цей інтерфейс, як щодо його використання для всіх класів, які реалізують інтерфейс? Тоді, в майбутньому, якщо я сконструюю новий клас, який буде використовуватися безперервно, я можу запустити той же тест інтеграції перед тим, як вставити його в проект.
Це звучить розумно? Одиничні тести перевіряють внутрішні об'єкти, тести на інтеграцію впевнені, що він поводиться так, як рекламується?
setUpфункцією, щоб встановити підстави для запуску ваших тестів. Якщо введення не визначено, добре ви не можете перевірити. Вхід повинен бути точним, суворим і завжди однаковим. Якщо попередня умова тесту не виконується, замість цього пропустіть тест. Потім проаналізуйте, чому це пропускає, і якщо вам потрібно додати додаткові тести та / або setUpце зроблено не правильно.
DataProvider(це функція, що пропонує введення як параметри тесту).