Web Session

Web Session

Webマーケティング × クリエイティブ

Amebaでブログを始めよう!

PHPで作成したWebアプリケーションの単体テストフレームワークとして有名なのがPHPUnit

サイト上でページを確認しながらチェックせずとも、チェックパターンをあらかじめ作成しておくことで、フレームワークが自動でエラー箇所を吐き出してくれるという優れものです。


この記事では、そのPHPUnitの導入と使い方を解説していきます。

参考サイト: http://qiita.com/u-akihiro/items/e9ca7ccbe3e42f6cd12a


PHPUnitの導入・インストール


PHPUnitの導入は非常に簡単です。

ターミナルからインストールしてパスを通したら、


で使えるようになります。


PHPUnitを使用するまでの手順


まずは、下記からインストール


https://phar.phpunit.de/phpunit.phar

この状態からパスを通せばphpunit.phar テストファイル名.phpで使うことができますが、

もっと簡単に使用できるように設定します。


mv phpunit.phar phpunit

上記の設定でphpunit テストファイル名.phpという記述で、どのディレクトリでも使用できるようになります。


実行結果が以下のようになればインストール完了です。


PHPUnit バージョン by Sebastian Bergmann.

PHPUnit使用方法


次に、PHPUnit用のテスト用クラスを作成していきます。

テスト用クラスは独自で作成し、PHPUnit_Framework_TestCaseクラスを継承することで、単体テストを行うことができます。

ちなみに、includerequireでファイルを読み込むことなく使用することができます。


命名規則


テスト用クラスにも命名規則があります。


命名規則は下記の通りです。











クラス名テスト対象のクラス名 + Test
メソッド名test + 任意の文字列

使用例



class TestSample extends PHPUnit_Framework_TestCase {
function testSample1() {
$this->assertEquals(2,1+1);
}
}

記述ができたら実行します。


phpunit phpunit.php

PHPUnitを実行すると、testSample1()は自動的に実行されます。


下記のような結果になれば成功です。



[root@localhost html]# phpunit phpunit.php
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

. 1 / 1 (100%)

Time: 105 ms, Memory: 11.75MB

OK (1 test, 0 assertions)

現在アクセスしているURLをスラッシュ区切りで配列に格納するクラスです。

ディレクトリによるコールするコントローラーやモデルの判別等にご使用ください。


function GetScript()


$this->script はディレクトリと、スクリプト名(index.phpやindex.htmlなど)を返します。















アクセスURL取得される値
http://ドメイン.com/direct/direct, index.php
http://ドメイン.com/direct/detail.phpdirect, detail.php

 


function GetUri()


$this->uri はディレクトリと、アクセスされたスクリプト名を返します。















アクセスURL取得される値
http://ドメイン.com/direct/direct
http://ドメイン.com/direct/detail.phpdirect, detail.php

 


function GetUriDir()


$this->dir は、スクリプト名を無視し、ディレクトリ名のみ返します。















アクセスURL取得される値
http://ドメイン.com/direct/direct
http://ドメイン.com/direct/detail.phpdirect

 


function GetPath()


$this->path は、 $this->dir 配列を / を語尾へ含めながら、文字列へ再変換します。



















アクセスURL取得される値
http://ドメイン.com/direct//direct/
http://ドメイン.com/direct/detail.php/direct/
http://ドメイン.com/direct/detail//direct/detail/

 


現在アクセスしているURLをスラッシュ区切りで配列に格納するクラス


class GetDir {
public $script;
public $uri;
public $dir = array();
public $path;

function GetDir() {
$this->GetScript();
$this->GetUri();
$this->GetUriDir();
$this->GetPath();
return;
}

function GetScript() {
$server = $_SERVER['SCRIPT_NAME'];
$this->script = array_values(array_filter(explode("/",$server)));
return;
}

function GetUri() {
$server = $_SERVER['REQUEST_URI'];
$this->uri = array_values(array_filter(explode("/",$server)));
return;
}

function GetUriDir() {
foreach($this->uri as $val) {
if(
preg_match("/\.php/",$val) ||
preg_match("/\.html/",$val) ||
preg_match("/\.htm/",$val)
) {
continue;
} else {
array_push($this->dir,$val);
}
}
return;
}

function GetPath() {
$this->path = "/";
foreach($this->dir as $val) {
$this->path .= $val . "/";
}
return;
}
}

サイト制作やSEO対策を行う上で、設定することは基本中の基本とされるタイトル、ディスクリプション、キーワード、etc...

総括して、いわゆるメタタグ。


普通だったら、ファイルを一つずつ開き書き込んでいくという、少し面倒な工程があるかと思います。

ファイルが多いほど大変になります。

 

そんなタイトル、ディスクリプション、キーワードを、Xmlファイル一つで前ページ分、一元管理できる機能があったら、

作業は相当楽になるのではないでしょうか?

 

今日はそんな機能を実装できるPHPクラスをご紹介します。

 

この仕組みを実装することができれば、少なくとも、



  • 各ページをわざわざ開く

  • 各ページをわざわざアップする


などの作業が減るため、作業の手間を省き時間を短縮したり、

ファイルのアップ漏れを防ぐことができます。


メタタグ設定用Xmlファイル


メタタグ設定用Xmlファイルは、実際に使用するときは下記のようになります。


<?xml version="1.0" encoding="utf-8"?>
<meta>
<default>
<title>デフォルトタイトル</title>
<description>デフォルトディスクリプション</description>
<keyword>デフォルトキーワード</keyword>
<noindex>false</noindex>
</default>

<under>
<index.php>
<title>under indexタイトル</title>
<description>under indexディスクリプション</description>
<keyword>under indexキーワード</keyword>
<noindex>true</noindex>
</index.php>

<detail.php>
<title>under detailタイトル</title>
<description>under detailディスクリプション</description>
<keyword>under detailキーワード</keyword>
<noindex>false</noindex>
</detail.php>
</under>
</meta>

<default></default> の中身は、メタタグが設定されていないページへ適用するデフォルトのメタタグ。

その他は、ディレクトリ → ファイル名 → 各メタタグ の順になっています。


ディレクトリが2階層、3階層になっている場合は、さらに入れ子にします。

今回は、タイトル、ディスクリプション、キーワード、noindex を設定できるよう書き込んでいます。

 























タグ内容
<title></title> ページのタイトル
<description></description> ページの説明文(ディスクリプション)
<keyword></keyword> ページのキーワード
<noindex></noindex> noindexの設定(falseで検索結果へのインデックスを許可)

 


XmlをJSONへ変換するクラス


次に、Xmlファイルで設定された各メタタグを抽出し、

Jsonファイルへ変換するクラスを呼び出します。


class Xml {
function Xml($path) {
$xml = simplexml_load_file($path);
$json = json_encode($xml);
$this->val = json_decode($json,TRUE);
return;
}
}

 

 


JSONから各メタタグ用変数へ値を格納


JSONファイルを foreach() で回し、各メタタグ用変数へ値を格納してゆきます。

GetDir() クラスについてはこちらをご参照ください。


class Meta {
public $set;

function Meta() {
$this->meta = new Xml("XMLファイルへのパス");
$dir = new GetDir();
$this->set = $this->meta->val;
$this->MetaExtra($dir->script);
$this->MetaSet();
return;
}

function MetaExtra($dir) {
foreach($dir as $val) {
if($this->set[$val]) {
$this->set = $this->set[$val];
$this->MetaExtra($dir);
} else {
break;
}
}
return;
}

function MetaSet() {
if($this->set["title"]) {
$this->title = $this->set["title"];
} else {
$this->title = $this->meta->val["default"]["title"];
}

if($this->set["description"]) {
$this->description = $this->set["description"];
} else {
$this->description = $this->meta->val["default"]["description"];
}

if($this->set["keyword"]) {
$this->keyword = $this->set["keyword"];
} else {
$this->keyword = $this->meta->val["default"]["keyword"];
}

if($this->set["noindex"]) {
if($this->set["noindex"]==="false") {
$this->noindex = false;
} else {
$this->noindex = true;
}
} else {
$this->noindex = false;
}
return;
}
}

 

 


ヘッダータグへ使用する


変数に値を格納できたので、あとはHTML側でクラスをコンストラクトし使用するだけです。


<head>
<title><?php echo $construct->meta->title; ?><title>
<meta name="description" itemprop="description" content="<?php echo $construct->meta->description; ?>" />
<meta name="keywords" content="<?php echo $construct->meta->keyword; ?>">
<meta name="robots" content="<?php if($construct->meta->noindex) { ?>noindex<?php } else { ?>index<?php } ?>">
</head>

 

以上で実装完了です。

 

なぜ、わざわざXMLからJSONファイルへ変換したかというと、

XmlクラスをMetaクラス依存のクラスではなく、

JSONへ変換するクラスという独立したクラスにすることで汎用性を高めるためです。


こちらのクラスはメタタグ出力以外にも利用できます。