BASEプロダクトチームブログ

ネットショップ作成サービス「BASE ( https://thebase.in )」、ショッピングアプリ「BASE ( https://thebase.in/sp )」のプロダクトチームによるブログです。

PHPカンファレンス福岡 非公式前夜祭リジェクトコンでPHPアプリのテストスイートのカスタマイズについて発表してきました & カンファレンスレポート

f:id:tenkoma:20180615194143j:plain

こんにちは、Back-end Engineer の田中 @tenkoma です。ショッピングアプリ 「BASE」向けAPIの開発を担当しています。

去る6月16日に福岡で開催された「PHPカンファレンス福岡2018」に参加してきました。当日は一般参加でしたが、前日に開催された非公式前夜祭 リジェクトコンで発表してきたのでブログでもご紹介します。

BASEのPHPアプリケーションは2018年5月にようやくPHP7化が完了しました。 アップデートプロジェクトの中でユニットテストしやすくするためにテストスイートをカスタマイズしたので、発表で3つほどをTipsとして紹介しました。

紹介した3つのTipsについてこの記事でも説明します。

Tips 1. assertSame() で配列のdiffを出力できるようにする

PHPUnit 7 で assertSame()配列のdiff を出力できるようになりました。CakePHP2アプリ(データ形式として配列を多用する)で使えるとありがたいのですが PHPUnit 7 の利用は難しそうです。そこで、配列のdiffを出力できるように移植してみました。以下のように出力されます。

SampleTest.php

<?php
App::uses('ExtendTestCase', 'ExtendTestSuite.TestSuite');
class SampleTest extends ExtendTestCase
{
    public function testAssertArray()
    {
        $actual = ['User' => ['id' => 1, 'name' => 'Taro']];
        $expected = ['User' => ['id' => '1', 'name' => 'Taro']];
        $this->assertSame($expected, $actual);
    }
}

出力

There was 1 failure:

1) SampleTest::testAssertArray
Failed asserting that Array &0 (
    'User' => Array &1 (
        'id' => 1
        'name' => 'Taro'
    )
) is identical to Array &0 (
    'User' => Array &1 (
        'id' => '1'
        'name' => 'Taro'
    )
).
--- Expected
+++ Actual
@@ @@
 Array &0 (
     'User' => Array &1 (
-        'id' => '1'
+        'id' => 1
         'name' => 'Taro'
     )
 )

テストが失敗したときかなり原因がわかりやすくなるので、すぐにPHPUnit 7にアップグレードできない場合は以下のコードを実装すると便利です。

Tips 2. テストスイート向けにユニットテストを書く

setUp(), tearDown() などに記述したコードをどうテストするか、という話で test for test cycle(setUp/tearDown) #1 のようなテストコードを書きました。 スライドの最後で、CIで複数のPHPバージョンでテストした話をしましたが、そのためのCircleCIの設定は.circleci/config.ymlのようになっています。

Tips 3. runkit, php-timecopのコードをIDEで補完するためのスタブ

PhpStorm組み込みのスタブファイルに無いrunkit, php-timecopのようなPHP拡張のコードを補完できるようにするものです。以下のリポジトリをgit clone してIDEの include_path に追加してお使いください。

カンファレンスレポート

以下はカンファレンス当日・非公式前夜祭後夜祭のレポートです。来年も開催されるらしいので、参加したい方の参考になれば幸いです。

前日に福岡入り (6月15日・金)

PHPカンファレンス福岡を楽しむには前日入りが必須。13:30頃に福岡空港に到着しました。

このときまだリジェクトコンの資料が仕上がっていなかったので博多駅近くにとったホテルで資料の手直しをしました。

リジェクトコンの会場であるLINE Fukuoka株式会社と同じビルの1Fで知り合いの方と一緒に食事を取り、19:00 に会場到着しました。 以下、発表前の現場の様子です。

f:id:tenkoma:20180628111750j:plain

発表順は1番目。印象に残るようGitHub Username Shirtを着て発表しました。

カンファレンス本編より多い同時3セッション。だれも聞きに来なかったらどうしようと思いましたが、多くの人に聞いていただけたようです。

PHPカンファレンス福岡2018 当日 (6月16日・土)

f:id:tenkoma:20180616101153j:plain f:id:tenkoma:20180616101639j:plainf:id:tenkoma:20180616101627j:plain

PHPカンファレンス福岡は去年初参加でした。そのときは前日午前2:00くらいまで懇親会に参加した結果当日1時間以上遅刻してしまいましたが、今年は午前10時に間に合いました。

「PHPカンファレンス福岡2018」は同時2セッションです。2つの会場は両方とも席に余裕がある感じで出入りがしやすかったです。

参加したセッションについて紹介します。

MySQLで画像 を扱うメリット・デメリットと障害・解決事例

以前実装してみたことがあり、メリット・デメリットについて実感したので、さらに学ぼうとおもい参加。 発想としては思いつきがちですが、適用するメリットの大きいケースは限られそうですね。

ログの設計してますか?PSR3とログ設計の話

何をログに残せば良いかで迷うことが未だにあり、周辺知識を強化したくて参加。ログのリスクの部分を一番集中して聞いてました。

Event Sourcing,CQRS For PHP Application

複雑化するサービスのための設計パターン、アプリケーションとミドルウェアの組み合わせ例紹介。扱うデータやトランザクションが増えたり、集計分析などのシステムがあると必要とされそうに思いました。

Testing Live!!!

実際のWebサービスに対して探索的にテストを行い、問題を探すデモでした。5分という短い時間でアプリケーションに潜む不整合が見つかり、会場がすごく盛り上がってました。

PHP 5.3 + CakePHP1.3 バージョンアップ報告

去年、同じくPHPカンファレンス福岡で発表された計画の現状報告。BASE もCakePHPを利用しているので、気になりました。

物理層のこと、時々でいいから、思い出してください。

システムの物理層というより物理インフラ構築運用について面白おかしく紹介。失敗談が聞いていて面白すぎました。

その他

スポンサーブースも参加者に足を運んでもらえるようAsk The Speakerコーナー(セッション後に発表者に直接質問できる場所)とコーヒーが用意されており、いつ行っても賑わっていました。

翌日 (6月17日・日)

去年同様、株式会社Fusicのセミナールームで開催されたので参加しました。参加者各自で自由に作業しながら、発表したい人が自由に発表するようなゆるやかな集まりでした。

僕は前夜祭で発表した内容のコード tenkoma/extend-cakephp2-testsuite-example の準備をしていたのですが、飛行機の都合で2時間ほどしか参加できませんでした。

来年もし開催されるなら、絶対フルで参加できるように調整します!

まとめ

  • 非公式前夜祭 リジェクトコンで発表しました
  • PHPカンファレンス福岡、フルで楽しむなら前後のイベントもチェックしてみるのがオススメです。