EVENT REPORTイベントレポート
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
イベントレポートvol.7
2016/05/17(火)更新2014/12/09(火)19:30~22:00
こんにちは!林です。
日々、進化を続けるスクリプト言語PHP。先日、そんなPHPの旬の技術やノウハウを一挙に紹介するイベントが開催されました。
登壇したのは、PHPエンジニアのためのスクールや書籍も手がけるアシアル(株)、総合人材サービス会社(株)インテリジェンスの技術部門、日本最大のクラウドソーシングサイトを運営するランサーズ(株)の3社から送り込まれた敏腕PHPエンジニアの面々。
話題のPHPフレームワークLaravel4 から、スピードと品質重視のPHP開発チームの取り組み、Behatを使ったE2Eテストについてまで、今、ホットなPHPテクニックがぎっしり詰まった講演内容に、参加者の皆さんは真剣に耳を傾けていらっしゃいました。
今回は、そのイベントの様子をレポート。
フレームワークの選定に悩んでいる、またテストにつまづいていらっしゃるなどというPHPエンジニアの方はぜひチェックしてみてください!
※掲載の記事は、2014年12月時点の内容です。
※Laravelは、2015年2月5日にバージョン5.0がリリースされています。
講演者プロフィール
「今、最もイケてるPHPフレームワーク」ということで、本日はLaravel4についてくわしくお話ししていきます。
その理由としてはまず、「Googleトレンド」というGoogleのサービスでフレームワークの人気度を見ていただくと分かる通り、2014年7月あたりからLaravelへ非常に注目が集まってきているということ。
次に、「2014年のベストPHPフレームワーク」というページにおけるフレームワークのランキングでも、Laravelは1位を獲得していること(2位 Phalcon 3位 Symfony 4位 CodeIgniter)が挙げられます。
こうしたことから、Laravelは「今、最もイケてるPHPフレームワーク」だと表現できるわけです。
Laravel4には、インストール時からPHPのWebアプリ開発に必要な機能が、豊富に取り揃えられています。そのラインアップは以下の通り。
・MVC
・Router
・Authentication
・Migration
・Seeder
・Plugin
・Template
・HTML Helper
・Pagination
・Unit Test など
「プラグインを入れずとも十分に使える」ということが、Laravelが支持される理由の1つでしょう。
安心感があるのもLaravel4の魅力です。例えば次のようなうれしいメリットも。
・公式のドキュメントが非常に読みやすい
・一つひとつの機能にサンプルコードが丁寧に入っているので、理解しやすい
・他の方がGitHubで作ったプラグインをインストールすることで、今以上に便利になる
また、アップデートの際に気がかりなバージョンアップについても、アップデートガイドがあるので安心です。ガイドに習うことで、問題なく運用していくことができます。
今、大きな注目を集めているLaravelですが、大きく分けて2つの注意点があります。
まず1つ目は、「スピードが遅い」ということ。
例えばLaravelは「Codelgniterに比べて遅い」と言われることがあります。これには、ベンチマークの仕方やバージョンの差などといった要素が関係していることが考えられますが、やはり実際に少し遅いことは否定できません。また、Phalconとについて言えば、Laravelは比べるまでもなく遅いですね。
2つ目は「デバックメッセージの読みにくさ」です。
Laravelに慣れてくるにつれて、「このメッセージが出たらここが悪いんだな」と分かるようになってくるのですが、慣れるまではやはり分かりづらいです。
私たちはLaravelを以下のような方法で取り入れています。
①Laravel4+AngularJS
LaravelにもBladeというHTMLのテンプレートシステムはありますが、私たちはAngularをオススメします。そのためHTMLはAngularに任せて、LaravelはAPIサーバとして利用しています。
②Laravel4+OnsenUI
弊社の製品「Monaca」のアプリを作ったときには、「OnsenUI」というUIフレームワークを使いました。ちなみに、OnsenUIの裏でもAngularJSが走っています。
ここで、「なぜLaravel4にもともと備わっているテンプレート機能を使わないのか?」という疑問を持つ方もいらっしゃることでしょう。その理由は、「Laravel4のBladeテンプレート機能とAngularJSが馴染まない」ということ。
BladeからAngularJSへデータを渡す方法がまったくもってスマートではないのです。 だから、LaravelとAngularJSをディレクトリではっきりと分けて管理をすることにしました。
「動きが遅い」という性質上、正直Laravelはパフォーマンスを求められるシステムの開発には向いていないと言えるかもしれません。みなさんが期待するほどのパフォーマンスを得られない可能性があります。
それとは反対に、アクセス数が少ないサイトや社内用のシステムを作る際には、とてもマッチします。さらに「急ぎで仮のシステムを作りたい」というときにも、Laravelを用いると便利です。
Laravel4.2の次は、Laravel4.3ではなくLaravel5が出るそうです。
先日のLaravelカンファレンスでは、Laravel環境をすぐに組み立てられるVagrant box「Laravel Homestead」も発表されました。また、Laravel環境がすぐに利用できるホスティングサービス「Laravel Forge」の提供も始まっています。
Laravelの遅さに関しては、Facebook社が手がけるHHVMと連携させていくことによって改善できるでしょう。ただ、パフォーマンスについてはPhalconのほうがLaravelよりはるかに有利なので、今後はLaravelよりPhalconのほうが上がってくるかもしれません。現時点ではまだPhalconにバグが多いので、Laravelのほうが優勢ですね。
最後になりましたが、2015年11月にはPHP7がリリースされるというニュースが流れています。その気になる性能については、HHVM並みにパフォーマンスが向上しているとのことです!
「遅い遅い」と言われるPHPですが、個人的にはPHP7が入ってくることで、どんどん勢力を増してくるのではないかと考えています。
私からはテストにおける「スピード」と「品質」の実現について、お話をさせていただきます。 今回はPHPの勉強会になりますので、PHPのテストフレームワーク「AspectMock」を中心に詳しくお話しします。
テストの話に入る前に、まず弊社の開発体制について説明させてください。
弊社では基本的に、アジャイルでいうところのスクラム体制を築いて開発を行っています。
スクラム体制では、スプリントという単位で計画、開発し、レビューを行うというサイクルを設けています。そのサイクルを「いかに回すか」がスピードを意識した開発のポイントになります。 弊社ではそれを実現するために、以下の3点を意識しています。
1.テストは極力自動化する
(毎回行うような作業は、極力自動化する)
2.細かいスパンでデプロイする
(頻繁に行うデプロイが負荷にならないように、自動化を進める)
3.技術的な負債は残さない
(新しい技術を取り入れることで開発者のモチベーションを上げ、生産性も向上させる)
基本的に新しいものを使っていて、PHPは5.5系、MySQLは5.6系、FuelPHPは1.7.2を用いています。また、一部ではPhalconを利用することもあります。
フロントエンドではAngularとTypeScriptを使っています。
フロントサイドにはFuelPHPを使用し、基本的にAPI化を行っています。また、ビュー側については、AngularJSを使って作り込むようなスタンスで開発しています。
Angularのようなフルスタックなフレームワークを使う利点は、ソースが標準化されることにあります。担当した開発者以外のメンバーが見た場合でも、ソースを理解しやすいのが良いですね。
また、「Angularを用いれば、今風のUIを作ることができる」というメリットもお伝えしたいところです。社内ツールを作るときには、どうしてもUIが軽視される傾向にあるんですけど、Angularを使えば簡単にUI開発をできるようになります。
「Angularは学習コストが高い」と言われることもありますが、難しいことをしなければそれほどコストもかからないと思います。
ちなみに、実行スタイルや構文チェックにはTypeScriptを使っています。TypeScriptを用いることにより、デバックに費やす時間が短縮され、作業効率を上げることができます。
さらに、マーケティング内部のチャートやグラフを描くところにはWijmoというJavaScriptライブラリを使っています。Angularとの親和性があるので使いやすいですね。ライブラリ系の統一もできて、管理がしやすいのも嬉しいポイントですね。
サーバ側のテストには、PHPのテストフレームワークであるAspectMockを利用しています。PHPでAOPを実現する「Go!AOP」というライブラリを使ってメソッドを差し替えてます。
AspectMockはFuel1.7.2から標準で設定されており、あまり気にせず使える状態にあったのが良かったですね。また、単体テストのバリエーションを増やせたり、テストデータの作成が容易であることも、AspectMockの魅力です。
AspectMockで重要な概念と言えば「Proxy」です。
Proxyには、ClassProxyとInstantProxy、FuncProxyと3つのタイプがあります。このうちFuncProxyには最新版の0.5.0が提供されていて、指定したネームスペースのなかでファンクションをMock化できるようになっています。簡単に言うと、「標準関数もMock化できてしまう、非常にイケてる処理が実装されている」ということです。
テストにおける定常・定期的な作業は、積極的に自動化すべきです。また、テストコードはテスト実施のときに書いて、それを通してテストするやり方がベストでしょう。
AspectMockを用いることにより、データパターンの定義が色々とできるようになるので、処理するパターンも増えると思います。標準関数すらMock化できるくらいですからね。
ただ、AspectMockは少しクセがあるので、使っていきながら徐々に慣れていく必要はあるでしょう。
Behatは、オープンソースのBDDテストフレームワークです。PHP5.3以上に対応しています。
Behatの魅力としては以下のような内容が挙げられます。
・自然言語に近い形でシナリオの記述が可能
・ヘッドレスブラウザによるテストが実行できる
・自動テストツールとの連携 など
ざっくり言ってしまえば、「手動のブラウザテストが自動でできるようになる」という点がBehatの利点です。
ちなみに今、「自然言語に近い形で記述できる」と紹介しましたが、Behatでは英語でも日本語でも記述ができるようになっていて、ランサーズでは日本語で記述するようにしています。
なぜ日本語を使用しているかと言うと、「日本語で記述することによって、エンジニア以外の人にもテストの共有が簡単にできるようになるかもしれない」と考えたからです。
あわよくば、「テストエンジニア以外の人にテストを書いてもらうことも可能になるのではないか」とさえ感じてもいます。
Behat導入の決め手になった理由は以下の3つです。
1.アプリケーションが仕様を満たしているか確認するため
2.手動テストの工数削減のため
3.開発の影響範囲を明確化するため
ランサーズでは、コンポーネントのリンクテストや手動のブラウザテストを行っているのですが、これらのユニットテストだけだと、アプリケーションが仕様を満たしているかどうかの判断が難しいんです。
そこでBehatを導入して、テストを回していくことにしました。Behatなら、手動では見つけづらいスコープ外の影響範囲にも、簡単に気付くことができるようになります。
また、工数がかさむような大規模のテストでも、Behatを取り入れることによって、工数を削減することができるようになりました。
Behatはcomposerからインストールできます。設定ファイルを作成した後に、PHP composer.phar installコマンドを実行するだけで作業が完了します。
インストールの後は、必要なモジュールを追加。ヘッドブラウザや自動ツールとの連携がBehat単体では難しいので、必ず関連のモジュールを組み込んでいきます。その理由としては、Behat単体ではヘッドレスブラウザや自動ツールとの連携が難しいからです。
ちなみに、Behatの周辺モジュールには、ブラウザ抽象化モジュールである「Behat/mink」や「Behat/mink-extension」の他、ブラウザエミュレーションの「Behat/mink-goutte-driver」や「Behat/mink-selenium-driver」などがあります。
モジュールの組み込みが済んだら、いよいよBehatの設定です。behat.ymlというymlファイルに設定していきます。
モジュールとしてセレニウムを用いるのですが、このセレニウム、リンクを踏んで別タブや別ウィンドウになってしまうことで、テストが落ちてしまうんです。
だからとても雑なやり方にはなってしまうのですが、JavaScriptを実行可能なBehatの特徴を利用して、必要な箇所を全部セルフで置き換えていくというステップを踏むことにしました。
そして何とか動かせる状態へと持っていきました。もし、どなたかもっと良い方法をご存知の方がいらっしゃいましたら、ぜひ教えてください。
また、弊社ではテストデータにおける実装データのモジュールを自社で開発しているのですが、開発に少しだけ苦労しました。なぜなら弊社ではCakePHPを使っているので、外部からCakeを起動する必要があり、結構な手間がかかりました。
手動のテストに比べて、ずいぶんと工数が削減されたと感じています。テストの項目を、やり直す必要がなくなったことが大きいですね。
また、Behatはただ導入するだけではなく、独自のステップを取り入れることが必要不可欠です。どうしてもデフォルトのステップだけではまかないきれない部分が出てきしまうためです。
さらに「ドキュメントの情報量がそんなに豊富ではない」ということも分かりました。モジュールのなかを把握するには、自分でコードを読んで理解するしかありません。そのため「モジュールを読み取る工程が、ある程度必要になる」ということを想定しておいたほうがいいでしょう。
もう1つ、自動テストツールは必須でしょう。Behat単体では、ヘッドレスブラウザやJavaScriptなどの実行ができませんからね。
最後に、今後の取り組みについてお話します。
現在、ユニットテストでは各々の開発環境において、コマンドを手動で実行してテストを動かしている状態なのですが、今後はCIで自動テストが実行できるような形を目指していきたいと考えています。また、他のメンバーに対するラーニングも並行して進めていく予定です。
以上で発表は終わりとなります。
ご清聴ありがとうございました。
いかがでしたでしょうか?
最新のPHPに関する技術とノウハウ、事例が満載された講演は、今後の開発に役立てていただけそうなお話が目白押しでしたね。
ご登壇いただいたアシアル(株)の坂本さんもおっしゃっていましたが、今年(2015年)中にはPHP7のリリースが予定されていて、大幅な性能向上が期待されています。ますますPHPから目が離せませんね。
今後もヒカラボレポートでは、PHPを始めエンジニアの方に向けた最新技術や業界のトレンドを紹介したイベントの様子をお伝えしていきます。どうぞお見逃しなく!