MakeGoodが動かないを解決するアプローチ(Windows8+Apache+PHPUnit on x64)
Windows環境でEclipseのMakeGoodを使ったテスト駆動開発環境の構築に苦戦しましたが、
無事動く環境の構築が完了しましたので共有しておきます。
情報が多いようでどれも断片的だったり環境が違ったりで、
なかなか必要な情報にありつくことができませんが結論は簡単でした。
概要
MakeGoodのWindows環境構築の結論
環境自体は人それぞれで全く同じという事は皆無だと思いますが、
結論から申しますと、MakeGoodを使うなら大きくは以下の2点が注意点のはずです。
- PHPUnitはComposerでインストールする(.pharファイル指定ではうまくいかない)
- 「piece/stagehand-testrunner」を追加でインストールする。
その為のcomposer.json設定は以下のようになりました。
1 2 3 4 5 6 7 8 9 10 |
{ "require-dev": { }, "require": { "phpunit/phpunit": "5.*", "phpunit/phpunit-skeleton-generator": "*", "piece/stagehand-testrunner": "4.2.*" } } |
尚、私の現在開発環境はPHP5.6であるため、
PHPUnitも対応するバージョンの最終版5.7.27をインストールします。
※PHPUnit6 以降は、PHP7が必要になります。
この点以外は他のサイトで紹介されているインストール手順と、
概ね同じステップでインストールする事ができます。
MakeGoodのエラー解消までの一連の右往左往
先に結論というか対策をご紹介してしまいましたが、
そこに至るまでには以下の様な過程で何度も試すという苦行となってしまいました。
何だかんだで3日は行き詰っていたように思います。
phpunit、skeleton-generatorをインストール
phpunit、skeleton-generatorをComposerを利用してインストールするには、
当然ですがComposer(パッケージ管理ツール)のインストールが済んでいる必要があります。
phpunit、skeleton-generatorをインストールすると、
以下のように依存するパッケージが展開されてインストールされます。
composer.json
1 2 3 4 5 6 |
{ "require-dev": { "phpunit/phpunit": "5.*", "phpunit/phpunit-skeleton-generator": "*" } } |
コマンドプロンプトによる実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
C:\composer>composer update Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 30 installs, 0 updates, 0 removals - Installing symfony/yaml (v3.3.16): Loading from cache - Installing sebastian/version (1.0.6): Loading from cache - Installing sebastian/resource-operations (1.0.0): Loading from cache - Installing sebastian/recursion-context (2.0.0): Loading from cache - Installing sebastian/object-enumerator (2.0.1): Loading from cache - Installing sebastian/global-state (1.1.1): Loading from cache - Installing sebastian/exporter (2.0.0): Loading from cache - Installing sebastian/environment (2.0.0): Loading from cache - Installing sebastian/diff (1.4.3): Loading from cache - Installing sebastian/comparator (1.2.4): Loading from cache - Installing doctrine/instantiator (1.0.5): Loading from cache - Installing phpunit/php-text-template (1.2.1): Loading from cache - Installing phpunit/phpunit-mock-objects (3.4.4): Loading from cache - Installing phpunit/php-timer (1.0.9): Loading from cache - Installing phpunit/php-file-iterator (1.4.5): Loading from cache - Installing sebastian/code-unit-reverse-lookup (1.0.1): Loading from cache - Installing phpunit/php-token-stream (1.4.12): Loading from cache - Installing phpunit/php-code-coverage (4.0.8): Loading from cache - Installing webmozart/assert (1.3.0): Loading from cache - Installing phpdocumentor/reflection-common (1.0.1): Loading from cache - Installing phpdocumentor/type-resolver (0.4.0): Loading from cache - Installing phpdocumentor/reflection-docblock (3.3.2): Loading from cache - Installing phpspec/prophecy (1.7.6): Loading from cache - Installing myclabs/deep-copy (1.7.0): Loading from cache - Installing phpunit/phpunit (5.7.27): Loading from cache - Installing symfony/polyfill-mbstring (v1.8.0): Loading from cache - Installing psr/log (1.0.2): Loading from cache - Installing symfony/debug (v3.0.9): Loading from cache - Installing symfony/console (v2.8.39): Loading from cache - Installing phpunit/phpunit-skeleton-generator (2.0.1): Loading from cache sebastian/global-state suggests installing ext-uopz (*) phpunit/phpunit suggests installing phpunit/php-invoker (~1.1) symfony/console suggests installing symfony/event-dispatcher () symfony/console suggests installing symfony/process () symfony/console suggests installing psr/log-implementation (For using the consol e logger) Package phpunit/phpunit-skeleton-generator is abandoned, you should avoid using it. No replacement was suggested. Writing lock file Generating autoload files C:\composer> |
ちなみに上記の
1 2 3 |
Package phpunit/phpunit-skeleton-generator is abandoned, you should avoid using it. No replacement was suggested. Writing lock file |
の部分で表示されているものはバグによるもののようで、
特に問題はないとのコミュニティー見解が回答されています。
Just after posting, I noticed that it was not a problem at all
(G訳)投稿した直後に、私はそれがまったく問題ではないことに気づいた(引用)Package phpunit/phpunit-skeleton-generator is abandoned – The Bug Genie forums
「piece/stagehand-testrunner」【インストール前】のテスト実行
この状態で本来は動くはずなのですが、
MakeGoodでテストを実行するとEclipseコンソールにはエラーが表示されます。
エラーの中でも下の方に「Stagehand\TestRunner\DependencyInjection\…」と見えていますが、
当初は「Symfony\Component\…」の方ばかりを見ていて、
「Symfony」なんて使ってないけどなぁ・・と右往左往しました。
「Symfony」は使っていなくても
「phpunit/phpunit」をこComposerでインストールすると、
「- Installing symfony/yaml (v3.3.16): Loading from cache」のように、
一部のコンポーネントが依存関係でインストールされてきます。
ですので、その兼ね合いでエラーが出ているようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Fatal error: Call to undefined method PHPUnit_Util_Configuration::getSeleniumBrowserConfiguration() in C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\Preparer\PHPUnitPreparer.php on line 128 Call Stack: 0.0004 264776 1. {main}() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\bin\testrunner.php:0 0.0180 1106952 2. Symfony\Component\Console\Application->run() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\bin\testrunner.php:55 0.0361 1642104 3. Symfony\Component\Console\Application->doRun() C:\composer\vendor\symfony\console\Application.php:117 0.1114 3674616 4. Symfony\Component\Console\Application->doRunCommand() C:\composer\vendor\symfony\console\Application.php:193 0.1115 3675200 5. Symfony\Component\Console\Command\Command->run() C:\composer\vendor\symfony\console\Application.php:843 0.1134 3685984 6. Stagehand\TestRunner\CLI\TestRunnerApplication\Command\PluginCommand->execute() C:\composer\vendor\symfony\console\Command\Command.php:242 0.1668 4975800 7. Stagehand\TestRunner\CLI\TestRunnerApplication\Command\PluginCommand->createTestRunner() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\CLI\TestRunnerApplication\Command\PluginCommand.php:149 0.1668 4975928 8. Stagehand\TestRunner\Core\ApplicationContext->createComponent() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\CLI\TestRunnerApplication\Command\PluginCommand.php:295 0.1668 4975992 9. Stagehand\ComponentFactory\ComponentFactory->create() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\Core\ApplicationContext.php:104 0.1668 4976496 10. Symfony\Component\DependencyInjection\Container->get() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-componentfactory\src\Stagehand\ComponentFactory\ComponentFactory.php:76 0.1669 4977088 11. Stagehand\TestRunner\DependencyInjection\PHPUnitContainer->getTestRunnerService() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\symfony\dependency-injection\Symfony\Component\DependencyInjection\Container.php:312 0.1711 5042728 12. Stagehand\TestRunner\Process\TestRunner->__construct() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\DependencyInjection\PHPUnitContainer.php:446 0.1711 5042800 13. Stagehand\TestRunner\Preparer\PHPUnitPreparer->prepare() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\Process\TestRunner.php:89 0.1741 5312240 14. Stagehand\TestRunner\Preparer\PHPUnitPreparer->earlyConfigure() C:\eclipse_kepler\plugins\com.piece_framework.makegood.stagehandtestrunner_3.1.1.v201409021510\resources\php\vendor\piece\stagehand-testrunner\src\Preparer\PHPUnitPreparer.php:68 |
早くに「piece/stagehand-testrunner」の方に気づけば良かったのですが、
以下の回答を見るまで気づくことができませんでした。
ヒントになった関連情報
Stack Overflowの回答欄では、
以下のように記述して動かしていると紹介されています。
PHPUnit test in Eclipse 4.2 using Makegood is not running – Stack Overflow
This is my composer.json(以下はうまくいってないという例)
1234567 ..."require-dev":{"phpunit/phpunit": "4.1.*","piece/stagehand-testrunner": ">=3.6.1"},...(略)
Answer
The composer
12345678910111213 {"require-dev": {"phpunit/php-code-coverage": "3.0.*@dev","phpunit/phpunit-mock-objects": "2.3.*@dev","sebastian/global-state": "1.0.*@dev","phpunit/phpunit": "4.4.*@dev","piece/stagehand-testrunner": "4.1.*@dev","phpunit/phpunit-skeleton-generator": "2.0.*@dev"},"require": {"mikey179/vfsStream": "1.4.*@dev"}}As well as the latest version of makegood and everything now works as expected.
Works on Kepler and Luna(引用)php – PHPUnit test in Eclipse 4.2 using Makegood is not running – Stack Overflow
上記によれば「phpunit/phpunit」コンポーネントだけでなく、
個別に様々なものをインストールするように設定しています。
しかし、上記のcomposer.json指定で、
「phpunit/phpunit-skeleton-generator」「piece/stagehand-testrunner」以外は、
「phpunit/phpunit」のインストールを指定すると自動的にインストールされます。
※30は個別に「phpunit/phpunit-skeleton-generator」指定したもの。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
- Installing symfony/yaml (v3.3.16): Loading from cache - Installing sebastian/version (1.0.6): Loading from cache - Installing sebastian/resource-operations (1.0.0): Loading from cache - Installing sebastian/recursion-context (2.0.0): Loading from cache - Installing sebastian/object-enumerator (2.0.1): Loading from cache - Installing sebastian/global-state (1.1.1): Loading from cache - Installing sebastian/exporter (2.0.0): Loading from cache - Installing sebastian/environment (2.0.0): Loading from cache - Installing sebastian/diff (1.4.3): Loading from cache - Installing sebastian/comparator (1.2.4): Loading from cache - Installing doctrine/instantiator (1.0.5): Loading from cache - Installing phpunit/php-text-template (1.2.1): Loading from cache - Installing phpunit/phpunit-mock-objects (3.4.4): Loading from cache - Installing phpunit/php-timer (1.0.9): Loading from cache - Installing phpunit/php-file-iterator (1.4.5): Loading from cache - Installing sebastian/code-unit-reverse-lookup (1.0.1): Loading from cache - Installing phpunit/php-token-stream (1.4.12): Loading from cache - Installing phpunit/php-code-coverage (4.0.8): Loading from cache - Installing webmozart/assert (1.3.0): Loading from cache - Installing phpdocumentor/reflection-common (1.0.1): Loading from cache - Installing phpdocumentor/type-resolver (0.4.0): Loading from cache - Installing phpdocumentor/reflection-docblock (3.3.2): Loading from cache - Installing phpspec/prophecy (1.7.6): Loading from cache - Installing myclabs/deep-copy (1.7.0): Loading from cache - Installing phpunit/phpunit (5.7.27): Loading from cache - Installing symfony/polyfill-mbstring (v1.8.0): Loading from cache - Installing psr/log (1.0.2): Loading from cache - Installing symfony/debug (v3.0.9): Loading from cache - Installing symfony/console (v2.8.39): Loading from cache - Installing phpunit/phpunit-skeleton-generator (2.0.1): Loading from cache |
ですので、composer.json指定方法の違いだけで、
「phpunit/phpunit」のインストールとほぼ同じことをしていると言えます。
明らかに違っていたのが「piece/stagehand-testrunner」の指定の有無でした。
※上記Stack Overflowで動かないと言っている原因は不明。
という訳で、インストールを行います。
「piece/stagehand-testrunner」の導入を試行
「piece/stagehand-testrunner」は最新(2018/05/16現在)は「v4.2.0」でした。
要件は以下のように書かれています。
PHP5.6でも問題なさそうなので、インストールを行います。
requires
- php: >=5.3.3
- ext-dom: *
- ext-mbstring: *
- ext-pcre: *
- ext-spl: *
- piece/stagehand-alterationmonitor: ~2.0
- piece/stagehand-componentfactory: ~1.0
- sebastian/version: ~1.0
- symfony/config: ~2.0
- symfony/console: ~2.0
- symfony/dependency-injection: ~2.0
- symfony/finder: ~2.0
- symfony/process: ~2.0
- symfony/yaml: ~2.0
requires (dev)
- phake/phake: 1.0.*
- phpunit/phpunit: >=3.7.0
Composer.jsonに追記します。
1 2 3 4 5 |
"require": { "phpunit/phpunit": "5.*", "phpunit/phpunit-skeleton-generator": "*", "piece/stagehand-testrunner": "4.2.*" } |
次に、コマンドプロンプトからUpdateを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
C:\composer>composer update Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 8 installs, 1 update, 0 removals - Updating symfony/yaml (v3.3.16 => v2.8.39): Loading from cache - Installing symfony/process (v2.8.39): Loading from cache - Installing symfony/finder (v2.8.39): Loading from cache - Installing symfony/dependency-injection (v2.8.39): Downloading (connecting.. Downloading (100%) - Installing symfony/filesystem (v3.0.9): Loading from cache - Installing symfony/config (v2.8.39): Loading from cache - Installing piece/stagehand-componentfactory (v1.0.1): Downloading (connectin Downloading (100%) - Installing piece/stagehand-alterationmonitor (2.0.0): Downloading (connectin Downloading (100%) - Installing piece/stagehand-testrunner (v4.2.0): Downloading (100%) symfony/dependency-injection suggests installing symfony/expression-language (Fo r using expressions in service container configuration) symfony/dependency-injection suggests installing symfony/proxy-manager-bridge (G enerate service proxies to lazy load them) Package phpunit/phpunit-skeleton-generator is abandoned, you should avoid using it. No replacement was suggested. Writing lock file Generating autoload files C:\composer> |
無事インストールが完了しました。
これでエラーが消えてくれるといいのですが。
MakeGoodのテスト実行確認
では、実行を行います。
既に設定をいろいろ行っていますが、また別記します。
無事、1/5のエラーとして表示され、テストが正常に行われている事が確認できました。
これで晴れて、Eclipseの環境設定例のご紹介に戻る事ができる^^
ここに至るまでの調査期間ほぼ3日。
テスト駆動開発でサクサクテストが何度でも回せる毎日、プライスレス・・・orz
テストのエラー確認と修正
上記ではテスト結果失敗が発生していますが、
テスト失敗の内容はコンソールタブの出力から確認ができます。
またテストケース側のソースでも該当箇所に「×」が表示されています。
通常はテストケースは正しく、処理ソース側に問題があるはずですが、
ここではテストケースの答えを誤らせてテスト失敗を生成していましたので、
テストケースの答えを正しく修正します。
テストを再実行するとすべてのテストが成功したことがコンソールで確認できます。
またMakeGoodタブのプログレスバーがグリーン表示になります。
ちなみに・・・
「PHPUnit_Framework_TestCase クラスが利用できません。」って表示は?
この状態では「PHPUnit_Framework_TestCase クラスが利用できません。」と、
表示されている状態になっているかもしれません。
この表示自体がされていても、
設定が正しく行えているのであれば実行ボタンは有効でテスト実行を行う事はできます。
どうしても消したいという事であれば、以下手順で消せますが、
ComposerでPHPUnitをインストールしている以上は、
この表示があっても特に不都合な事は無いと言えます。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: