MailChimpRecipientと呼ばれるMailChimpリストの受信者を管理するクラスを作成しました。サードパーティのAPIラッパーであるMCAPIクラスを使用します。
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
MCAPIオブジェクトをMailChimpRecipientオブジェクトのコンストラクターに渡すため、PHPUnitを使用して、独自のクラスのすべてのロジックをテストする単体テストを作成しました(MCAPIクラスはテストしていません)。コードカバレッジは100%で、すべてのテストに合格しています。これは、MCAPIオブジェクトのモックとスタブ化によって行われます。
次のステップでは、PHPUnitを使用して統合テストを作成し、実際のMCAPIオブジェクトを使用してMailChimpRecipientフィクスチャを構築し、実際の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
(テストへのパラメーターとして入力を提供する関数)できるようにします。