🔧
今年作ったツール
OPENLOGI Advent Calendar 2025 11日目の記事です。 10日目の記事は、QAチームkagayaさんの「料理好きワーママQAEの私が、テスト設計とレシピの共通点に気づいた話」でした!
はじめに
今年オープンロジで活動しているなかで、痒い所に手が届く(?)サポート的なツールを3つ作ったのでその紹介です🎅🎄
これらのツールは弊社以外でも使えると思うので、使えるシーンがありましたら使っていただけると嬉しいです🙇(バグ・機能追加のご連絡もお待ちしてます!)
🎮PS2
機能
- PHP の
serialize関数で処理されたデータの文字列を入力に渡すと、データを見やすい形で出力します。JSON・YAML・TOMLのいずれかで出力します- PHP の Serialize関数で処理されたもの To 他の形式、という感じの命名です
- CLIとWebで提供してます
モチベーション
- 調査で、DBに保存されたシリアライズされたデータをパッと確認したい時がちょこちょこあったので作りました。Geminiにも手伝ってもらいました。
- 開発者は別ですが、同様の機能を持った IntelliJ IDEA / PhpStorm 用のプラグインがあり、表示もかっこいいので是非導入してみてください!(プラグインページはリンク先のREADMEに掲載)
例
CLI
$ ps2 <<< 'O:13:"MySimpleClass":17:{s:10:"publicProp";s:16:"Top Level Object";s:26:"MySimpleClassprivateProp";i:999;s:16:"*protectedProp";a:3:{s:10:"assoc_key1";s:12:"assoc_value1";s:10:"assoc_key2";i:789;s:17:"deep_nested_array";a:2:{s:9:"sub_key_x";s:11:"sub_value_x";s:9:"sub_key_y";d:12.34;}}s:6:"parent";N;s:15:"nestedArrayData";a:5:{i:0;s:6:"Item A";i:1;s:6:"Item B";i:2;s:6:"Item C";i:3;i:10;i:4;b:0;}s:16:"sharedStringRef1";s:33:"共有される文字列データ";s:16:"sharedStringRef2";R:17;s:16:"sharedObjectRef1";O:13:"MySimpleClass":6:{s:10:"publicProp";s:24:"共通オブジェクト";s:26:"MySimpleClassprivateProp";i:500;s:16:"*protectedProp";a:1:{s:6:"shared";b:1;}s:6:"parent";N;s:15:"nestedArrayData";a:0:{}s:9:"nullValue";N;}s:16:"sharedObjectRef2";r:18;s:21:"customSerializableObj";O:20:"MyCustomSerializable":2:{s:1:"s";s:36:"オブジェクト内のカスタム";s:1:"n";i:777;}s:12:"userRoleEnum";E:15:"UserRole:Editor";s:10:"statusEnum";E:13:"Status:Active";s:9:"nullValue";N;s:11:"booleanTrue";b:1;s:10:"floatValue";d:45.67;s:12:"integerValue";i:123;s:14:"japaneseString";s:36:"これは日本語の文字列です";}'
{
"*protectedProp": {
"assoc_key1": "assoc_value1",
"assoc_key2": 789,
"deep_nested_array": {
"sub_key_x": "sub_value_x",
"sub_key_y": 12.34
}
},
"MySimpleClassprivateProp": 999,
"__class_name": "MySimpleClass",
"booleanTrue": true,
"customSerializableObj": {
"__class_name": "MyCustomSerializable",
"n": 777,
"s": "オブジェクト内のカスタム"
},
"floatValue": 45.67,
"integerValue": 123,
"japaneseString": "これは日本語の文字列です",
"nestedArrayData": [
"Item A",
"Item B",
"Item C",
10,
false
],
"nullValue": null,
"parent": null,
"publicProp": "Top Level Object",
"sharedObjectRef1": {
"*protectedProp": {
"shared": true
},
"MySimpleClassprivateProp": 500,
"__class_name": "MySimpleClass",
"nestedArrayData": [],
"nullValue": null,
"parent": null,
"publicProp": "共通オブジェクト"
},
"sharedObjectRef2": "[[PHP_REFERENCE_DATA: map[*protectedProp:map[shared:true] MySimpleClassprivateProp:500 __class_name:MySimpleClass nestedArrayData:map[] nullValue:<nil> parent:<nil> publicProp:共通オブジェクト]]]",
"sharedStringRef1": "共有される文字列データ",
"sharedStringRef2": "[[PHP_REFERENCE_DATA: 共有される文字列データ]]",
"statusEnum": "Status:Active",
"userRoleEnum": "UserRole:Editor"
}
$
barcode📲
機能
- URLをQRコード・複数入力値をバーコードへ変換して1ページ上に表示するサイトです
- localでQR・バーコード生成したり、URLでデータ共有可能な作りにしています
- READMEも充実していますので、詳細はリンク先も見てくれたら嬉しいです
モチベーション
- 現在、私は HHT(Handheld terminals, ハンディ)という端末上のブラウザを通して倉庫業務を可能とするアプリケーションの開発に携わっています。この HHT を使ったアプリケーションでは、バーコードを頻繁にスキャンします。
- 一般的な開発では動作検証は必ずすると思いますが、HHTならでは(?)のいくつか課題があります
- 画面が小さいがゆえに文字の手入力が大変・誤る(検証用環境URL・Basic認証情報の入力など大変)
- 検証用データのバーコードの用意が手間(1ページで複数用意したい。複数バーコード載ってても誤スキャンしたくない。パッと共有したい)
- 上記課題があって開発者含め、HHTで試すのが大変(PdM・デザイナー・倉庫チーム・QAにも触っていただいてフィードバックをもらいたい)
- そういった課題があり、このツールを作ってみました。上記の課題は軽減・解消できたかな?と一方的に思っています。このツールもGeminiに手伝ってもらいました
- 想定していた使い方ではなかったのですが、負荷検証のために多量のバーコードを用意する必要があったため、このツールがURLからバーコード生成できる特徴を活かし、簡易なスクリプトを組んでURLを生成 -> 多量のバーコードを生成できたため、時間・手間ともに大幅にカットできました
- ただ、利用期限を超過した検証用環境のアクセス先がURLに残ったままになるため、過去共有したURLでアクセスされた時のケアは課題としてあります(あれ、検証環境にアクセスできんなあ...ということが起きる)
例

