https://a.storyblok.com/f/270183/1368x665/cdc0a5ba8b/25apr_dev-blog_pest-architecture-testing.jpg

PESTアーキテクチャ・テストによるレガシー・リファクタリングのコントロール

最終更新日 April 29, 2025

所要時間:1 分

PESTは2021年にヌーノ・マドゥロとルーク・ダウリングの想像の中で始まり、JavaScriptの世界からLaravelを通してPHPの世界にJESTのようなテストスタイルを持ち込むというミッションを持っていた。それ以来、プロジェクトの2つのメジャーリリースがあり、眉をひそめるような新機能がたくさんある。

私にとっては、建築の紹介だった。 アーキテクチャテスト の導入だった。もちろん、あなたがすることすべてに対してテストを書くべきだ(そして書くべきだ!)。しかし、アプリケーションの実際の構造そのものについてテストを書くことに何の意味があるのだろうか?まあ、未開拓のプロジェクトを始めるときから言えば、おそらくあまり意味がないだろう。しかし、ここからが素晴らしいところだ。管理されたリファクタリングが必要な、古いレガシーなスパゲッティにテストを導入するのはどうだろう?今、我々は話し合っている!この記事では、PESTアーキテクチャテストを使ってレガシーのリファクタリングを始めるための、最も簡単な出発点を見ていこう。

エンジニアリング・マネージャーに贈る

どんなことができるのか?さて arch()アクセス関数を使うと、PEST Expectation APIを使っていくつかのことができる:

  • クラスを拡張できる場合とできない場合の定義

  • インターフェースの位置を明確にする

  • どのクラスがトレイトを使うべきか、使わないべきかを定義する。

  • 偶発的なものをリファクタリングする die()dump()のようなものが実行される前のデバッグコールを修正する。

  • アプリケーションをLaravelの命名規則に従わせる

それは箱の外にある多くのものだ。では、新しいプロジェクトを継承して、1時間後にはハイレベルのテストからリファクタリングを始められるとしよう。レガシーなコードベースに入ってくるときに望む理想的なシナリオは、つまりこうだ:

  • 新しいアプリケーションのロジックがどのように見え、どのように動くべきかのスタイルガイドを書く。

  • これを実施するために、失敗するPESTテストを書き始める。

ある意味、提案されているのは行動駆動開発の再実装だと感じる。スタイルガイドをガーキンのようなテストと考え、それをPESTのユニットテストや統合テストに変換する。

率先垂範

ここでは、レガシーなLaravelのコードベースがあると仮定します。テストが始まる前に、RectorPHPのようなオートリファクタリングツールを使って、コードをモダンな規約に戻すPHPルールセットをルール化するか、Laravel Shiftを使用します。ここから、composerを使ってPESTを導入します:

composer require pestphp/pest --dev --with-all-dependencies

そして、新しいPESTコンフィギュレーションを初期化することができる:

./vendor/bin/pest --init

これで を作成します。これは、PHPUnit を使い慣れた人なら phpunit.xml に相当する設定ファイルです。いよいよ作業を開始しましょう。

ええと、次は?

An image of a big old mess of wires, just like your legacy codebaseDoes Your Code Look Like This?これだ。あなたが技術者としてのキャリアを持っている理由。あなたは15年前のLaravelアプリケーションを受け継ぐために生きていて、そのアプリケーションにはデバッグルートがあり、コアCLIコマンドが完全に公開されている。 おそらくDB::raw('SELECT * FROM nightmare WHERE refactoring = 1')を使っていることでしょう;があちこちにあることでしょう。

うっかりコードベースにコミットしてしまったデバッグ・コマンドは、進捗を確認する前に削除しなければならないというルールを作ろう。これは最低限のことですよね?これはPESTに組み込まれているので、まずコンソールを使ってコマンドラインでテストを作成する:

php artisan pest:test DebbugingRulesetTest

テストランナーを実行する:

php artisan test

PESTがコードを定型化しようとしたため、失敗することがわかるだろう。テストファイル に移動し、コードを次のように置き換えます。に移動し、コードを次のように置き換えます:

<?php

arch()->preset()->php();

