Я написал класс, который управляет получателями в списке 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
(это функция, предлагающая ввод в качестве параметров для теста).