PHP

適当なドライブの直下に解凍します。私はOSが入っているドライブ以外のドライブ、今回はDドライブに入れています。再インストールしたときも、資材とかをそのまま使えるし、Eclipseはそのまま動くので。pleiades-e4.4-ultimate-jre_20150310.zipを解凍します。zipファイルの中は、pleiadesってフォルダがあるので、それをDドライブに解凍します。2時間以上かかりました。直下にできているxamppは消します

xamppをインストールします。xampp-win32-5.6.30-0-VC11-installer.exeをクリック

インストールする場所をeclipseを格納したディレクトリにします。

終わったら最新のWordpressを、ドライブ:/xampp/htdocsの下に入れておきます。今回は「yoyaku」って名前にしています。

xamppコントロールパネルを開きます。xamppをインストールしたディレクトリ直下に「xampp-controle.exe」があると思います。Windows10ではスタートから起動できました。

「Shell」をクリックします。アプリケーションエラー(0cx0000142)がでたので、Pathを通して、Dosコマンドから以下を行います。Pathはxampp\phpとxampp\php\Vendor\binに通します。

 

pear listでPHPUnitがあれば、pear uninstall phpunitでアンストール。phpunit2ってのもあれば同様に。昔は入っていたような気がするのですが、今回はありませんでした。

# pear list
INSTALLED PACKAGES, CHANNEL PEAR.PHP.NET:
=========================================
PACKAGE VERSION STATE
Archive_Tar 1.4.0 stable
Console_Getopt 1.4.1 stable
PEAR 1.10.1 stable
Structures_Graph 1.1.1 stable
XML_Util 1.3.0 stable

xampp/php/pear配下にある、PHPUnitとPHPUNIT2を削除します。
xampp/php配下にある、phpunitとphpunit.batを削除します。

composer.pharをxampp/php配下に入れます。

composer.jsonという名前でxampp/php配下にファイルを作成します。中身は以下を設定します。最新のバージョン(5.6)ではうまくいかなかったので以前うまくいったバージョンを指定しています。

{
 "require-dev": {
 "phpunit/phpunit": "4.5.*"
 }
}

xampp/php配下に移り、php composer.phar installでインストールします。

php Composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 21 installs, 0 updates, 0 removals
 - Installing symfony/yaml (v2.8.22): Loading from cache
 - Installing sebastian/version (1.0.6): Loading from cache
 - Installing sebastian/global-state (1.1.1): Loading from cache
 - Installing sebastian/recursion-context (1.0.5): Loading from cache
 - Installing sebastian/exporter (1.2.2): Loading from cache
 - Installing sebastian/environment (1.3.8): 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 (2.3.8): Loading from cache
 - Installing phpunit/php-timer (1.0.9): Loading from cache
 - Installing phpunit/php-file-iterator (1.3.4): Loading from cache
 - Installing phpunit/php-token-stream (1.4.11): Loading from cache
 - Installing phpunit/php-code-coverage (2.2.4): Loading from cache
 - Installing webmozart/assert (1.2.0): Loading from cache
 - Installing phpdocumentor/reflection-common (1.0): Loading from cache
 - Installing phpdocumentor/type-resolver (0.2.1): Loading from cache
 - Installing phpdocumentor/reflection-docblock (3.1.1): Loading from cache
 - Installing phpspec/prophecy (v1.7.0): Loading from cache
 - Installing phpunit/phpunit (4.5.1): Loading from cache
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit-mock-objects suggests installing ext-soap (*)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
Writing lock file
Generating autoload files

php –versionとphpunit –versionで確認します。

php --version
PHP 5.6.30 (cli) (built: Jan 18 2017 19:48:22)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
 with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
phpunit --version
PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

php_xdebug-2.5.5-5.6-vc11.dllをphp_xdebug.dllという名前でxampp/php/ext配下に入れます。2.5.5~の部分はダウンロードしてきたバージョンによって変わります。→もしかしたら既に入っている場合もあり。その場合は、とりあえずそのままで。