テストを実行し、あなたが理論的な混乱を受け継いだことを考えれば、PESTはあなたに不平を言い始めるだろう:PESTはあなたに呻き声を上げるだろう。

A screenshot of PEST failing because a clumsy developer put a var_dump() inWhoops, No Debugging Code Here, Please!

アルト

最初のリファクタリングルールは確保したので、次はそれを実行する必要があります。本番環境では、Atlassian の Bitbucket Pipelines や Gitlab の CI/CD、GitHub の Actions のような継続的インテグレーションのランナーが、Pull Request をマージするためのルールを発行するのが一般的です。しかし、私たちは最も厳しいルールを実装するつもりです。 PESTが満たされなければ、コードにコミットすることすらできない。

これはgitフックを使って行います。このコマンドで新しいプレコミットフックを作成します:

cd my-code/.git/hooks

// Windows Users Only
echo. > pre-commit

// Unix-like Users Only
touch pre-commit
chmod +x pre-commit

開く プレコミットファイルを開き、PESTを実行するコードを追加する:

#!/bin/sh

echo "Pre Commit Test Runner Fired"

# Detect OS

if [ "$(uname 2>/dev/null)" = "Linux" ] || [ "$(uname 2>/dev/null)" = "Darwin" ]; then u
    echo "Running Unix-like"
    CMD="./vendor/bin/pest"
else
    echo "Running Windows"
    CMD="vendor\\bin\\pest.bat"
fi

$CMD
RESULT=$?

if [ $RESULT -ne 0 ]; then
    echo "Cannot Commit, Tests Failed"
    exit 1
fi

echo "Commit Success"

exit 0

その プレコミットファイルは、git がさまざまなアクションを実行するために参照する予約ファイル名です。この場合、ユーザーがコードベースにコミットしようとするたびに、このファイルの中身が実行されます。

さあ、コードに変更をコミットしてみて、何が起こるか見てみよう!

これでリファクタリングを開始するための準備が整った。セットアップをカバーしたので、あとは PEST Architecture Testing API メソッドを利用するだけだ。このテストでは、さらに高レベルのルールをいくつか追加することができる:

<?php

arch()->preset()->php(); // our previous rules
arch()->preset()->security();
arch()->preset()->strict();

PESTのソースコードで詳細を見ることができる。最初のものは security()です、このルールは、あなたのコードをチェックし、重大なセキュリティホールがある場所を特定します。これには、セキュリティ上の理由から廃止された PHP 標準ライブラリのメソッドを使用することも含まれます。

  • md5(): MD5 のような使い方は SHA256 に置き換える必要があります。セッション ID やデータベースの一意識別子などのデータがある場合は、ETL のようなリファクタリングが必要です。

  • rand(): PHP独自のランダム関数は実はランダムではない

  • shell_exec(): ホストマシンのシェルを呼び出すことは、もしかしたら一番やってはいけないことかもしれません。もちろん、いつかはこれを行う必要がありますが、ここでの考え方は、レガシーコードにサーバーをバラバラにさせるのではなく、Laravelのコンソールやラップメソッドを使用してセキュリティを確保することです。

これらの出発点に含まれるルールの数だけで、リファクタリングの2、3スプリント分に相当すると思う!PESTがExpectation APIでたくさんのテストを可能にしていることを考えると、これでできることはいろいろあると思う。

結論

アーキテクチャー・テストとともに、PEST 3では突然変異テストも導入された。PESTに搭載されている機能の多さは、レガシープロジェクトを担当する人たちにとって、本当に完全なツールの宝庫だ。Vonageではテストに情熱を注いでいます。 私たちの盛んな Slackの開発者コミュニティでフォローしてください。 X(旧 Twitter)でフォロー、または 開発者向けニュースレター.つながりを保ち、進捗を共有し、最新の開発者向けニュース、ヒント、イベントを入手しましょう!

シェア:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeシニアPHPデベロッパー

スタンダップ・コメディーの学位論文を持つ俳優の訓練を受け、ミートアップ・シーンを経てPHP開発に携わるようになった。技術について話したり書いたり、レコード・コレクションから変わったレコードを再生したり買ったりしています。