上記イメージは、このリンクで復元できます
補足
- お気に入りのツール
- 特にQRコード・バーコードをマウスオーバーで拡大・ぼかし
- URLで共有可(ただしBasic認証情報以外)
- このツールを他のメンバーに展開したところ使ってもらっていたり、嬉しいコメントをいただいたりで作ってよかったと思います。この場を借りて感謝です!🙇
💊PuCo
機能
- 実行したいPHPのテストファイルとプロダクションコードをそれぞれ選択すると、テスト実行 + カバレッジ計測(HTML生成)するTUIツールです
- Tool that aids PHPUnit and PCOV
- 以下TUIツール処理フローです
- 実行したいテストファイルを複数選択できます(fuzzyに検索可能)
- カバレッジを算出したいPHPファイルを複数選択できます(fuzzyに検索可能)
- 2で複数選択されたPHPファイルパスから最長一致のディレクトリパスを計算
- ※ 2で選択された各PHPファイルのみがカバレッジ計算対象では無く、算出された最長一致のディレクトリパス配下がカバレッジ計算対象になることに注意してください。算出されるディレクトリ配下に多数のPHPファイルがある場合、カバレッジ計算処理が遅くなるかもしれません。
- 1と3と既存のphpunit.xmlがあれば、それらを元に
phpunitxml_generated_by_puco.xmlを生成 - 実行するPHPコマンドを組み立て、実行する
-
coverage-pucoディレクトリ配下にカバレッジレポートが生成される
モチベーション
- オープンロジのコードベースで、テスト実行のみならずカバレッジの計測までやろうとするとかなり時間がかかってしまい、楽にかつ短縮してできないかなと思った + charmbracelet/bubbletea を使ってTUIツールを作ってみたかったのがモチベーションです(このフレームワークを利用して開発された社内便利ツールを見て作ってみたくなった)。このツールもGeminiに手伝ってもらいました
例

さいごに
一人の、単体の作業として見ると、コスト(時間・手間)が仮にそれほどかからなかったとしても、その作業を何度も何度も(別作業があればコンテキストスイッチのコストだってあるでしょう)、しかも複数人が実施するとなると、実は大変大きなコストになっている、という事柄は往々にしてあると思いますので、こういったツールで時間・手間が解消軽減できると嬉しいなと思います(ちりつもの作業は、効率化or減らすorそもそも廃止をできればいいなぁと思います)。
Discussion