目次
報酬ラウンド!
JavaScript関数内でPHPコードを使用できますか?
Codeceptionを使用してPHPコードをテストする方法は?
JavaScriptでPHPコードを書き込む方法は?
ホームページ バックエンド開発 PHPチュートリアル PHPでJavaScriptスタイルのテストウォッチャーを書く方法

PHPでJavaScriptスタイルのテストウォッチャーを書く方法

Feb 09, 2025 am 10:58 AM

How to Write JavaScript-Style Test Watchers in PHP

コアポイント

    JavaScriptスタイルのテストオブザーバーをPHPプロジェクトに統合し、ファイル変換の前処理を自動化し、ファイルが変更されたときにユニットテストを再実行し、開発効率を改善します。
  • phpunitなどのツールを使用して自動テストをセットアップし、phpunit-watcherを使用してファイル変更を観察し、開発中の即時のフィードバックとエラーの検出を確保します。
  • PHPプロジェクトに前処理スクリプトを実装し、JavaScript Babelと同様の構文変換を許可するため、互換性を向上させ、手動エンコードの取り組みを削減します。
  • PHPテスト環境を構成して、テストする前に事前に処理されたファイルを自動的に再構築し、正確なコードカバレッジを維持し、テストプロセスを簡素化します。
  • ファイルオブザーバーを使用して高度な構成を調査して、変更されたファイルのみを選択的に再構築し、大規模プロジェクトの多数のファイルのテストサイクルを大幅に高速化します。
この記事は、Younes Rafieによってレビューされました。 SitePointコンテンツを最高の状態にしてくれたすべてのSitePointピアレビューアに感謝します!

最初にコードのテストを書きませんでした。多くの人と同様に、私の「テスト」はコードを書き、ページを更新しています。 「それは正しく見えますか?」それが正しいと思うなら、私は続けます。

実際には、私が行った仕事のほとんどは、他の形式のテストについてあまり気にしない企業にとってです。長年の経験と、クリス・ハルジェスのような人々からの賢明なアドバイスの後、私はテストの価値を見ました。そして、私はまだ良いテストがどのように見えるかを学んでいます。

How to Write JavaScript-Style Test Watchers in PHP 私は最近、バンドルされたテストオブザーバーを含むいくつかのJavaScriptプロジェクトの取り組みを開始しました。

これは、テスト駆動型のnodejs開発に関する素晴らしい高度なビデオチュートリアルです!

JavaScriptの世界では、ソースコードを前処理することは珍しくありません。 JavaScriptの世界では、開発者はサポートされていない構文を使用してコードを作成し、多くの場合Babelと呼ばれるツールを使用して、コードを広くサポートされている構文に変換します。

変換スクリプトを呼び出すための負担を減らすために、VoilerPlateプロジェクトはファイルの変更を自動的に監視するスクリプトを含め始めました。

私が取り組んだプロジェクトは、再実行ユニットテストに対して同様のアプローチを取りました。 JavaScriptファイルを変更すると、ファイルが変換され、ユニットテストが再実行されます。これにより、何かが壊れているかどうかをすぐに確認できます。

このチュートリアルのコードはgithubで見つけることができます。 PHP 7.1でテストしました。

プロジェクト設定

これらのプロジェクトに取り組み始めて以来、phpunitに似たようなもののセットアップを開始しました。実際、PHPunitオブザーバースクリプトをセットアップした最初のプロジェクトは、ファイルを事前に処理するPHPプロジェクトです。

プロジェクトにプリプロセシングスクリプトを追加した後、それはすべて始まった:

composer require pre/short-closures
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これらの特定の前処理スクリプトを使用すると、PSR-4の自動ロードされたクラス(Path/to/file.php⇒Path/to/file.pre)を変更して、提供する機能にオプトインできます。そこで、私は私のcomposer.jsonファイルに次のものを追加しました:

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これはcomposer.json

からです

次に、現在のユーザーセッションの詳細を含む関数を生成するクラスを追加しました:

namespace App;

use Closure;

class Session
{
    private $user;

    public function __construct(array $user)
    {
        $this->user = $user;
    }

    public function closureWithUser(Closure $closure)
    {
        return () => {
            $closure($this->user);
        };
    }
}
ログイン後にコピー
ログイン後にコピー

