CIUnit: Unit testing for CodeIgniter(3)

CodeIgnigter

CIUnit.phpの改変

コントローラを読み込む際、ファイル名が小文字の場合に読み込まれないという問題が発生をしました。
そのため、CIUnit.phpを改変しました。
 
 
 

tests/CIUnit.php
124行目あたり

 
include_once(APPPATH . 'controllers/' . $controller . EXT);
 

↓修正
ファイルの存在確認を行い、なければ小文字にして読み込むよう、変更

if(is_file(APPPATH . 'controllers/' . $controller . EXT)){
    include_once(APPPATH . 'controllers/' . $controller . EXT);
}else{
    $controller2 = strtolower($controller);
    include_once(APPPATH . 'controllers/' . $controller2 . EXT);
}
 

これでテストが通るようになりました。

テストのコードカバー率を確認する

次に、phpUnitを使うなら、
http://gihyo.jp/dev/feature/01/php-test/0003?page=5
こんなレポートはぜひ生成させたい!
ということで、生成させようとしてみました

$ phpunit --report ./report AllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

........................セグメンテーション違反です

phpunit AllTests.php
は、正常にテストが完了します。
–reportの場合のみ、 「セグメンテーション違反です」の文字が表示されて、処理が途中で止まります。
レポートも生成されません。
これは、

$this->load->model("モデル名");
// $this->CI->load->model("モデル名");も同様

の処理が入っているものすべてで発生をしていて、Controllreのテストでもモデルをロードしている場合は同じようにエラーが発生しました。モデルを読み込まないようにするとレポートが生成されます。
phpunitテスト自体は、モデルの読み込みの有無にかかわらず正常にテストの結果が返ってきます。

で、結局PHPUnitのコードに手を入れました(^-^;)
私の環境では、/usr/share/pear/PHPUnit/ にインストールされています。
手探りで、処理を追いつつ、結局ファイルに手を入れました。
/usr/share/pear/PHPUnit/Framework/TestResult.php
601行目あたり

xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
 

↓修正
とっても無茶な感じに修正(汗)

//xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | 1);

print文を仕込んだところ、
XDEBUG_CC_UNUSEDは1
XDEBUG_CC_DEAD_CODEは2が格納されていました。

検索していて、このサイトを発見。
http://mp.i-revo.jp/user.php/kcvcrlkq/entry/249.html
0か1なら動くかな・・・・・ドキドキ
で、1にしてみたら、正常にテストが実行され、reportが生成されました

XDEBUG_CC_DEAD_CODEの意味とかちゃんと調べてからとか・・・・
動くには動いてますが、方法は間違ってる可能性が高いです。(><)

無事(?)レポートが生成されました。
system以下のコードのカバー率や、テストされている行が一目で見えるのは、
嬉しいです♪

生成されたレポートですが、日本語が文字化けをします。
そこでテンプレートを編集しました。
shimookaさんありがとうございますm(_ _)m

/usr/share/pear/PHPUnit/Util/Report/Template/file.html.dist

<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

コードの日本語のコメント文の文字化けも直りました。

環境
Fedora 8
php-5.2.6-2.fc8
PHPUnit 3.3.16

PHP 5.2.6 (cli) (built: May 8 2008 08:54:23)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans

関連
CIUnit: Unit testing for CodeIgniter
CIUnit: Unit testing for CodeIgniter(2)
CIUnit: Unit testing for CodeIgniter(2)のつづき

参考にさせていただいたサイト
PHPUnit3で始めるユニットテスト
http://gihyo.jp/dev/feature/01/php-test/0001

fooStack for CodeIgniter
http://www.foostack.com/foostack/

PHPUnit errorの記事
http://jaciss.wordpress.com/2008/02/18/phpunit-error-testcasename-or-testcase/

CIUnit: Unit testing for CodeIgniter(2)の続き

CodeIgnigter


CIUnit: Unit testing for CodeIgniter(2)
の続きです。
(3)ではありませn・・・・・(汗)
phpunitの再インストールで動き出したと思われたCIUnitですが、
正常な動作ではありませんでした。

$ cd controllers/

$ phpunit testWelcome.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

$ phpunit ControllersAllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

ここまでは正常です。

controllreのテストまで正常に動きましたが、
全テストではエラーが発生します

$ cd ../
phpunit AllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

.............<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(/var/www/html/works/system/application/controllers/Welcome.php): failed to open stream: No such file or directory</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(): Failed opening '/var/www/html/works/system/application/controllers/Welcome.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php')</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div>PHP Fatal error:  Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
PHP   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
PHP   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
PHP   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
PHP   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
PHP   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
PHP  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
PHP  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
PHP  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
PHP  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
PHP  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
PHP  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

Fatal error: Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130

Call Stack:
    0.0005	83784   1. {main}() /usr/bin/phpunit:0
    0.1485    5663072   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
    0.3327    9503688   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
    0.3333    9506304   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
    0.3342    9506512   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4183    9597480   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4809   10191464   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
    0.4809   10191464   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
    0.4809   10191464   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
    0.4811   10191464  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
    0.4825   10201528  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
    0.4826   10201528  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
    0.4826   10201528  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
    0.4827   10201528  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
    0.4827   10201528  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

$ cd controllers/
$phpunit testWelcome.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)
[root@localhost controllers]# phpunit ControllersAllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)
$  cd ../
$ phpunit AllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

.............<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(/var/www/html/works/system/application/controllers/Welcome.php): failed to open stream: No such file or directory</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(): Failed opening '/var/www/html/works/system/application/controllers/Welcome.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php')</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div>PHP Fatal error:  Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
PHP   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
PHP   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
PHP   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
PHP   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
PHP   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
PHP  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
PHP  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
PHP  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
PHP  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
PHP  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
PHP  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

Fatal error: Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130

Call Stack:
    0.0006	83784   1. {main}() /usr/bin/phpunit:0
    0.1494    5663072   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
    0.3345    9503688   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
    0.3351    9506304   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
    0.3360    9506512   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4190    9597480   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4814   10191464   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
    0.4814   10191464   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
    0.4814   10191464   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
    0.4816   10191464  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
    0.4831   10201528  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
    0.4831   10201528  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
    0.4831   10201528  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
    0.4832   10201528  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
    0.4832   10201528  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

なぜかAllTTestの場合、controllerのwelcomeを呼び出しているところが、Welcomeを呼び出そうとして失敗をしています。

CIUnit.phpの124行目

include_once(APPPATH . ‘controllers/’ . $controller . EXT);
の部分の$controller がwelcomeからWelcomeに変化しています。それによってファイルが読み込めずのエラーのようです。

無理やりな感じになおしてみました。

CIUnit.phpの124行目
include_once(APPPATH . ‘controllers/’ . $controller . EXT);
大文字でファイルがなかったら、小文字にしてファイル読み込んでよね的。

if(is_file(APPPATH . 'controllers/' . $controller . EXT)){
		    include_once(APPPATH . 'controllers/' . $controller . EXT);
		}else{
		    $controller2 = strtolower($controller);
		    include_once(APPPATH . 'controllers/' . $controller2 . EXT);
		}

やっとやっと、テストができるところまで到着(TAT)

ここまでの感想
phpunitの再インストールの記事を自力で探せませんでした。
基礎力がおそろしく足りないことを自覚しました。
「何がわからないか?」がわからないと解答が目の前にあってもそれが解答と理解できないのだなぁ・・・・

