lubuntu-14.04-desktop-amd64.iso NetBeans PHPUnit | 乖離のぶろぐ(*´∀`)吸い込んで応援
http://ameblo.jp/pochifx/entry-11834668668.html
lubuntu-14.04-desktop-amd64.iso NetBeans PHP(3)
2014-04-28
(゚ω゚)の続き。

(゚ω゚)PHPのテストってどうやるの?
(゚ω゚)検索したら見つかった解説を読んでみる。
http://www.atmarkit.co.jp/ait/articles/0909/14/news103.html
ユニットテストはなぜ必要なの? (1/2)
>PHPUnit3でのテストケースの例です。
>ユニットテストツールを使用するメリット

http://www.atmarkit.co.jp/ait/articles/0909/14/news103_2.html
ユニットテストはなぜ必要なの? (2/2)
>テスト駆動開発やTDD(Test Driven Development)
>テストありきで開発されたコードは、すでに何度も試運転が行われており、バグと仕様の両方の完成度は高くなっています。それに加えて、再利用性や拡張性、保守性においても優れているといえます。
>ユニットテストのようなシンプルな環境で育成されたメソッドは、準備処理や前提条件を多く必要とせず、どのような環境からも呼び出せるメソッド、すなわち再利用性の高いメソッド

(゚ω゚) PHPを長く使う場合、PHPUnitの必要性が
(゚ω゚) 分かってくる内容だった。

http://www.atmarkit.co.jp/ait/articles/0911/12/news105.html
PHPUnitでユニットテスト (1/3)
http://www.atmarkit.co.jp/ait/articles/0911/12/news105_2.html
PHPUnitでユニットテスト (2/3)
テストが終了した際にこれらを片付ける
(゚ω゚)「・・・する際に」という書き方は、
(゚ω゚)する前なのか後なんか同時なのか分からず、読みづらい。
http://kotobank.jp/word/%E9%9A%9B
>3 物事がそうなろうとするまさにそのとき。「今わの―」「入り―」「死に―」「往生―」

テストが終了した際にこれらを片付ける
は、

テストし終わってしまった時刻へ近づこうとするときは、これらを片付ける
(゚ω゚)と、いう言い回しなので読みにくい。
(゚ω゚)「テストが終わるときは、これらを片付ける」のほうが分かり易い。
(゚ω゚)読み進むと・・
>メソッド名と実行のタイミングは以下の表のとおりです。
>メソッド名 実行のタイミング
>setUpBeforeClass() テストケース開始時
>setUp() テストメソッド実行前
>tearDown() テストメソッド実行後
>tearDownAfterClass() テストケース終了時
(゚ω゚)テストケース終了時って、
(゚ω゚)同じ言葉で書いておけば分かり易い。

>今回は例として「社員データベーステーブルへのデータアクセスクラス」を開発します。
(゚ω゚)怪文である。DBとDB内のテーブルが一個に纏められている言葉は初めて見た。
(゚ω゚)データベースとテーブルは別要素なので1つの言葉に繋げたりはしない。
(゚ω゚)「データベースの社員テーブルのアクセスクラス」と普通は書く。
(゚ω゚)「日本の東京の新宿の小田急駅」というように範囲を縮めていく書き方が分かり易い。

●PHPUnitのアサーションメソッドの一例
メソッド名説明
assertTrue($var)$varがTRUEである
assertFalse($var)$varがFALSEである
assertNull($var)$varがNULLである
assertFileExists($file)$fileが存在する
assertEquals($expect, $var)$varが$expectと等しい
assertArrayHasKey($key, $array)配列$arrayにキー$keyが存在する
assertObjectHasAttribute($attr, $object)オブジェクト$objectにプロパティ変数$attrが存在する
assertGreaterThan($expect, $var)$expect < $var が成立する
assertGreaterThanOrEqual($expect, $var)$expect <= $var が成立する
assertLessThan($expect, $var)$expect > $var が成立する
assertLessThanOrEqual($expect, $var)$expect >= $var が成立する


http://www.atmarkit.co.jp/ait/articles/0911/12/news105_3.html
PHPUnitでユニットテスト (3/3)
>% phpunit --skeleton-class EmployeeTest [Enter]
>もちろん中のロジックは実装されていませんが、次のようにテストケースで必要なメソッドを定義したクラスが一瞬で作成されるのです。

(゚ω゚)ここまで読むと、本家のマニュアルはどうなっているのか?と思う。
http://phpunit.de/manual/current/ja/index.html
PHPUnit マニュアル:


(゚ω゚)PHPUnitってNetBeansで出来るの?と疑問を持ちつつ、
(゚ω゚)まずはインストール。
ubuntu@ubuntu-VirtualBox:~/NetBeansProjects$ phpunit
プログラム 'phpunit' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install phpunit
ubuntu@ubuntu-VirtualBox:~/NetBeansProjects$ sudo apt-get install phpunit
[sudo] password for ubuntu:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
pear-channels php-codecoverage php-file-iterator php-invoker php-symfony2-yaml
php-text-template php-timer php-token-stream phpunit-mock-object phpunit-story
提案パッケージ:
phpunit-selenium
以下のパッケージが新たにインストールされます:
pear-channels php-codecoverage php-file-iterator php-invoker php-symfony2-yaml
php-text-template php-timer php-token-stream phpunit phpunit-mock-object
phpunit-story
アップグレード: 0 個、新規インストール: 11 個、削除: 0 個、保留: 11 個。
277 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,655 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe pear-channels all 0~20131124-1 [5,846 B]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-file-iterator all 1.3.1-2 [7,702 B]
取得:3 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-token-stream all 1.1.3-2 [12.4 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-text-template all 1.1.1-2 [6,070 B]
取得:5 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-codecoverage all 1.2.13+dfsg1-1 [76.5 kB]
取得:6 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-timer all 1.0.5-1 [6,016 B]
取得:7 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-invoker all 1.1.0-1 [6,134 B]
取得:8 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe php-symfony2-yaml all 2.4.1-1 [16.6 kB]
取得:9 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe phpunit-mock-object all 1.2.3-1 [23.6 kB]
取得:10 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe phpunit all 3.7.28-1 [104 kB]
取得:11 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe phpunit-story all 1.0.0-3 [11.4 kB]
277 kB を 0秒 で取得しました (286 kB/s)
以前に未選択のパッケージ pear-channels を選択しています。
(データベースを読み込んでいます ... 現在 117153 個のファイルとディレクトリがインストールされています。)
Preparing to unpack .../pear-channels_0~20131124-1_all.deb ...
Unpacking pear-channels (0~20131124-1) ...
以前に未選択のパッケージ php-file-iterator を選択しています。
Preparing to unpack .../php-file-iterator_1.3.1-2_all.deb ...
Unpacking php-file-iterator (1.3.1-2) ...
以前に未選択のパッケージ php-token-stream を選択しています。
Preparing to unpack .../php-token-stream_1.1.3-2_all.deb ...
Unpacking php-token-stream (1.1.3-2) ...
以前に未選択のパッケージ php-text-template を選択しています。
Preparing to unpack .../php-text-template_1.1.1-2_all.deb ...
Unpacking php-text-template (1.1.1-2) ...
以前に未選択のパッケージ php-codecoverage を選択しています。
Preparing to unpack .../php-codecoverage_1.2.13+dfsg1-1_all.deb ...
Unpacking php-codecoverage (1.2.13+dfsg1-1) ...
以前に未選択のパッケージ php-timer を選択しています。
Preparing to unpack .../php-timer_1.0.5-1_all.deb ...
Unpacking php-timer (1.0.5-1) ...
以前に未選択のパッケージ php-invoker を選択しています。
Preparing to unpack .../php-invoker_1.1.0-1_all.deb ...
Unpacking php-invoker (1.1.0-1) ...
以前に未選択のパッケージ php-symfony2-yaml を選択しています。
Preparing to unpack .../php-symfony2-yaml_2.4.1-1_all.deb ...
Unpacking php-symfony2-yaml (2.4.1-1) ...
以前に未選択のパッケージ phpunit-mock-object を選択しています。
Preparing to unpack .../phpunit-mock-object_1.2.3-1_all.deb ...
Unpacking phpunit-mock-object (1.2.3-1) ...
以前に未選択のパッケージ phpunit を選択しています。
Preparing to unpack .../phpunit_3.7.28-1_all.deb ...
Unpacking phpunit (3.7.28-1) ...
以前に未選択のパッケージ phpunit-story を選択しています。
Preparing to unpack .../phpunit-story_1.0.0-3_all.deb ...
Unpacking phpunit-story (1.0.0-3) ...
Processing triggers for man-db (2.6.7.1-1) ...
pear-channels (0~20131124-1) を設定しています ...
php-file-iterator (1.3.1-2) を設定しています ...
php-token-stream (1.1.3-2) を設定しています ...
php-text-template (1.1.1-2) を設定しています ...
php-codecoverage (1.2.13+dfsg1-1) を設定しています ...
php-timer (1.0.5-1) を設定しています ...
php-invoker (1.1.0-1) を設定しています ...
php-symfony2-yaml (2.4.1-1) を設定しています ...
phpunit-mock-object (1.2.3-1) を設定しています ...
phpunit (3.7.28-1) を設定しています ...
phpunit-story (1.0.0-3) を設定しています ...
ubuntu@ubuntu-VirtualBox:~/NetBeansProjects$ phpunit
PHPUnit 3.7.28 by Sebastian Bergmann.

Usage: phpunit [switches] UnitTest [UnitTest.php]
phpunit [switches]
(゚ω゚)以下、省略

https://netbeans.org/kb/docs/php/phpunit_ja.html
PHPUnitとSeleniumを使用したテスト -- NetBeans IDEチュートリアル:

>PHPUnitがインストールされたら、NetBeansで認識されます。

(゚ω゚)スケルトンジェネレータが空・・・

http://phpunit.de/manual/3.7/ja/automating-tests.html
>第1章 自動テスト

(゚ω゚)スケルトン・ジェネレータを調べたいのに載ってない。
http://phpunit.de/manual/3.7/ja/skeleton-generator.html
(゚ω゚)のURLを見つけるのに1日掛かった。

16. 雛形ジェネレータ
 テストケースクラスの雛形の作成
 テストケースクラスからのクラスの雛形の作成

(゚ω゚)この目次を見てスケルトンだと思う奴しか、マニュアルが読めない・・・

ubuntu@ubuntu-VirtualBox:/usr/share/php/PEAR$ pear install phpunit/PHPUnit_SkeletonGenerator
WARNING: configuration download directory "/build/buildd/php5-5.5.9+dfsg/pear-build-download" is not writeable. Change download_dir config variable to a writeable dir to avoid this warning
WARNING: channel "pear.phpunit.de" has updated its protocols, use "pear channel-update pear.phpunit.de" to update
Cannot install, php_dir for channel "pear.phpunit.de" is not writeable by the current user
(゚ω゚)rootでヤレ。ということか・・

ubuntu@ubuntu-VirtualBox:/usr/share/php/PEAR$ sudo pear install phpunit/PHPUnit_SkeletonGenerator
[sudo] password for ubuntu:
WARNING: channel "pear.phpunit.de" has updated its protocols, use "pear channel-update pear.phpunit.de" to update
Unknown remote channel: components.ez.no
phpunit/PHPUnit_SkeletonGenerator requires package "channel://components.ez.no/ConsoleTools" (version >= 1.6)
No valid packages found
install failed
ubuntu@ubuntu-VirtualBox:/usr/share/php/PEAR$ sudo pear channel-discover components.ez.no
Adding Channel "components.ez.no" succeeded
Discovery of channel "components.ez.no" succeeded
ubuntu@ubuntu-VirtualBox:/usr/share/php/PEAR$ sudo pear install components.ez.no/ConsoleTools
downloading ConsoleTools-1.6.1.tgz ...
Starting to download ConsoleTools-1.6.1.tgz (869,994 bytes)
.........................................................done: 869,994 bytes
downloading Base-1.8.tgz ...
Starting to download Base-1.8.tgz (236,357 bytes)
...done: 236,357 bytes
install ok: channel://components.ez.no/Base-1.8
install ok: channel://components.ez.no/ConsoleTools-1.6.1
ubuntu@ubuntu-VirtualBox:/usr/share/php/PEAR$ sudo pear install phpunit/PHPUnit_SkeletonGenerator
WARNING: channel "pear.phpunit.de" has updated its protocols, use "pear channel-update pear.phpunit.de" to update
downloading PHPUnit_SkeletonGenerator-1.2.1.tgz ...
Starting to download PHPUnit_SkeletonGenerator-1.2.1.tgz (11,376 bytes)
.....done: 11,376 bytes
install ok: channel://pear.phpunit.de/PHPUnit_SkeletonGenerator-1.2.1

(゚ω゚)PHPUnit_SkeletonGeneratorが入った!

■参考URL
http://tm.root-n.com/programming:php:phpunit:install#phpunit_skeletongenerator_%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
PHPUnit のインストールとはじめの一歩
PHPUnit_SkeletonGenerator のインストール

http://pear.php.net/manual/ja/guide.users.commandline.channels.php
チャネルとは、パッケージの取得元のことです。
チャネルを使う前に、まずそのチャネルを pear に登録しなければなりません。 このことを "channel discovery" と言います。

@assert注釈と、入力と出力の例を使用したコメント・ブロックを追加


(゚ω゚)次は、PhpProjectにフォルダを追加した。こんな風に。


(゚ω゚)次は、
https://netbeans.org/kb/docs/php/phpunit_ja.html
PHPUnitテストの作成と実行
3.「プロジェクト」ウィンドウで「Calculator.php」ノードを右クリックし、「ツール」>「PHPUnitテストを作成」を選択します。

「PhpProject6のディレクトリを選択」画面のOKを押すと、
一瞬、ウィンドウ表示がトーンダウンしてから、calculatorTest.phpが作成されます。


/**
* Generated by PHPUnit_SkeletonGenerator 1.2.1 on 2014-05-04 at 22:43:53.
*/
class CalculatorTest extends PHPUnit_Framework_TestCase {

/**
* @var Calculator
*/
protected $object;

/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
protected function setUp() {
$this->object = new Calculator;
}

/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown() {

}

/**
* Generated from @assert (0, 0) == 0.
*
* @covers Calculator::add
*/
public function testAdd() {
$this->assertEquals(
0, $this->object->add(0, 0)
);
}

/**
* Generated from @assert (0, 1) == 1.
*
* @covers Calculator::add
*/
public function testAdd2() {
$this->assertEquals(
1, $this->object->add(0, 1)
);
}

/**
* Generated from @assert (1, 0) == 1.
*
* @covers Calculator::add
*/
public function testAdd3() {
$this->assertEquals(
1, $this->object->add(1, 0)
);
}

/**
* Generated from @assert (1, 1) == 2.
*
* @covers Calculator::add
*/
public function testAdd4() {
$this->assertEquals(
2, $this->object->add(1, 1)
);
}

/**
* Generated from @assert (50, param2) == expectedResult.
*
* @covers Calculator::add
*/
public function testAdd5() {
$this->assertEquals(
expectedResult, $this->object->add(50, param2)
);
}

}


(゚ω゚) 動かしてみると、エラー発生
■テストを作成
"/usr/bin/php" "/usr/bin/phpunit-skelgen" "--test" "--" "Calculator" "/home/ubuntu/NetBeansProjects/PhpProject6/Calculator.php" "CalculatorTest" "/home/ubuntu/NetBeansProjects/PhpProject6/Calculator/CalculatorTest.php"
PHPUnit Skeleton Generator 1.2.1 by Sebastian Bergmann.

Wrote skeleton for "CalculatorTest" to "/home/ubuntu/NetBeansProjects/PhpProject6/Calculator/CalculatorTest.php".
完了。

■テスト
"/usr/bin/php" "/usr/bin/phpunit" "--colors" "--log-junit" "/tmp/nb-phpunit-log.xml" "/home/ubuntu/netbeans-8.0/php/phpunit/NetBeansSuite.php" "--run=/home/ubuntu/NetBeansProjects/PhpProject6/Calculator/CalculatorTest.php"
PHPUnit 3.7.28 by Sebastian Bergmann.

PHP Fatal error: Class 'Calculator' not found in /home/ubuntu/NetBeansProjects/PhpProject6/Calculator/CalculatorTest.php on line 18

(゚ω゚)原因は、この辺りだろう。
http://phpunit.de/manual/3.7/ja/skeleton-generator.html
名前空間つきのクラスと雛形ジェネレータ

名前空間 内で宣言されたクラス用のコードを雛形ジェネレータで生成する際には、 そのクラスの修飾名とクラスが宣言されているソースファイルへのパスを渡さなければなりません。

phpunit-skelgen --test -- "project/Calculator" Calculator.php



(゚ω゚) "project/Calculator" を付けずに生成したからか?と思ったが、
(゚ω゚) 原因は別にあった。

http://phpunit.de/manual/3.7/ja/skeleton-generator.html
作成されたテストケースクラスを実行した結果を以下に示します。

phpunit --bootstrap Calculator.php --verbose CalculatorTest
PHPUnit 3.7.0 by Sebastian Bergmann.

(゚ω゚)--bootstrapオプションに、今回作成したCalculatorクラスを定義したphpファイルを渡さなければならなかった。


(゚ω゚)テストした時の、出力ウィンドウの内容。

"/usr/bin/php" "/usr/bin/phpunit" "--colors" "--log-junit" "/tmp/nb-phpunit-log.xml" "--bootstrap" "/home/ubuntu/NetBeansProjects/PhpProject6/Calculator.php" "/home/ubuntu/netbeans-8.0/php/phpunit/NetBeansSuite.php" "--run=/home/ubuntu/NetBeansProjects/PhpProject6/PHPUnit"
PHPUnit 3.7.28 by Sebastian Bergmann.

...F.E

Time: 429 ms, Memory: 4.25Mb

There was 1 error:

1) CalculatorTest::testAdd6
Use of undefined constant expectedResult - assumed 'expectedResult'

/home/ubuntu/NetBeansProjects/PhpProject6/PHPUnit/CalculatorTest.php:91

--


There was 1 failure:

1) CalculatorTest::testAdd4
Failed asserting that 2 matches expected 3.

/home/ubuntu/NetBeansProjects/PhpProject6/PHPUnit/CalculatorTest.php:70

FAILURES!
Tests: 6, Assertions: 5, Failures: 1, Errors: 1.

完了。

(゚ω゚) expectedResultは、
(゚ω゚)テストが作りかけのテスト項目。
(゚ω゚)全て入力すると、こんな風にテストはエラーも無く完了する。



(゚ω゚)テストが終わったら、
コード・カバレージ
も見ないとネェ・・

(゚ω゚)PHPUnitを使うには、関数名を数字終わりにしては駄目。
(゚ω゚)駄目な理由は、下記の赤い部分をPHPUnitが、
(゚ω゚)スケルトン(雛形)関数を作成するために使っているから。


/**
* Generated from @assert ("12", "2") == "14".
*
* @covers Calculator::add
*/
public function testAdd8() {
$this->assertEquals(
"14", $this->object->add("12", "2")
);
}



(゚ω゚)テストするクラスが複数に増えたら、bootstrap.phpに纏めるのだろうね。