これはsrc/session.pre

に由来します

これが機能するかどうかを確認するには、小さなサンプルスクリプトをセットアップします。

require_once __DIR__ . "/vendor/autoload.php";

$session = new App\Session(["id" => 1]);

$closure = ($user) => {
    print "user: " . $user["id"] . PHP_EOL;
};

$closureWithUser = $session->closureWithUser($closure);
$closureWithUser();
ログイン後にコピー
ログイン後にコピー
これはexample.pre

に由来します

…そして、非PSR-4クラスで短い閉鎖を使用したいので、ローダーをセットアップする必要があります:

require_once __DIR__ . "/vendor/autoload.php";

Pre\Plugin\process(__DIR__ . "/example.pre");
ログイン後にコピー
ログイン後にコピー
これはroader.php

に由来します

コードのこのセクションは、小さなポイントを説明することがたくさんあります。セッションクラスには、1つの閉鎖を受け入れ、別の閉鎖を返す閉鎖的な方法があります。呼び出されると、この新しい閉鎖は元の閉鎖を呼び出し、ユーザーセッションアレイをパラメーターとして提供します。

このすべてを実行するには、端末を入力してください:

php loader.php
ログイン後にコピー
ログイン後にコピー

サイドノートとして、これらの前処理は非常に美しい効果的なPHP構文を生成します。このように見えます:

$closure = function ($user) {
   print "user: " . $user["id"] . PHP_EOL;
};
ログイン後にコピー
ログイン後にコピー

…および

public function closureWithUser(Closure $closure)
{
   return [$closure = $closure ?? null, "fn" => function () use (&$closure) {
       $closure($this->user);
   }]["fn"];
}
ログイン後にコピー
ログイン後にコピー

PHPとPREファイルの両方をリポジトリに送信したくない場合があります。これを行うには、app/**/*。php and emply.phpを.gitignoreに追加しました。

テストの設定

では、これをどのようにテストしますか? Phpunit:

のインストールから始めましょう

composer require --dev phpunit/phpunit
ログイン後にコピー
次に、構成ファイルを作成する必要があります:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    bootstrap="vendor/autoload.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="false"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
>
    <testsuites>
        <testsuite>
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>
ログイン後にコピー
これはphpunit.xml

からです

ベンダー/bin/phpunitを実行すると、機能します。しかし、私たちはまだテストしていません。やりましょう:

namespace App\Tests;

use App\Session;
use PHPUnit\Framework\TestCase;

class SessionTest extends TestCase
{
    public function testClosureIsDecorated()
    {
        $user = ["id" => 1];
        $session = new Session($user);

        $expected = null;

        $closure = function($user) use (&$expected) {
            $expected = "user: " . $user["id"];
        };

        $closureWithUser = $session
            ->closureWithUser($closure);

        $closureWithUser();

        $this->assertEquals("user: 1", $expected);
    }
}
ログイン後にコピー
これは、tests/sessiontest.php

に由来します

ベンダー/bin/phpunitを実行すると、単一のテストが渡されます。うん!

何が欠けているのですか?

これまでのところ、すべてがうまくいきました。このコードの小さな部分とこのコードのテストを書きました。プリプロセシングがどのように機能するかを心配する必要さえありません(JavaScriptプロジェクトよりもステップアップ)。

コードカバレッジを確認しようとすると問題が始まります。

セッションをテストしたときに、カバレッジが報告されます。シンプルなクラスなので、100%のカバレッジを達成しました。ただし、別のクラスを追加する場合:
vendor/bin/phpunit --coverage-html coverage
ログイン後にコピー

namespace App;

class BlackBox
{
    public function get($key)
    {
        return $GLOBALS[$key];
    }
}
ログイン後にコピー
から来ています

カバレッジをチェックするとどうなりますか?まだ100%。

これは、blackbox.preをロードするテストがないために発生します。つまり、コンパイルされていないことを意味します。したがって、Phpunitが上書きされたPHPファイルを探すと、この前処理可能なファイルが表示されません。

テストする前にすべてのファイルを構築します

テストを実行しようとする前に、すべてのPREファイルを作成する新しいスクリプトを作成しましょう。

composer require pre/short-closures
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これは、テスト/bootstrap.php
に由来します

