step1のプログラムをもとに、機能追加をします。
まずは実行画面であり、UIであるrun.phpから。
「社長は基本給を教える」とありますから、基本給を入れる項目が必要です。
ここは単純にテキストボックス、項目名は"kihonkyu"としました。
ソースは次のようになります。
<?php // $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $ require_once 'shachou.php'; ?> <head> <title>standup step2</title> <body> <form method="post" action="<?= $_SERVER["PHP_SELF"];?>"> 社長: <select name="tantou"> <option>担当 <option>主任 <option>部長 </select> 基本給=<input type="text" name="kihonkyu" size="10"> <input type="submit" name="standup" value="立ちなさい"> </form> <p> <?php $shachou = new Shachou(); echo "\n"; echo $shachou->main(); echo "\n"; ?>
プログラムはTDD(Test Driven Development)で作成します。
ここでは各社員ごとに給料を答えるメソッドを作るので各社員のテストケースを作る必要があります。
また、テストスイートはすべてのテストケースをテストする必要があります。
すべてのテストケースをテストするソースは次のようになります。
<?php
// UnitTest
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit/GUI/HTML.php';
require_once 'Tests/shachouTest.php';
require_once 'Tests/tantouTest.php';
require_once 'Tests/shuninTest.php';
require_once 'Tests/buchouTest.php';
// run Test Suites
$suite = array();
array_push($suite, new PHPUnit_TestSuite("shachouTest"));
array_push($suite, new PHPUnit_TestSuite("tantouTest"));
array_push($suite, new PHPUnit_TestSuite("shuninTest"));
array_push($suite, new PHPUnit_TestSuite("buchouTest"));
$result = new PHPUnit_GUI_HTML($suite);
$result->show();
?>
![[テスト実行]](images/step2-01.jpg)
メソッドの実装に入ります。まずは、担当のテストクラスとテストを書きます。
ソースは次のようになります。
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shachou.php';
class tantouTest extends PHPUnit_TestCase {
var $tantou;
function tantouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->tantou = new Tantou();
}
function testSetUp()
{
$this->assertEquals("tantou", get_class($this->tantou));
}
function testKyuryou()
{
$kyuryou = $this->tantou->getKyuryou(100);
$this->assertEquals(100, $kyuryou);
}
}
?>
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';
/*
* 担当
*/
class Tantou extends Shain {
function standup()
{
return "担当が普通に立ちました。\n";
}
function getKyuryou($kihonkyu)
{
return $kihonkyu;
}
}
?>
担当クラスの変更と同様にテストとメソッドを作成します。
テストのソースは次のようになります。
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shunin.php';
class shuninTest extends PHPUnit_TestCase {
var $shunin;
function shuninTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shunin = new Shunin();
}
function testKyuryou()
{
$kyuryou = $this->shunin->getKyuryou(100);
$this->assertEquals(201, $kyuryou);
}
}
?>
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';
/*
* 主任
*/
class Shunin extends Shain {
function standup()
{
return "主任がすばやく立ちました。\n";
}
function getKyuryou($kihonkyu)
{
return $kihonkyu * 2 + 1;
}
}
?>
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'buchou.php';
class buchouTest extends PHPUnit_TestCase {
var $shain;
function buchouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Buchou();
}
function testKyuryou()
{
$kyuryou = $this->shain->getKyuryou(100);
$this->assertEquals(300, $kyuryou);
}
}
?>
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';
/*
* 部長
*/
class Buchou extends Shain {
function standup()
{
return "部長がだるそうに立ちました。\n";
}
function getKyuryou($kihonkyu)
{
return $kihonkyu * 3;
}
}
?>
社長クラスに給料を答える処理を追加します。
メッセージが変更されるのでテストも変更します。
テストのソースは次のようになります。
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shachou.php';
class shachouTest extends PHPUnit_TestCase {
var $shachou;
function shachouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shachou = new Shachou();
}
function testStandup()
{
$_POST["tantou"] = "担当"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("担当が普通に立ちました。\n私の給料は100円です。\n", $ret);
$_POST["tantou"] = "主任"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("主任がすばやく立ちました。\n私の給料は201円です。\n", $ret);
$_POST["tantou"] = "部長"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("部長がだるそうに立ちました。\n私の給料は300円です。\n", $ret);
}
}
?>
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'tantou.php';
require_once 'shunin.php';
require_once 'buchou.php';
/**
* @author Furukawa Atsushi <atsushifx@aglabo.com>
*/
class Shachou {
function main()
{
switch ($_POST["tantou"]) {
case "担当":
$shain = new Tantou();
break;
case "主任":
$shain = new Shunin();
break;
case "部長":
$shain = new Buchou();
break;
}
$ret = "";
$ret .= $shain->standup();
$kihonkyu = $_POST["kihonkyu"];
$kyuryou = $shain->getKyuryou($kihonkyu);
$ret .= "私の給料は" . $kyuryou . "円です。\n";
return $ret;
}
}
?>
以上で、step2は終了です。
Copyright © 1997-2003 by A.G.Labo
$Revision: 1 $