Xdebugを有効にします。xampp/php/php.iniの最終行に以下を追加します。「ドライブ」は適宜変更します(以下、同様)。

[XDebug]
zend_extension = "ドライブ:\xampp\php\ext\php_xdebug.dll"
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "ドライブ:\xampp\tmp"
xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.trace_output_dir = "ドライブ:\xampp\tmp"

xamppコントロールパネルで、ApacheとMysqlをスタートします。

WordPressをインストールします。/localhost/yoyakuでインストールできた前提で以下を進めます。DBは2つ(ここではWP01とWP02とします)作っておきます。ひとつはWP01でインストール用に使用し、WP02はPHPUnit用に使います。

eclipseを起動します。初回はPythonの変更云々が表示されるが、適用します。「ウィンドウ」→「パースペクティブを開く」→「その他」から「PHP」を選択しておきます。

「ウィンドウ」→「設定」→「PHP」→「PHP実行可能ファイル」を開くとエラーがでますが、「OK」で続行します。

追加ボタンをクリックし、以下のように設定します。ドライブは適宜読み替えてください。PHPデバッガーをXdebugに変えます。「完了」→「OK」クリックで設定を閉じます。

「ヘルプ」→「新規ソフトウェアのインストール」を選択し、「追加」クリック、「名前」に「makegood」を、「作業対象」に「http://eclipse.piece-framework.com/」を入力し、OKクリック。一覧に「MakeGood」がでてきます。

「MakeGood」を選択し、「次へ」をクリックしてしばし待つ。「インストール詳細」は「次へ」、「ライセンスのレビュー」は同意して「完了」をクリック。証明書を信頼するかって問いには、チェックして「OK」クリックで続行。

再起動のメッセージには「はい」クリックでしばし待つ。再起動したら「ウィンドウ」→「ビューの表示」→「その他」を選択して、MakeGoodがあればOK。

wordpressのテスト用ライブラリをwordpress-tests-libという名前でxampp/htdocs配下にコピーします。

wordpress-tests-lib配下のwp-tes-config-sampleをwp-tests-config.phpという名前でコピーして、ABSPATHを変更します。Wordpressをインストールした時に2つDBを作りました。そのうち、Wordpressで使用していないWP02をDB_NAMEに設定します。

wp-tests-config.php

<?php

/* Path to the WordPress codebase you'd like to test. Add a forward slash in the end. */
define( 'ABSPATH', 'ドライブ:/xampp/htdocs/yoyaku/' );

/*
 * Path to the theme to test with.
 *
 * The 'default' theme is symlinked from test/phpunit/data/themedir1/default into
 * the themes directory of the WordPress install defined above.
 */
define( 'WP_DEFAULT_THEME', 'default' );

// Test with multisite enabled.
// Alternatively, use the tests/phpunit/multisite.xml configuration file.
// define( 'WP_TESTS_MULTISITE', true );

// Force known bugs to be run.
// Tests with an associated Trac ticket that is still open are normally skipped.
// define( 'WP_TESTS_FORCE_KNOWN_BUGS', true );

// Test with WordPress debug mode (default).
define( 'WP_DEBUG', true );

// ** MySQL settings ** //

// This configuration file will be used by the copy of WordPress being tested.
// wordpress/wp-config.php will be ignored.

// WARNING WARNING WARNING!
// These tests will DROP ALL TABLES in the database with the prefix named below.
// DO NOT use a production database or one that is shared with something else.

define( 'DB_NAME', 'wp02' );
define( 'DB_USER', 'root' );
define( 'DB_PASSWORD', '' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );

$table_prefix = 'wp_'; // Only numbers, letters, and underscores please!

define( 'WP_TESTS_DOMAIN', 'example.org' );
define( 'WP_TESTS_EMAIL', 'admin@example.org' );
define( 'WP_TESTS_TITLE', 'Test Blog' );

define( 'WP_PHP_BINARY', 'php' );

define( 'WPLANG', '' );

インストールしたWordpressのトップディレクトリ直下に、preload.phpを作ります。

preload.php

<?php
require_once 'ドライブ:\xampp\php\vendor\autoload.php';