ここでは、3つの関数を作成します。1つは再帰ファイルイテレータ(パスから)、1つはこのイテレーターを削除し、1つはPREファイルを再コンパイルするためです。

Phpunit.xmlの現在のBootstrapファイルを置き換える必要があります:

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これはphpunit.xml
からです

さて、テストを実行するたびに、このスクリプトは最初にすべての事前ファイルをPHPファイルにクリーニングして再構築します。カバレッジが正しく報告されており、幸せな旅を続けることができます…
これとは別に...

コードベースは小さいですが、小さい必要はありません。これを実際のアプリケーションで試してみることができ、テストするたびにファイルを再構築する必要があることをすぐに後悔します。

このプロジェクトでは、私が言及したこのプロジェクトでは、101の事前ファイルがあります。私の(できれば迅速な)ユニットテストスイートを実行するためには、これには多くの前処理が必要です。変更を監視し、重要な部分のみを再構築する方法が必要です。まず、ファイルオブザーバーをインストールしてみましょう:

次に、テストスクリプトを作成しましょう:

namespace App;

use Closure;

class Session
{
    private $user;

    public function __construct(array $user)
    {
        $this->user = $user;
    }

    public function closureWithUser(Closure $closure)
    {
        return () => {
            $closure($this->user);
        };
    }
}
ログイン後にコピー
ログイン後にコピー

これは、スクリプト/ウォッチテスト

に由来します
require_once __DIR__ . "/vendor/autoload.php";

$session = new App\Session(["id" => 1]);

$closure = ($user) => {
    print "user: " . $user["id"] . PHP_EOL;
};

$closureWithUser = $session->closureWithUser($closure);
$closureWithUser();
ログイン後にコピー
ログイン後にコピー
このスクリプトは、Symfony Finderを作成します(SRCとテストフォルダーをスキャンするために使用されます)。一時的な変更ファイルを定義しましたが、これは私たちがしていることに厳密に必要ではありません。次に、無限ループを使用します。 ResourceWatcherには、ファイルが作成、変更、または削除されたかどうかを確認するために使用できる方法があります。

新規、どのファイルが変更されたかを見つけて再構築しましょう。

これは、スクリプト/ウォッチテスト

に由来します

require_once __DIR__ . "/vendor/autoload.php";

Pre\Plugin\process(__DIR__ . "/example.pre");
ログイン後にコピー
ログイン後にコピー
このコードは、Bootstrapファイルで行うことに似ていますが、変更されたファイルにのみ適用されます。また、ファイルが変更されたら、テストを再実行する必要があります。

これは、スクリプト/ウォッチテスト
に由来します

いくつかの環境変数を導入しています。これらの変数を好みに合わせて管理できますが、作曲家スクリプトに追加することをお勧めします。
php loader.php
ログイン後にコピー
ログイン後にコピー

これはcomposer.json

からです

app_coverはそれほど重要ではありません。スクリプトにコードカバレッジが含まれているかどうかをオブザーバーに伝えるだけです。 APP_REBUILDはより重要な役割を再生します。TESTS/bootstrap.phpファイルがロードされたときにpreファイルが再構築されるかどうかを制御します。ファイルが要求されたときにのみ再構築されるように、ファイルを変更する必要があります:

$closure = function ($user) {
   print "user: " . $user["id"] . PHP_EOL;
};
ログイン後にコピー
ログイン後にコピー

これは、テスト/bootstrap.php

に由来します
また、ブートストラップコードを含める前に、この環境変数を設定するためにオブザーバースクリプトを変更する必要があります。オブザーバースクリプト全体が次のようになります:

public function closureWithUser(Closure $closure)
{
   return [$closure = $closure ?? null, "fn" => function () use (&$closure) {
       $closure($this->user);
   }]["fn"];
}
ログイン後にコピー
ログイン後にコピー
これは、スクリプト/ウォッチテスト

に由来します

今では、事前に処理可能なファイルが変更されるたびにテストを開始し、テストを実行できるはずです...

How to Write JavaScript-Style Test Watchers in PHP

