まずはテストケースのリファクタリングをします。
変更点は親クラスの社員クラスを変更します。これのテストに対応するため、担当・主任・部長・取締役の各テストを社員テストの子クラスにします。
ソースは次のようになります。
<?php
require_once 'PHPUnit.php';
class shainTest extends PHPUnit_TestCase {
var $shain;
}
?>
<?php
require_once 'shainTest.php';
require_once 'tantou.php';
class tantouTest extends shainTest {
function tantouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Tantou();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("担当が普通に立ちました。\n", $ret);
}
function testKyuryou()
{
$kyuryou = $this->shain->getKyuryou(100);
$this->assertEquals(100, $kyuryou);
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'shunin.php';
class shuninTest extends shainTest {
function shuninTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Shunin();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("主任がすばやく立ちました。\n", $ret);
}
function testKyuryou()
{
$kyuryou = $this->shain->getKyuryou(100);
$this->assertEquals(201, $kyuryou);
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'buchou.php';
class buchouTest extends shainTest {
function buchouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Buchou();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("部長がだるそうに立ちました。\n", $ret);
}
function testKyuryou()
{
$kyuryou = $this->shain->getKyuryou(100);
$this->assertEquals(300, $kyuryou);
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'torishimariyaku.php';
class torishimariyakuTest extends PHPUnit_TestCase {
function torishimariyakuTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Torishimariyaku();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("取締役がふんぞりかえって立ちました。\n", $ret);
}
function testKyuryou()
{
$kyuryou = $this->shain->getKyuryou(100);
$this->assertEquals(402, $kyuryou);
}
}
?>
![[テスト実行結果]](images/step4-01.jpg)
基本給は各社員に共通なので社員クラスに追加します。
あわせて、setter/getterメソッドも実装します。
ソースは次のようになります。
<?php
/*
* 社員用共通クラス
*/
class Shain {
var $kihonkyu;
function setKihonkyu($kihonkyu)
{
$this->kihonkyu = $kihonkyu;
}
function getKihonkyu($kihonkyu)
{
return $this->kihonkyu;
}
function standup()
{
}
function getKyuryou()
{
}
}
?>
仕様の変更に伴い、給料計算メソッドから引数がなくなりました。
これにあわせてテストもsetterで基本給を設定する形に変更します。
各ソースは次のようになります。
<?php
require_once 'shainTest.php';
require_once 'tantou.php';
class tantouTest extends shainTest {
function tantouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Tantou();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("担当が普通に立ちました。\n", $ret);
}
function testKyuryou()
{
$this->shain->setKihonkyu(100);
$kyuryou = $this->shain->getKyuryou();
$this->assertEquals(100, $kyuryou);
}
}
?>
<?php
require_once 'shain.php';
/*
* 担当
*/
class Tantou extends Shain {
function standup()
{
return "担当が普通に立ちました。\n";
}
function getKyuryou()
{
$kihonkyu = $this->getKihonkyu();
return $kihonkyu;
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'shunin.php';
class shuninTest extends shainTest {
function shuninTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Shunin();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("主任がすばやく立ちました。\n", $ret);
}
function testKyuryou()
{
$this->shain->setKihonkyu(100);
$kyuryou = $this->shain->getKyuryou();
$this->assertEquals(201, $kyuryou);
}
}
?>
<?php
require_once 'shain.php';
/*
* 主任
*/
class Shunin extends Shain {
function standup()
{
return "主任がすばやく立ちました。\n";
}
function getKyuryou()
{
$kihonkyu = $this->getKihonkyu();
return $kihonkyu * 2 + 1;
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'buchou.php';
class buchouTest extends shainTest {
function buchouTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Buchou();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("部長がだるそうに立ちました。\n", $ret);
}
function testKyuryou()
{
$this->shain->setKihonkyu(100);
$kyuryou = $this->shain->getKyuryou();
$this->assertEquals(300, $kyuryou);
}
}
?>
<?php
require_once 'shain.php';
/*
* 部長
*/
class Buchou extends Shain {
function standup()
{
return "部長がだるそうに立ちました。\n";
}
function getKyuryou()
{
$kihonkyu = $this->getKihonkyu();
return $kihonkyu * 3;
}
}
?>
<?php
require_once 'shainTest.php';
require_once 'torishimariyaku.php';
class torishimariyakuTest extends PHPUnit_TestCase {
function torishimariyakuTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setup()
{
$this->shain = new Torishimariyaku();
}
function testStandup()
{
$ret = $this->shain->standup();
$this->assertEquals("取締役がふんぞりかえって立ちました。\n", $ret);
}
function testKyuryou()
{
$this->shain->setKihonkyu(100);
$kyuryou = $this->shain->getKyuryou();
$this->assertEquals(402, $kyuryou);
}
}
?>
<?php
require_once 'shain.php';
/*
* 取締役
*/
class Torishimariyaku extends Shain {
function standup()
{
return "取締役がふんぞりかえって立ちました。\n";
}
function getKyuryou()
{
$kihonkyu = $this->getKihonkyu();
return $kihonkyu * 4 + 2;
}
}
?>
![[テスト実行結果]](images/step4-02.jpg)
給料計算の変更と同様に社長クラスのソースも変更します。
ソースは次のようになります。
<?php
require_once 'tantou.php';
require_once 'shunin.php';
require_once 'buchou.php';
require_once 'torishimariyaku.php';
class Shachou {
function main()
{
switch ($_POST["tantou"]) {
case "担当":
$shain = new Tantou();
break;
case "主任":
$shain = new Shunin();
break;
case "部長":
$shain = new Buchou();
break;
case "取締役":
$shain = new Torishimariyaku();
break;
}
$ret = "";
$ret .= $shain->standup();
$kihonkyu = $_POST["kihonkyu"];
$shain->setKihonkyu($kihonkyu);
$kyuryou = $shain->getKyuryou();
$ret .= "私の給料は" . $kyuryou . "円です。\n";
return $ret;
}
}
?>
![[テスト実行結果]](images/step4-03.jpg)
ボーナスを計算するメソッドを追加します。
処理はどの社員でも共通なので社員クラスに追加します。
まずはテストのソースから、
<?php
require_once 'PHPUnit.php';
class shainTest extends PHPUnit_TestCase {
var $shain;
function testGetBonus()
{
$this->shain->setKihonkyu(100);
$bonus = $this->shain->getBonus();
$this->assertEquals(300, $bonus);
}
}
?>
<?php
/*
* 社員用共通クラス
*/
class Shain {
var $kihonkyu;
function setKihonkyu($kihonkyu)
{
$this->kihonkyu = $kihonkyu;
}
function getKihonkyu()
{
return $this->kihonkyu;
}
function getBonus()
{
$kihonkyu = $this->getKihonkyu();
return $kihonkyu * 3;
}
function standup()
{
}
function getKyuryou()
{
}
}
?>
社長クラスをボーナスを表示するように変更します。
まずはテストを変更します。
ソースは次のようになります。
<?php
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ボーナスは300円です。\n", $ret);
$_POST["tantou"] = "主任"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("主任がすばやく立ちました。\n私の給料は201円です。\nボーナスは300円です。\n", $ret);
$_POST["tantou"] = "部長"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("部長がだるそうに立ちました。\n私の給料は300円です。\nボーナスは300円です。\n", $ret);
$_POST["tantou"] = "取締役"; $_POST["kihonkyu"] = "100";
$ret = $this->shachou->main();
$this->assertEquals("取締役がふんぞりかえって立ちました。\n私の給料は402円です。\nボーナスは300円です。\n", $ret);
}
}
?>
<?php
require_once 'tantou.php';
require_once 'shunin.php';
require_once 'buchou.php';
require_once 'torishimariyaku.php';
class Shachou {
function main()
{
switch ($_POST["tantou"]) {
case "担当":
$shain = new Tantou();
break;
case "主任":
$shain = new Shunin();
break;
case "部長":
$shain = new Buchou();
break;
case "取締役":
$shain = new Torishimariyaku();
break;
}
$ret = "";
$ret .= $shain->standup();
$kihonkyu = $_POST["kihonkyu"];
$shain->setKihonkyu($kihonkyu);
$kyuryou = $shain->getKyuryou();
$ret .= "私の給料は" . $kyuryou . "円です。\n";
$bonus = $shain->getBonus();
$ret .= "ボーナスは" . $bonus . "円です。\n";
return $ret;
}
}
?>
実行して、動作を確認します。テストがすべて通っていれば、正常に動作するはずです。
以下のリンクで動作が確認できます。
[step4 動作デモ]
以上で、step4は終了です。
Copyright © 1997-2003 by A.G.Labo
$Revision: 1 $