2009年05月21日

SimpleTestその1

SimpleTestをする事にしました。

http://downloads.sourceforge.net/simpletest/simpletest_1.0.1.tar.gz
ダウンロードして、php.iniのinclude_pathの通っているところに置いた。
c:/php/includeがinclude_pathにあったので、

c:/php/include/simpletest/autorun.php

になるように。


まずはこれから。
http://www.simpletest.org/en/start-testing.html

ディレクトリはこんな

[htdocs]/test/simpletest/classes
/test

http://localhost/test/simpletest/test/log_test.php
でブラウザからアクセスできるように。urlがtestだらけだけど。

ログクラス(classes/log.php)のテストをする。
test/log_test.php

<?php
require_once('simpletest/autorun.php');
require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'../classes/log.php');

class TestOfLogging extends UnitTestCase {
}
?>

require_once('../classes/log.php');
だと後でエラーになっちゃったので、このように。


テストケースはSipleTestCaseクラスを継承する。

テストケースを実行すると、"test"で始まるメソッドを探して実行する。

テストの内容を追加する。
test/log_test.php

<?php
require_once('simpletest/autorun.php');
require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'../classes/log.php');

class TestOfLogging extends UnitTestCase {
function testLogCreatesNewFileOnFirstMessage() {
@unlink('c:/tmp/test.log');
$log = new Log('c:/tmp/test.log');
$this->assertFalse(file_exists('c:/tmp/test.log'));
$log->message('Should write this to a file');
$this->assertTrue(file_exists('c:/tmp/test.log'));
}
}
?>


ブラウザでアクセスして赤は失敗、緑は成功。

Fatal error: Failed opening required '../classes/log.php' (include_path='') in /home/marcus/projects/lastcraft/tutorial_tests/Log/tests/log_test.php on line 7
だったら、classes/log.phpが存在しない。

classes/Log.phpを作成する。

<?php
class Log {
function Log($file_path) {
}

function message() {
}
}
?>

ブラウザでアクセスする。赤で失敗。

Logクラスのmessage()メソッドを記述する。
classes/Log.php

<?php
class Log {
function Log($file_path) {
}

function message($message) {
$fp = fopen('c:/tmp/test.log', 'w');
if ($fp === false) {
echo '開きません!';
exit;
}

if (fwrite($fp, $message) === false) {
echo '書き込めません!';
exit;
}
fclose($fp);
}
}

ブラウザでアクセスする。緑になって成功。

次は、テストスイーツを作成してみる。
test/all_tests.php

<?php
require_once('simpletest/autorun.php');

class AllTests extends TestSuite {
function AllTests() {
$this->TestSuite('All tests');
$this->addFile(dirname(__FILE__).DIRECTORY_SEPARATOR.'log_test.php');
}
}

$this->addFile('log_test.php');だと見つからない!ってエラーになっちゃうのでこのように

ブラウザでアクセスする。緑になって成功。

次はモックオブジェクトを使ってみる。

SessionPoolクラスがこんな時、
classes/session_pool.php

<?php
class SessionPool {
function __construct(&$log)
{
$this->_log = $log;
}

function logIn($username)
{
$this->_log->message("User $username logged in.");
}
}

コンストラクタのパラメータで渡されたオブジェクト$logを使っているわけです。

テストはこちら。
session_pool_test.php

<?php
require_once('simpletest/autorun.php');
require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'../classes/log.php');
require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'../classes/session_pool.php');

Mock::generate('Log');

class TestOfSessionLogging extends UnitTestCase {

function testLoggingInIsLogged() {
$log = new MockLog();
//「$log->message('User fred logged in.')が1回呼ばる事を期待する」という機能を仕込む
$log->expectOnce('message', array('User fred logged in.'));
$session_pool = new SessionPool($log);
$session_pool->logIn('fred');
//$session_poolのlogInメソッドで、$log->message('User fred logged in.')を呼んでいるはず!
//もし呼んでいなければエラー!!
}
}


Mock::generate('Log');で、MockLogクラスが使えるようになるのです。
最初、モックオブジェクト使うからLogクラスいらないじゃんって、classes/log.phpをrequireしてなくて、「MockLogクラスなんて知らない!」というエラーが出てはまった。
そういうことかぁ。

ブラウザでテストしましたが、コマンドプロンプトでもテストできます。

C:\Program Files\Apache Group\Apache2\htdocs\test\simpletest\test>php session_pool_test.php
session_pool_test.php
OK
Test cases run: 1/1, Passes: 2, Failures: 0, Exceptions: 0

C:\Program Files\Apache Group\Apache2\htdocs\test\simpletest\test>

こんな感じ。
posted by ほえ at 18:28| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。