今回はテスト用にプラグインディレクトリ配下に「mewmew」という名前のプラグインを、以下のファイル及びディレクトリ構成で作ります。

mewmew直下

名前 内容 場所
mewmew.php プラグイン本体 mewmew
readme.txt 必須ファイル mewmew
phpunit.xml phpunitで使用するファイル mewmew
tests テストコードを格納するディレクトリ mewnew
bootstrap.php phpunitで使用するファイル mewmew/tests
10shortcode テストコードを分類するディレクトリ mewmew/tests
shor01Test.php mewmew.phpのmewmew_shortcodeをテストするコード mewmew/tests/10shortcode
20shortcode テストコードを分類するディレクトリ mewmew/tests

mewmew.php

<?php
/*
Plugin Name: mewmew
Version: 0.0.0
*/

$mewmew = new mewmew();

class mewmew {

public function __construct() {
 add_action( 'admin_menu', array( &$this, 'admin_menu' ) );
 add_shortcode('nekoneko', array( &$this, 'mewmew_shortcode'));
 }

public function mewmew_shortcode($atts) {
 echo '<div id="mewmew_echo"><h1>mewmew</h1>';
 }

public function admin_menu() {
 add_menu_page( 'mewmew menu', 'mewmew menu', 'edit_posts', 'mewmew menu', array( &$this,'show_menu' ));
 }

public function show_menu() {
 echo '<div id="admin_mewmew_echo"><h1>admin mewmew</h1>';
 }
}
?>

readme.txt

=== mewmew ===
Contributors: Kuu
Stable tag: 0.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

phpunit.xml

以下ではコメントにしていますが、<logging>を有効にするとカバレッジが表示されます。結構時間がかかるので、私は必要なとき以外は実行していません。その下の<filter>はカバレッジの対象とするファイルです。コメントにしていますが、プラグインの構成が階層になっている場合は、direcotryでの指定も可能です。詳細は、以下を参照するとよいと思います。
https://phpunit.de/manual/current/ja/appendixes.configuration.html

<phpunit
 bootstrap="tests/bootstrap.php"
 backupGlobals="false"
 colors="true"
 convertErrorsToExceptions="true"
 convertNoticesToExceptions="true"
 convertWarningsToExceptions="true"
 >
 <testsuites>
 <testsuite>
 <directory suffix=".php">tests/10shortcode</directory>
 <directory suffix=".php">tests/20admin</directory>
 </testsuite>
 </testsuites>
<!--

<logging>
 <log charset="UTF-8" highlight="true" highlowerbound="70" lowupperbound="35" target="coverage/report" type="coverage-html" >
 </log>
 </logging>
-->
<filter>
 <whitelist processUncoveredFilesFromWhitelist="true">
<!--
 <directory suffix=".php">./src/control/</directory>
-->
 <file>./mewmew.php</file>
 </whitelist>
</filter>

</phpunit>

bootstrap.php

PHPUnitでプラグインのテスト用に設定したい項目のために用意します。$_test_dirにwordpress_tests_libのフルパスを設定します。

<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);

$_tests_dir = 'ドライブ:\xampp\htdocs\wordpress-tests-lib';

require_once $_tests_dir . '\includes\functions.php';

$_SESSION = "session dummy";

$_SERVER['REMOTE_ADDR'] = "remote address dummy";
$_SERVER['HTTP_REFERER'] = "http referer dummy";
$_SERVER['HTTP_USER_AGENT'] = "http user angent dummy";

function _manually_load_plugin() {
 require dirname( dirname( __FILE__ ) ) . '\mewmew.php';
}
tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );

require $_tests_dir . '\includes\bootstrap.php';

short01Test.php

<?php

class Short01Test extends WP_Ajax_UnitTestCase {


 public function setUp()
 {
 parent::setUp();
 }

 public function tearDown() {
 parent::tearDown();

 }

 public static function setUpBeforeClass() {
 parent::setUpBeforeClass();
 }

 public static function tearDownAfterClass() {
 parent::tearDownAfterClass();
 }