CIUnitへの挑戦はこんな流れでがんばってみる予定です

  • CIUnitを設置してみる
  • CodeIgniterでテストができるようにする ←今ココ
  • 実際にテストを書いてみる
  • テストの効果を実感してみる
  • CIUnitのコードを読んでみる
  • MyNETS2(CodeIgniter 1.7.0改)で使えないか模索してみる

    CIUnit: Unit testing for CodeIgniter(2)

    CodeIgnigter

    CIUnit
    CIUnit: Unit testing for CodeIgniter

    サイトによると・・・
    CIUnit は、Codeigniterで作ったアプリケーションとphpUnitを繋ぐためのブリッジの役割をするもののようです。
    「tested with 1.6.X, 1.7.0 and 1.7.1」ということなので、1.7.0 1.7.1でもテストが出来ます。

    [Download the current fooStack v0.15 here!]というテキストリンクからダウンロードしました。
    開発バージョンと旧式のバージョンはbitbucket.org / ciunitというところを見ると良いらしいです。
    bitbucket(びっとばけつ)というものをはじめて知りました。
    フォルダ名等、通常の構造のままであることが、使用の前提のようです。
    英語苦手なので、自分用に翻訳してみました(^-^;)

    Install it as follows:インストール方法(訳)

    1.fooStackディレクトリ をコピーして、
    /system/application/librariesの直下に設置します。

    2. テストをするCodeIgniterアプリは、標準のレイアウトを使用していることを想定しています。

    3. testsディレクトリをコピーして
    /system/applicationの直下に設置します

    4. system/codeigniter/CodeIgniter.phpを
    ダウンロードした同名のファイルと入れ替えます。

    5. rsystem/application/config/database.phpを改変します。

    $active_group = "default";

    の部分を

    $env_used = 'default'; //where default would be the name of your development setting
          if(defined('CIUnit_Version')){
            $env_used .= '_test';
          }
          $active_group = $env_used;

    ・・・と置き換えちゃいます。

    6. ‘テストデータベースとして機能する新しいデータベース設定を作成します。
    (テストを実行すると、それはいつもクリアになります)
    データベースの名前は開発環境のようですが、‘_test’とつけてください。
    【注意】CIUnit fixturesは、データベース名の後ろに、’_test’とつけて、それを使うことで
    テストの実行によるDBデータの損失を防ぐようになっています。

    訳してみたけど微妙な文書になってる気がする・・・

    追記:2009.05.31
    テスト用のデータベースの設定が必要です。
    私は開発中のDBのコピーをDB名_testで作成して、テスト用のDBにしました

    $db['default_test']['hostname'] = "localhost";
    $db['default_test']['username'] = "DBの接続ユーザ";
    $db['default_test']['password'] = "パスワード";
    $db['default_test']['database'] = "テスト用データベース";
    $db['default_test']['dbdriver'] = "mysql";
    $db['default_test']['dbprefix'] = "";
    $db['default_test']['pconnect'] = TRUE;
    $db['default_test']['db_debug'] = TRUE;
    $db['default_test']['cache_on'] = FALSE;
    $db['default_test']['cachedir'] = "";
    $db['default_test']['char_set'] = "utf8";
    $db['default_test']['dbcollat'] = "utf8_general_ci";

    Run tests テストを走らせてみる。
    1.すべてのテストディレクトリからテスト

    $ phpunit AllTests.php

    実行した結果

    phpunit AllTests.php
    PHPUnit 3.1.8 by Sebastian Bergmann.
    
    FFFFFFF
    
    Time: 0 seconds
    
    There were 7 failures:
    
    1) Warning(PHPUnit_Framework_Warning)
    No tests found in class "CiunitAllTests".
    
    2) Warning(PHPUnit_Framework_Warning)
    No tests found in class "SystemAllTests".
    
    3) Warning(PHPUnit_Framework_Warning)
    No tests found in class "LibsAllTests".
    
    4) Warning(PHPUnit_Framework_Warning)
    No tests found in class "ModelsAllTests".
    
    5) Warning(PHPUnit_Framework_Warning)
    No tests found in class "ViewsAllTests".
    
    6) Warning(PHPUnit_Framework_Warning)
    No tests found in class "ControllersAllTests".
    
    7) Warning(PHPUnit_Framework_Warning)
    No tests found in class "HelpersAllTests".
    
    FAILURES!
    Tests: 7, Failures: 7.

    2.サブグループだけのテスト

    $ cd models
    $ phpunit ModelAllTests.php

    実行した結果

    [root@localhost models]# phpunit ModelsAllTests.php 
    PHPUnit 3.1.8 by Sebastian Bergmann.
    
    F
    
    Time: 0 seconds
    
    There was 1 failure:
    
    1) Warning(PHPUnit_Framework_Warning)
    Constructor of class "testSomeModel" is not TestCase($name) or TestCase().
    
    FAILURES!
    Tests: 1, Failures: 1.

    3.特定の1つだけのテストの場合は
    テストを書いたディレクトリに移動して、テストを書いたファイルそのものを実行してください

    Generating database fixtures

    ちと意味がわからなかった・・・・テスト用DBのかわりにyamlで代用が出来るよ的な内容かなとは思う・・・・

    テスト用のテーブルを、作ることが出来ます。
    (テスト用のデータベースそのものを用意するべきですが・・・)
    テスト用ファイルは、tests/fixtures/以下で利用可能です。
    ディレクトリに対して書き込み可能な状態にしてください。
    テスト用ファイルは、yamlのフォーマットで記載します。
    yamlにテスト用のデータを記載してください。

    $this->dbfixt('items', 'comments', 'users');

    テストから、機能をセットアップしてください。
    そうすると、テストデータベースに読み込まれるので、変数をテストで利用可能になります。

    $this->items_fixt, 
    $this->comments_fixt, 
    $this->users_fixt.

    テストデータベースのコメントテーブルのデータの2番目の行も利用可能です。

    $this->comments_fixt['second'];

    CIUnit tests itself CIUnit自体のテスト
    テストを全く書かずにテストを実行してください。

    $ phpunit CIUnitAllTests.php

    ・・・を実行すると、2つか3つぐらいのテストの結果が返ってきます。
    これは、CIUnitが正しくインストールされていることを確認するためのテストです。

    そして実際にテストを書いてみる
    ・・・が、私はまだphpUnitの使い方もよくわかっていないorz
    設置したtestsフォルダの中に、サンプルのコードがありました。

    system/application/tests/controllers/testWelcome.php

    <?php
    
    include_once dirname(__FILE__).'/../CIUnit.php';
    
    class testWelcome extends CIUnit_TestCase{
    
        function setUp(){
    	$this->CI = set_controller('welcome');
        }
    
        public function testWelcomeController(){
          $this->CI->index();
          $out = output();
          $this->assertSame(0, preg_match('/(error|notice)/i', $out));
        }
    
    }

    tests/models,tests/libsの中にも同じような感じでサンプルのコードがありました。

    追記:2009.05.30
    phpUnitのチュートリアルをやってみて、CIUnitのテストを書いてみたけどうまくいかない。
    サンプルに追記をしてみても、改変をしてみても

    1) Warning(PHPUnit_Framework_Warning)
    Constructor of class "testWelcome" is not TestCase($name) or TestCase().

    と、テストケースが無いよと言われる。
    設置した直後の状態と、サンプル(tests/controllers/testWelcome.php)に追記したあとも、
    テスト結果が変わらない(T-T)

    追記:2009.05.30 04:01
    lllnorikolllさんが教えてくださったサイト・・・・
    http://jaciss.wordpress.com/2008/02/18/phpunit-error-testcasename-or-testcase/
    phpUnitをインストールしなおせということのようです・・・・orz

    追記:2009.05.30
    pearをアンインストールしたあと、したりインストールしたりを繰り返したら動くようになりました(><)
    ありがとうlllnorikolllさん!!!

    アンインストールした後、

    # ll /usr/share/pear

    で確認してみたら、なぜかPHPUnit/があったのでフォルダごと削除してから、再度phpunitをインストールしてみたら、テストが通るようになりました。
    なぜだかはわからないけれども、
    とにかくテストを書く手前までたどり着けました(><)ノ

    CIUnit: Unit testing for CodeIgniter

    CodeIgnigter

    メモ〆(。。)
    http://www.foostack.com/foostack/
    CodeIgniterとphpUnitをつなぐブリッジ

    追記:設置までできました♪

    ダウンロードすると、なぜか.svnフォルダがそのまま搭載されていて、
    いつでもsvn updateしてください的な感じです。
    (ただし、ID,PASSが必要みたい・・・どこかに公開されてるのかな?)

    テストの為にDBを汚さないようにyamlを使ってね的な事が書かれている部分が、よくわからないのだけれども。
    続きはまた今夜か週末にやりたいと思います。

    参考リンク

    phpUnitの使い方
    http://aglabo.com/agl/proevo/PHP/PEAR/phpunit-howto.html

    PhpUnit – 最強のユニットテスト自動化ツール
    http://www.doyouphp.jp/tips/tips_phpunit.shtml

    phpUnitのWIKI
    http://www.phpunit.de/

    PHPUnit3で始めるユニットテスト
    http://gihyo.jp/dev/feature/01/php-test/0001

    ネコネットデザイン事務所ホームページ




    ネコネットデザイン事務所ホームページを先日リニューアルしました。

    旧サイトは、「OpenPNEでつくる!最強のSNSサイト」の中で、OpenPNEのスキンジェネレータNEKOGET PNESKINの解説を掲載いただいた時に本にサイトのキャプチャを掲載いただいた事もあり、思い出深いサイトでしたが、デザインも変更をしました。

    このホームページはCodeIgniterというフレームワークを使って、作成しています。
    運営をしている、PNESKIN等のコンテンツは自宅のサーバでの運営なのですが、
    仕事用のこのサイトはレンタルサーバに設置をしています。

    自宅の環境PHP5 MySQL5の環境で開発を進めましたが、レンタルサーバがPHP4 MySQL4.0という古い環境のため、少しコードに手を入れてレンタルサーバ上で動かしています。

    コーポレートサイト用の簡易CMSとして、少しずつ育てていく予定です。

    メモ

    MyNETS2
    管理者のログインとか認証関連
    元のがよくわからなかったので、作っちゃう事に。

    管理用テーブルを作成

     

    CREATE TABLE <code>admin</code> (
    <code>id</code> INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    <code>user_id</code> INT( 11 ) NOT NULL ,
    <code>level</code> INT( 1 ) NOT NULL ,
    <code>create</code> TIMESTAMP NOT NULL ,
    <code>update</code> TIMESTAMP NOT NULL
    ) TYPE = MYISAM ;

    levelは権限レベル 1はALL 0は無効
    数字が増えて行くにつれて、アクセスできる箇所を減らして見ようかなと思ってる。
    とりあえずは有効無効設定的に使用

    こんな感じでjoinさせて検索しちゃえばいいかなと。
    管理ユーザ専用のID,PASSを保存するテーブルをとも思ったけども
    モジュール別に管理権限とかつけたくなるかもしれないし。
    管理者名は別にあってもいいかもしれない。
    後からカラムを追加してみよう・・・・〆(。。)

    joinだとこんな感じになるかな・・・・〆(。。)

    $this->db->select('*');
    $this->db->from('user');
    $this->db->join('admin', 'admin.user_id = user.user_id);
    $this->db->where('user_id, $user_id); 
    $this->db->where('level', 1); 
    $query = $this->db->get();

    1.6.3のユーザーガイド(MyNETS2は1.7ベースらしい)
    http://codeigniter.jp/user_guide_ja/database/active_record.html

    whereの指定は、「4. 自由に指定できる文字列を使用する方法」の書き方の方が好みなので、こっち採用〆(。。)

    4. 自由に指定できる文字列を使用する方法:

    WHERE句の中身を自分で書くこともできます:
    $where = “name=’Joe’ AND status=’boss’ OR status=’active'”;

    $this->db->where($where);

    adminモジュールを書き換えちゃうのもあれなので、
    nekogetモジュールを作成
    主な役割は会員管理
    ここでは、adminテーブルは使わない、会員(user)の管理を行う
    機能はきっとこれぐらいあればきっと大丈夫・・・・〆(。。)

    • 会員一覧(新着)
    • 会員一覧(登録順)
    • 会員検索(簡易検索)
    • 会員検索(詳細検索)
    • 会員情報の詳細表示
    • 会員情報の修正
    • 会員情報の削除
    • 会員プロフィール情報の項目管理(登録、修正、削除)

    スキン関連のフォルダ構成の変更

    • /theme/default/cssファイル
    • /theme/default/image/imageファイル
    • /theme/nekoget/cssファイル
    • /theme/nekoget/image/imageファイル

    モジュール名/main.css の頭で、default/main.cssを読み込む。
    モジュール名/main.cssはdefault/main.cssでたりない設定を追記していく
    もしくはdefaultの設定を読み込まず、単独の設定を作るベースのCSSファイル
    フォルダもしくはファイルで分けて、表示画面別のCSS、Controllerが制御するもの別のCSSファイルを個別に呼び出せるようにする。
    この部分はControllerでの制御は避けて、View側で対応させたいな
    ・・・・〆(。。)備忘録的にメモ

    • View側の開発担当者とロジック(Controllerとかmodelとか)の開発担当者で、見るべき触るべきファイルを分けたい
    • 機能ごとをモジュールで分ける事で、分業を簡単に&設置、除去を簡単にする
    • CSSファイルを表示画面別に後から追記できるようにしておけば、急なデザイン変更にも対応しやすいし、単独のページでしか使わない設定を全ページで読み込ませる必要が無くなる
    • モジュール別のスキンテーマをさくさく変更できると嬉しい・・・デェフォルトとモジュール別のCSSの着脱や入れ替えを簡単にしたい

    モジュールの中に、MyNETS2のバージョンとベースのCodeigniterのバージョン番号の情報をどこかに保存しておかないと、
    モジュールだけを作ったり、設置したり、外したり、配ったりするのに困りそうだ。
    どこかに情報を書き込んでおこう〆(。。)

    続きはまた夜にでも勉強しつつやってみる予定。

    〆(。。)トランザクション処理
    http://codeigniter.jp/user_guide_ja/database/transactions.html

    メモ

    MyNETS2で、過去にCodeIgniterで作ったものを乱暴にモジュールにつっこんでみたり・・・

    • /system/mynets/modules/nekoget/config/database.phpでモジュール別にDBの設定ができるとのことだったけれども、残念ながらDBの情報を書き込んだだけでは動かなかった。
    • ControllerからViewの読み込みと表示は問題なし。

    モジュールフォルダの中はCodeIgniterとほぼ同じ
    なので、CodeIgniterがわかれば、普通にCodeIgniterでプログラムを組む感覚で作れる感じ。

    スキンの情報が格納されるthemeの中もモジュールごとのフォルダに分かれている。
    スキンテーマごとに分かれていてほしいので、こんな感じにしてみる。

    • /theme/
    • /theme/スキンテーマ名/default/css/CSSファイル
    • /theme/スキンテーマ名/default/image/CSSが利用する画像ファイル
    • /theme/スキンテーマ名/モジュール名/css/CSSファイル
    • /theme/スキンテーマ名/モジュール名/image/CSSが利用する画像ファイル

    サイト管理用の管理機能もモジュール化について
    同じサイト内でも使えるし、切り離して管理機能だけ他の場所に設置できるようにしたい。
    adminモジュールを作ってその中でだけにしてしまうと、
    簡単に追加したはずの機能の管理の切り離しや追加が面倒な事になってしまう。
    管理用モジュールの一般機能モジュールへの依存はなしにしたいから、モジュールを置く場所自体も分けたい。

    Viewファイルの共通パーツがControllerで使うテンプレートのパーツをすべて呼び出して、テンプレートに文字データとしてデータを渡すようになっているが、ここはController上ではなく、viewの役割にしたい。
    表示の変更や、HTMLの構造を変更する際に、Controllerを調べないといけなくなるよりも、Viewファイル上で完結している方が、デザインや表示を変えるために改変を行う場合に,viewファイルだけを触って解決することができる。(デザイン変更の為にロジックは触りたくない)

    眠くなってきたので、今日はここまで。

    MyNETS2が面白い。

    CodeIgnigter

    kunitsujiさんよりCodeIgniterベースのNyNETS2の最新(?)のものをいただいたので、質問を投げさせていただきつつ中を拝見させていただきました。
    kunitsujiさん、詳細な説明ありがとうございます!

    モジュール化のために用意された構造がとてもすっきりしています。
    おもしろそうなので試しに何か1機能作ってみようと思います。

    Codeigniterで設計(?)

    CodeIgnigter
    ちっともまとまっていませんが、Codeigniterで設計勉強会の資料を作ったらどうなるかな的に作ってみました。


    第二回設計勉強会

    課題(?)ほどには深いところまで書けては無いのですが、
    ここしばらくCodeigniterを使っていての自分なりのまとめになったような気がします。理解はまだまだ浅いのです (>_< ) 1ヶ月後、3ヶ月後ぐらいに同じ課題で再度資料をつくってみたいなと思います。

    追記:2008.10.31
    こうしたら、こんな効果があったとか、足りないことを少しずつ自覚中。
    やはり1ヵ月後には再度同じテーマで資料を作ってみたいな。

    TRACチケット駆動開発(試行錯誤中)

    現在自社サイトリニューアルのため、CodeIgniterでサイトを構築中です。
    で、1人作業をしているわけですが、開発タスクのTracのチケットを仕様、設計メモにしてみました。

    • チケット登録時に実装する機能の資料をチケットに記載
    • 関連するDBのテーブル定義
    • コーディングルール(意識して気をつけて書いてる点)
    • Class,function,責務,URLの一覧
    • 各責務の特徴、主な役割
    • 実装作業したリビジョン番号をメモ的に記載

    実際に作業をしてみると、作業最中は、作っている機能のチケットのページをずっと開きっぱなしで作業をしてます。

    修正すべき項目は即時に修正。
    ドキュメントとして保存しておくべき項目をすぐに追記。

    そのチケットが終わる頃にはチケットが最終のドキュメントになることを狙っています。
    実際作業をしてみると、チケットに書いてある内容を元に、PHPdoc形式で書くのに作業がスムーズでした。
    目の前の作業中に目の前に資料がある状態のおかげで作業にも集中できました。

    しばらく一人作業の場合はこの方法を練ってみて、
    うまくいくようであれば事務所に導入してみようと思います。