<更新記録>
2008年 5月 31日
執筆

姉妹サイトから検索 Web検索

SWT - JavaでGUIプログラミング
きままにインデックス
JavaScriptノート
ゴルフ道具研究所

PHPUnit フィクスチャ

XUnitでは、テストの前準備はPHPUnit_Framework_TestCaseクラスのsetUp()メソッドで行い、 後処理はtearDown()メソッドで行います。

PHPUnit_Framework_TestCase {
	protected function setUp();
	protected function tearDown();
}
<?php

require_once 'PHPUnit/Framework.php';

class DBTest extends PHPUnit_Framework_TestCase {

	private $con;
	
	/**
	 * SQLiteのsample.dbファイルのDBに接続
	 */
	protected function setUp() {
		$this->con = new PDO('sqlite:sample.db');
	}

	/**
	 * $conを使ったテストメソッド
	 */
	public function test1() {
		$con = $this->con;
		$stmt = $con->query('SELECT * FROM exampleTable');
		if ($stmt->fetch() === FALSE) {
			$this->fail();
		}
	}
	
	/**
	 * $conを使ったテストメソッド
	 */
	public function test2() {
		$con = $this->con;
		$stmt = $con->query('エラーになるSQL文');
		$this->assertEquals(FALSE, $stmt);
	}
	
	/**
	 * DBを切断
	 */
	protected function tearDown() {
		unset($this->con);
	}
}

?>
  • setUp()メソッドが実行される
  • test1()メソッドが実行される
  • tearDown()メソッドが実行される
  • setUp()メソッドが実行される
  • test2()メソッドが実行される
  • tearDown()メソッドが実行される

例えば、DBへの接続が必要なテストの場合、DBへの接続処理をsetUp()メソッドに、 切断処理をtearDown()メソッドに記述するといった使い方ができます。

setUp()メソッドとtearDown()メソッドは、テストケース毎に実行されます。

上記サンプルでは、テスト用のメソッドが実行されるたびにsetUp()メソッドとtearDown()メソッドが呼ばれますが、 わざわざテスト1つ1つでDB接続をしなおす必要もありません。
そこで、PHPUnit_Framework_TestCaseを継承する代わりに、PHPUnit_Framework_TestSuiteクラスを継承することで、 setUp()メソッドとtearDown()メソッドは、テストケース毎に実行されるのではなく、 setUp()メソッドはすべてのテストケースの最初に1度だけ実行され、 tearDown()メソッドはすべてのテストケースの最後に1度だけ実行されるようになります。

はずなのですが・・・テストケース毎に呼ばれています。

<?php

require_once 'PHPUnit/Framework.php';

class DBTest extends PHPUnit_Framework_TestSuite {
	
	/**
	 * SQLiteのsample.dbファイルのDBに接続
	 */
	protected function setUp() {
		$this->sharedFixture = new PDO('sqlite:sample.db');
		echo 'setUp()' . "\n";
	}

	/**
	 * $conを使ったテストメソッド
	 */
	public function test1() {
		$con = $this->sharedFixture;
		$stmt = $con->query('SELECT * FROM exampleTable');
		if ($stmt->fetch() === FALSE) {
			$this->fail();
		}
	}
	
	/**
	 * $conを使ったテストメソッド
	 */
	public function test2() {
		$con = $this->sharedFixture;
		$stmt = $con->query('エラーになるSQL文');
		$this->assertEquals(FALSE, $stmt);
	}
	
	/**
	 * DBを切断
	 */
	protected function tearDown() {
		unset($this->sharedFixture);
		echo 'tearDown()' . "\n";
	}
}

?>

Powered by VeryEasyCMS