Napisałem klasę, która zarządza adresatami na liście MailChimp, o nazwie MailChimpRecipient. Wykorzystuje klasę MCAPI, która jest zewnętrznym opakowaniem API.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Przekazuję obiekt MCAPI do konstruktora obiektu MailChimpRecipient, więc napisałem testy jednostkowe przy użyciu PHPUnit, które testują całą logikę we własnej klasie (nie testuję klasy MCAPI). Mam 100% pokrycia kodu i wszystkie testy są udane. Odbywa się to przez wyśmiewanie i usuwanie obiektu MCAPI.
Następnym krokiem było napisanie testu integracji, również przy użyciu PHPUnit, w którym zbudowałbym urządzenie MailChimpRecipient przy użyciu prawdziwego obiektu MCAPI, skonfigurowanego do używania prawdziwej listy MailChimp.
Napisałem coś, co moim zdaniem jest testem integracyjnym, który w zasadzie uruchamia testy przeciw publicznemu interfejsowi obiektu, na przykład:
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));
}
Test „integracji” nie testuje żadnych wewnętrznych elementów klasy - po prostu upewnia się, że dany prawdziwy obiekt MCAPI zachowuje się jak w reklamie.
Czy to jest poprawne? Czy to najlepszy sposób na przeprowadzenie testu międzygranicznego? W końcu elementy wewnętrzne zostały przetestowane za pomocą testu jednostkowego. Czy mam rację, myśląc, że test integracji ma na celu sprawdzenie, czy naprawdę działa, zgodnie ze sposobem, w jaki reklamowane jest jego zachowanie?
Aby pójść o krok dalej, klasa MailChimpRecipient implementuje interfejs, który będzie również implementowany przez inne klasy. Chodzi o to, aby użyć fabryki, aby przekazać różne typy obiektów adresatów list mailowych do mojego kodu, które wszystkie robią to samo, chociaż używają różnych dostawców list mailowych. Ponieważ moje testy integracyjne testują ten interfejs, co powiesz na używanie go we wszystkich klasach, które implementują interfejs? Następnie, w przyszłości, jeśli zaprojektuję nową klasę, która będzie używana zamiennie, mogę uruchomić ten sam test integracji przed wstawieniem jej do projektu.
Czy to brzmi rozsądnie? Testy jednostkowe testują wnętrze obiektu, testy integracyjne upewniają się, że zachowuje się jak w reklamie?
setUp
funkcji, aby ustalić podstawy do uruchomienia testów. Jeśli dane wejściowe są niezdefiniowane, to nie można tak naprawdę przetestować. Dane wejściowe muszą być precyzyjne, ścisłe i zawsze takie same. Jeśli warunek wstępny testu nie jest spełniony, zamiast tego pomiń test. Następnie przeanalizuj, dlaczego przeskakuje i czy musisz dodać dodatkowe testy i / lub setUp
nie jest to zrobione dobrze.
DataProvider
(to funkcja oferująca dane wejściowe jako parametry testu).