覚えておくべきいくつかのこと(rawr)。まず、オブザーバースクリプトを実行するには、chmod xスクリプト/*が必要です。次に、config:{process-timeout:0}(composer.json)を設定する必要があります。そうしないと、オブザーバーは300秒後に死亡します。

報酬ラウンド!

このテストオブザーバーは、クールな副作用も有効にしました。これは、PHPunitテストでプリプロセッサ/変換を使用する機能です。テスト/bootstrap.phpにコードを追加した場合:

composer require pre/short-closures
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは、テスト/bootstrap.php

に由来します

…そして、テストファイルでの前処理を有効にします(preの場合、それを.preに変更することを意味します)。次に、テストファイルで同じプリプロセッサの使用を開始できます。

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これは、テスト/sessiontest.pre

に由来します

結論

このようなテストオブザーバーを作成しようとする前に、私が非常に多くのプリプロセッサの作業をしたとは信じられません。これは、他の言語やフレームワークから学ぶことができることを証明します。これらのJavaScriptプロジェクトに関与していない場合は、各テストを実行する前にファイルを再構築し続ける場合があります。吐き気!

この方法はあなたにとって効果的ですか?非同期HTTPサーバーまたはその他の長期にわたるプロセスに適応できます。コメントであなたの考えを教えてください。

JavaScriptスタイルテストオブザーバーのFAQ(FAQ)

PHPでJavaScriptスタイルのテストオブザーバーをセットアップする方法は? PHPでJavaScriptスタイルのテストオブザーバーをセットアップするには、複数のステップが含まれます。まず、phpunitとphpunit-watcherをインストールする必要があります。 Phpunitは、コードのテストを作成する方法を提供するPHPのテストフレームワークです。 Phpunit-watcherは、ファイルを保存するときにコードを監視し、phpunitテストを実行するツールです。これらのツールをインストールした後、コードを監視してテストを自動的に実行するようにphpunit-watcherを構成できます。この設定を使用すると、コードの変更に関するフィードバックをすぐに取得できます。これにより、エラーをより迅速に発見して修正するのに役立ちます。

PHPでテストオブザーバーを使用することの利点は何ですか?

PHPでテストオブザーバーを使用することには多くの利点があります。コードの変更に関する即時フィードバックを提供します。これにより、エラーをより速く検出および修正するのに役立ちます。また、コードを変更するたびに手動でテストを実行する必要がないため、時間を節約できます。さらに、コードのテストを作成することをお勧めします。これにより、コードの品質が向上し、維持が容易になります。

JavaScript関数内でPHPコードを使用できますか?

はい、JavaScript関数内でPHPコードを使用できますが、これは推奨されません。 PHPはサーバー側の言語であり、JavaScriptはクライアント側の言語です。これは、ページがクライアントに送信される前にPHPコードがサーバーで実行され、ページが受信された後にJavaScriptコードがクライアントで実行されることを意味します。したがって、JavaScript関数内でPHPコードを使用しようとすると、PHPコードはJavaScript関数の前に実行され、予期しない結果につながる可能性があります。

Codeceptionを使用してPHPコードをテストする方法は?

Codeceptionは、単体テスト、機能テスト、および受け入れテストをサポートするPHPのテストフレームワークです。 CodeceptionでPHPコードをテストするには、まずCodeceptionをインストールし、プロジェクト用に構成する必要があります。次に、Codeceptionの構文を使用してコードのテストを作成し、CodeCeptionのコマンドラインツールを使用してテストを実行できます。

JavaScriptでPHPコードを書き込む方法は?

技術的にはJavaScriptでPHPコードを記述できますが、これは推奨されません。 PHPはサーバー側の言語であり、JavaScriptはクライアント側の言語です。これは、ページがクライアントに送信される前にPHPコードがサーバーで実行され、ページが受信された後にJavaScriptコードがクライアントで実行されることを意味します。したがって、JavaScriptでPHPコードを記述しようとすると、PHPコードがJavaScriptコードの前に実行され、予期しない結果につながる可能性があります。代わりに、Ajaxを使用してクライアントからサーバーにデータを送信する方が良いでしょう。

以上がPHPでJavaScriptスタイルのテストウォッチャーを書く方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 Apr 08, 2025 am 12:03 AM

PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 Apr 09, 2025 am 12:04 AM

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか? PHPは、ファイルを安全に処理する方法をどのように処理しますか? Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

See all articles