 /**
 * @Test
 */
 function test_初期表示_(){

 $_POST = array();
 $_GET = array();

 ob_start();
 do_shortcode( "[nekoneko]" );
 $feed = ob_get_clean();
 //
 $start = strpos($feed,'<div id="mewmew_echo');
 //Javascriptの部分をパースするとタグを書き込んでいる部分でエラーになる
 $body = substr($feed,$start);
 $domDocument = new DOMDocument();
 $domDocument->loadHTML($body);
 $xml = $domDocument->saveXML();

 $xmlObject = simplexml_load_string($xml);
 $htmlarray = json_decode(json_encode($xmlObject), true);
 $actual = $htmlarray['body']['div']['@attributes']['id'];

 $this->assertEquals("mewmew_echo",$actual);
 }

}

ここまでできたらeclipseの「ファイル」→「新規」→「PHPプロジェクト」を選択し、「内容」の「既存ロケーションにプロジェクトを作成」をチェックして、先ほどインストールしたwordpressのトップディレクトリを「ディレクトリ」に設定します。「ドライブ:xampp/htdocs/yoyaku」を設定するはずです。完了」クリックでeclipse上に展開されます。

ここまででeclipse上は以下のようになっているはずです。

eclipseでプロジェクトのプロパティを表示します(トップディレクトリを選択してALT+ENTERなど)。「MakeGood」を選択し、「一般」タブの「テストフォルダー」に「/yoyaku/wp-content/plugins/mewmew/tests」を、「プリロードスクリプト」に「/yoyaku/preload.php」を設定します。

「PHPUnit」タブを選択し、「XML設定ファイル」に「/yoyaku/wp-content/plugins/mewmew/phpunit.xml」を設定し、「OK」クリック。

eclipseでプロジェクトのプロパティを表示します。「PHP」を選択し、さらに「インクルード・パス」を選択します。「ライブラリ」タブを選択し、「ライブラリの追加」をクリックします。

さらに「構成」をクリックし、「ユーザ・ライブラリ名」に「PHPUnit」を設定し、「OK」クリック。

「外部フォルダの追加」をクリックし、フォルダ選択画面で、「ドライブ:/xampp/php/vendor/phpunit」を指定し、「OK」をクリック。

 こんな感じになっているはずです。「OK」をクリック。

「ウィンドウ」→「設定」→「一般」の「Webブラウザで外部ブラウザを使用」をチェックします。単に試験でChromeを使いたいためです。

試しに動かしてみます。mewmewを有効にした後、Wordpressの固定ページにサンプルで作成したmewmewのショートコード[nekoneko]を設定し、その固定ページをTOPページにしときます。で、ソース上でブレークポイントを設定します(行の左端をダブルクリックすると水色の丸がでるはず)。

 

その上で、プロジェクトを右クリック→「デバッグ構成」→「PHPWebアプリケーション」を選択し、「新規」をクリックします。

「サーバー」タブを選択後、「ファイル」欄に「/yoyaku/index.php」を設定し「デバッグ」ボタンをクリックします。管理画面をデバッグしたい場合は、「ファイル」欄に「/yoyaku/admin/index.php」と設定します。

最初の行で止まりますが、PF8を押していると、目指しているこんな感じでブレークで止まります。(目指すところでいきなり止めたい場合は、「デバッグ構成」の「デバッガー」の「最初の行でブレーク」のチェックをはずします。その上でMakeGoodのWindowsの「テストをデバッグする」ボタン(虫のボタン)をONにします)

テストコードも実行してみます。今回はtests/10shortcode/short01Test.phpを1つだけなので、ひとつしか流れません。testsを選択し、右クリックし、「テストの実行」をクリックします。コンソールにこんな感じで表示されます。

 

admin側のテストコードも書く予定でしたが、ちと疲れたのでここまでとします。

試しのプラグインや設定ファイルなど、作ったファイルを以下にまとめておきます。

http://www.mallory.jp/wp-content/uploads/2017/06/file.zip

上へ 準備 C C(MinGW)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です