PHPでJavaScriptスタイルのテストウォッチャーを書く方法
コアポイント
-
JavaScriptスタイルのテストオブザーバーをPHPプロジェクトに統合し、ファイル変換の前処理を自動化し、ファイルが変更されたときにユニットテストを再実行し、開発効率を改善します。
- phpunitなどのツールを使用して自動テストをセットアップし、phpunit-watcherを使用してファイル変更を観察し、開発中の即時のフィードバックとエラーの検出を確保します。
- PHPプロジェクトに前処理スクリプトを実装し、JavaScript Babelと同様の構文変換を許可するため、互換性を向上させ、手動エンコードの取り組みを削減します。
- PHPテスト環境を構成して、テストする前に事前に処理されたファイルを自動的に再構築し、正確なコードカバレッジを維持し、テストプロセスを簡素化します。
- ファイルオブザーバーを使用して高度な構成を調査して、変更されたファイルのみを選択的に再構築し、大規模プロジェクトの多数のファイルのテストサイクルを大幅に高速化します。
最初にコードのテストを書きませんでした。多くの人と同様に、私の「テスト」はコードを書き、ページを更新しています。 「それは正しく見えますか?」それが正しいと思うなら、私は続けます。
実際には、私が行った仕事のほとんどは、他の形式のテストについてあまり気にしない企業にとってです。長年の経験と、クリス・ハルジェスのような人々からの賢明なアドバイスの後、私はテストの価値を見ました。そして、私はまだ良いテストがどのように見えるかを学んでいます。
私は最近、バンドルされたテストオブザーバーを含むいくつかのJavaScriptプロジェクトの取り組みを開始しました。
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]; } }
これは、blackbox.preをロードするテストがないために発生します。つまり、コンパイルされていないことを意味します。したがって、Phpunitが上書きされたPHPファイルを探すと、この前処理可能なファイルが表示されません。カバレッジをチェックするとどうなりますか?まだ100%。
テストする前にすべてのファイルを構築します
テストを実行しようとする前に、すべてのPREファイルを作成する新しいスクリプトを作成しましょう。
composer require pre/short-closures
に由来しますここでは、3つの関数を作成します。1つは再帰ファイルイテレータ(パスから)、1つはこのイテレーターを削除し、1つはPREファイルを再コンパイルするためです。
Phpunit.xmlの現在のBootstrapファイルを置き換える必要があります:
"autoload": { "psr-4": { "App\": "src" } }, "autoload-dev": { "psr-4": { "App\Tests\": "tests" } }
からですこれとは別に...さて、テストを実行するたびに、このスクリプトは最初にすべての事前ファイルを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");
に由来しますこれは、スクリプト/ウォッチテスト
いくつかの環境変数を導入しています。これらの変数を好みに合わせて管理できますが、作曲家スクリプトに追加することをお勧めします。
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"]; }
これは、スクリプト/ウォッチテストに由来します
今では、事前に処理可能なファイルが変更されるたびにテストを開始し、テストを実行できるはずです...
覚えておくべきいくつかのこと(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でテストオブザーバーを使用することの利点は何ですか?
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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