読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

ついにCakePHPにPHPUnitをインストールできてワロタ

CakePHP PHP PHPUnit Test Code

スポンサードリンク

http://www.flickr.com/photos/41343210@N02/5118147255
photo by Nazer K


やったぁあああああああああああああああああああ(/・ω・)/

ついに、ついに成功することができました!

  • これまでの無念

aipacommander.hatenablog.jp

aipacommander.hatenablog.jp



前提

  • composerがすでにインストール済み
  • mac
  • cakephp
  • autoloader設定済み

vendors ディレクトリへ移動

cd ~/cakephp/vendors/


app/Vendor でもいいんだけど、本番環境にはアップしないし、それに .gitignore では、最初からコミットされないように記述されているので、ここがいいんだろうな。と思います。

composer.jsonphpunitをインストールするようにファイル作成

$ vi composer.json
=======
{
	"name" : "phpunit",
	"description" : "PHPUnit",
	"require":
	{
		"phpunit/phpunit": "3.7.*"
	},
	"config" :
	{
		"vendor-dir": "PHPUnit"
	}
}
=======

インストール

作成したらcomposerを使ってインストール

$ composer install

Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing symfony/yaml (v2.6.6)
    Downloading: 100%         

  - Installing phpunit/php-text-template (1.2.0)
    Downloading: 100%         

  - Installing phpunit/phpunit-mock-objects (1.2.3)
    Downloading: 100%         

  - Installing phpunit/php-timer (1.0.5)
    Downloading: 100%         

  - Installing phpunit/php-token-stream (1.2.2)
    Downloading: 100%         

  - Installing phpunit/php-file-iterator (1.4.0)
    Downloading: 100%         

  - Installing phpunit/php-code-coverage (1.2.18)
    Downloading: 100%         

  - Installing phpunit/phpunit (3.7.38)
    Downloading: 100%         


おおおおおおおおおおおおおおおおおおおおおお(/・ω・)/


やったぜ!!


phpunitがインストールできたか、確認する

$ ls -l PHPUnit
drwxr-xr-x  7 mac_user  user  238  1 1 06:00 PHPUnit


大丈夫っぽい。

Cake側にロードさせる

  • app/Config/bootstrap.php
// 72行目ぐらい
CakePlugin::loadAll();

動作確認してみる


http://localhost/test.php へアクセスしてみましょう。
CakePHPの動作が確認できるパスを指定してください。


そしたら、、、、あれ?

Debug setting does not allow access to this url.


よくわからないエラーメッセージが。


ぐぐる


どうやら、debug mode を、2へ上げなければならない。修正する。

  • app/Config/core.php
// 34行目ぐらい
	Configure::write('debug', 2);

もう一度(アンビリバボー風に)

Failed opening 'PHPUnit/Autoload.php' for inclusion


ぐぬぬぬ・・・・


To install with the PEAR installer run the following commands:


いや、だから、前回PEARでインストールしようとしたらできなかったじゃなーいヾ(*`Д´*)ノ


前回aipacommander.hatenablog.jp



いろいろ確認してみる

$ ~/cakephp/app/Console/cake  test core Basics
---------------------------------------------------------------
PHPUnit 3.7.38 by Sebastian Bergmann.

........................S..S.

Time: 2.56 seconds, Memory: 7.75Mb

OK, but incomplete or skipped tests!
Tests: 29, Assertions: 188, Skipped: 2.


あれ? 実行できた。


ということは一応PHPUnitには問題ないのかな?


面倒くさいので、直接指定してみた

  • app/Config/bootstrap.php
// 72行目ぐらい
CakePlugin::loadAll();
require_once ROOT . DS . 'vendors' . DS . 'PHPUnit' . DS . 'autoload.php';

もう一度(アンビリバボー風に)


おっ、エラーがなくなった!

テストしてみる


時間ないのでサクッと(今出勤前に書いています)



CakePHPのドキュメント通りに作ってみる

  • app/View/Helper/ProgressHelper.php
class ProgressHelper extends AppHelper {
    public function bar($value) {
        $width = round($value / 100, 2) * 100;
        return sprintf(
            '<div class="progress-container">
                <div class="progress-bar" style="width: %s%%"></div>
            </div>', $width);
    }
}




  • app/Test/Case/View/Helper/ProgressHelperTest.php
App::uses('Controller', 'Controller');
App::uses('View', 'View');
App::uses('ProgressHelper', 'View/Helper');

class ProgressHelperTest extends CakeTestCase {
    public function setUp() {
	    parent::setUp();
	    $Controller = new Controller();
	    $View = new View($Controller);
	    $this->Progress = new ProgressHelper($View);
    }

    public function testBar() {
	    $result = $this->Progress->bar(90);
	    $this->assertContains('width: 90%', $result);
	    $this->assertContains('progress-bar', $result);

	    $result = $this->Progress->bar(33.3333333);
	    $this->assertContains('width: 33%', $result);
    }
}


では実行してみます!(ざわ・・・ざわ・・・)



ブラウザで確認できます。


f:id:aipacommander:20150425102307p:plain


さっき何もなかったところに突然リンクが!!!



クリック!



・・・・・ッ!


動かない! (´;ω;)



何故だ!


簡単な話だ!!!


  • app/Test/Case/View/Helper/ProgressHelperTest.php
<?php
// ↑上が足りなかった orz
App::uses('Controller', 'Controller');
App::uses('View', 'View');
App::uses('ProgressHelper', 'View/Helper');

class ProgressHelperTest extends CakeTestCase {
    public function setUp() {
	    parent::setUp();
	    $Controller = new Controller();
	    $View = new View($Controller);
	    $this->Progress = new ProgressHelper($View);
    }

    public function testBar() {
	    $result = $this->Progress->bar(90);
	    $this->assertContains('width: 90%', $result);
	    $this->assertContains('progress-bar', $result);

	    $result = $this->Progress->bar(33.3333333);
	    $this->assertContains('width: 33%', $result);
    }
}

もう一度!!!


おおお!


なんかいっぱいでてきた!!!


めちゃめちゃテストケースが失敗している!!!


何故だ!!!!!!?


理由はすぐにわかった!!!!!!!

  • app/View/Helper/ProgressHelper.php
<?php
// ↑上が足りなかった orz
class ProgressHelper extends AppHelper {
    public function bar($value) {
        $width = round($value / 100, 2) * 100;
        return sprintf(
            '<div class="progress-container">
                <div class="progress-bar" style="width: %s%%"></div>
            </div>', $width);
    }
}

お・ち・つ・け (ギリギリなのはわかるけど)



もう一度実行!



おおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお!!!!


f:id:aipacommander:20150425102303p:plain


うまくいきました!

感想


もう出勤するので省きます。


しかし、以前の記事からはや100日後(ぐらいかな?)


ついに俺もテストエンジニア(初心者)になる時がきました。


ガリガリ書いていくお(^ω^ = ^ω^)おっおっおっ


おわり