ホームページ >バックエンド開発 >PHPチュートリアル >PHPでJavaScriptスタイルのテストウォッチャーを書く方法
コアポイント
最初にコードのテストを書きませんでした。多くの人と同様に、私の「テスト」はコードを書き、ページを更新しています。 「それは正しく見えますか?」それが正しいと思うなら、私は続けます。
実際には、私が行った仕事のほとんどは、他の形式のテストについてあまり気にしない企業にとってです。長年の経験と、クリス・ハルジェスのような人々からの賢明なアドバイスの後、私はテストの価値を見ました。そして、私はまだ良いテストがどのように見えるかを学んでいます。
私は最近、バンドルされたテストオブザーバーを含むいくつかのJavaScriptプロジェクトの取り組みを開始しました。
JavaScriptの世界では、ソースコードを前処理することは珍しくありません。 JavaScriptの世界では、開発者はサポートされていない構文を使用してコードを作成し、多くの場合Babelと呼ばれるツールを使用して、コードを広くサポートされている構文に変換します。
変換スクリプトを呼び出すための負担を減らすために、VoilerPlateプロジェクトはファイルの変更を自動的に監視するスクリプトを含め始めました。
私が取り組んだプロジェクトは、再実行ユニットテストに対して同様のアプローチを取りました。 JavaScriptファイルを変更すると、ファイルが変換され、ユニットテストが再実行されます。これにより、何かが壊れているかどうかをすぐに確認できます。
このチュートリアルのコードはgithubで見つけることができます。 PHP 7.1でテストしました。
これらのプロジェクトに取り組み始めて以来、phpunitに似たようなもののセットアップを開始しました。実際、PHPunitオブザーバースクリプトをセットアップした最初のプロジェクトは、ファイルを事前に処理するPHPプロジェクトです。プロジェクト設定
プロジェクトにプリプロセシングスクリプトを追加した後、それはすべて始まった:
<code class="language-bash">composer require pre/short-closures</code>
これらの特定の前処理スクリプトを使用すると、PSR-4の自動ロードされたクラス(Path/to/file.php⇒Path/to/file.pre)を変更して、提供する機能にオプトインできます。そこで、私は私のcomposer.jsonファイルに次のものを追加しました:
<code class="language-json">"autoload": { "psr-4": { "App\": "src" } }, "autoload-dev": { "psr-4": { "App\Tests\": "tests" } }</code>
これはcomposer.json
からです
次に、現在のユーザーセッションの詳細を含む関数を生成するクラスを追加しました:
<code class="language-php">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); }; } }</code>
これはsrc/session.pre
に由来します
これが機能するかどうかを確認するには、小さなサンプルスクリプトをセットアップします。
<code class="language-php">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();</code>
これはexample.pre…そして、非PSR-4クラスで短い閉鎖を使用したいので、ローダーをセットアップする必要があります:に由来します
<code class="language-php">require_once __DIR__ . "/vendor/autoload.php"; Pre\Plugin\process(__DIR__ . "/example.pre");</code>
これはroader.phpコードのこのセクションは、小さなポイントを説明することがたくさんあります。セッションクラスには、1つの閉鎖を受け入れ、別の閉鎖を返す閉鎖的な方法があります。呼び出されると、この新しい閉鎖は元の閉鎖を呼び出し、ユーザーセッションアレイをパラメーターとして提供します。に由来します
このすべてを実行するには、端末を入力してください:
<code class="language-bash">php loader.php</code>
サイドノートとして、これらの前処理は非常に美しい効果的なPHP構文を生成します。このように見えます:
<code class="language-php">$closure = function ($user) { print "user: " . $user["id"] . PHP_EOL; };</code>
…および
<code class="language-php">public function closureWithUser(Closure $closure) { return [$closure = $closure ?? null, "fn" => function () use (&$closure) { $closure($this->user); }]["fn"]; }</code>
PHPとPREファイルの両方をリポジトリに送信したくない場合があります。これを行うには、app/**/*。php and emply.phpを.gitignoreに追加しました。
テストの設定のインストールから始めましょう
<code class="language-bash">composer require --dev phpunit/phpunit</code>次に、構成ファイルを作成する必要があります:
<code class="language-xml"><?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></code>
これはphpunit.xmlベンダー/bin/phpunitを実行すると、機能します。しかし、私たちはまだテストしていません。やりましょう:からです
<code class="language-php">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); } }</code>
これは、tests/sessiontest.phpベンダー/bin/phpunitを実行すると、単一のテストが渡されます。うん!に由来します
何が欠けているのですか?
コードカバレッジを確認しようとすると問題が始まります。
セッションをテストしたときに、カバレッジが報告されます。シンプルなクラスなので、100%のカバレッジを達成しました。ただし、別のクラスを追加する場合:
<code class="language-bash">vendor/bin/phpunit --coverage-html coverage</code>
namespace App;
class BlackBox
{
public function get($key)
{
return $GLOBALS[$key];
}
}
から来ています
これは、blackbox.preをロードするテストがないために発生します。つまり、コンパイルされていないことを意味します。したがって、Phpunitが上書きされたPHPファイルを探すと、この前処理可能なファイルが表示されません。カバレッジをチェックするとどうなりますか?まだ100%。
<code class="language-bash">composer require pre/short-closures</code>これは、テスト/bootstrap.php
に由来しますここでは、3つの関数を作成します。1つは再帰ファイルイテレータ(パスから)、1つはこのイテレーターを削除し、1つはPREファイルを再コンパイルするためです。
Phpunit.xmlの現在のBootstrapファイルを置き換える必要があります:
<code class="language-json">"autoload": { "psr-4": { "App\": "src" } }, "autoload-dev": { "psr-4": { "App\Tests\": "tests" } }</code>これはphpunit.xml
からですこれとは別に...さて、テストを実行するたびに、このスクリプトは最初にすべての事前ファイルをPHPファイルにクリーニングして再構築します。カバレッジが正しく報告されており、幸せな旅を続けることができます…
コードベースは小さいですが、小さい必要はありません。これを実際のアプリケーションで試してみることができ、テストするたびにファイルを再構築する必要があることをすぐに後悔します。
次に、テストスクリプトを作成しましょう:
<code class="language-php">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); }; } }</code>
これは、スクリプト/ウォッチテスト
に由来します<code class="language-php">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();</code>
このスクリプトは、Symfony Finderを作成します(SRCとテストフォルダーをスキャンするために使用されます)。一時的な変更ファイルを定義しましたが、これは私たちがしていることに厳密に必要ではありません。次に、無限ループを使用します。 ResourceWatcherには、ファイルが作成、変更、または削除されたかどうかを確認するために使用できる方法があります。新規、どのファイルが変更されたかを見つけて再構築しましょう。
これは、スクリプト/ウォッチテスト
に由来します
<code class="language-php">require_once __DIR__ . "/vendor/autoload.php"; Pre\Plugin\process(__DIR__ . "/example.pre");</code>このコードは、Bootstrapファイルで行うことに似ていますが、変更されたファイルにのみ適用されます。また、ファイルが変更されたら、テストを再実行する必要があります。
に由来しますこれは、スクリプト/ウォッチテスト
いくつかの環境変数を導入しています。これらの変数を好みに合わせて管理できますが、作曲家スクリプトに追加することをお勧めします。
<code class="language-bash">php loader.php</code>
これはcomposer.json
からです
app_coverはそれほど重要ではありません。スクリプトにコードカバレッジが含まれているかどうかをオブザーバーに伝えるだけです。 APP_REBUILDはより重要な役割を再生します。TESTS/bootstrap.phpファイルがロードされたときにpreファイルが再構築されるかどうかを制御します。ファイルが要求されたときにのみ再構築されるように、ファイルを変更する必要があります:
<code class="language-php">$closure = function ($user) { print "user: " . $user["id"] . PHP_EOL; };</code>
また、ブートストラップコードを含める前に、この環境変数を設定するためにオブザーバースクリプトを変更する必要があります。オブザーバースクリプト全体が次のようになります:これは、テスト/bootstrap.php
に由来します
<code class="language-php">public function closureWithUser(Closure $closure) { return [$closure = $closure ?? null, "fn" => function () use (&$closure) { $closure($this->user); }]["fn"]; }</code>
これは、スクリプト/ウォッチテストに由来します
今では、事前に処理可能なファイルが変更されるたびにテストを開始し、テストを実行できるはずです...
覚えておくべきいくつかのこと(rawr)。まず、オブザーバースクリプトを実行するには、chmod xスクリプト/*が必要です。次に、config:{process-timeout:0}(composer.json)を設定する必要があります。そうしないと、オブザーバーは300秒後に死亡します。
このテストオブザーバーは、クールな副作用も有効にしました。これは、PHPunitテストでプリプロセッサ/変換を使用する機能です。テスト/bootstrap.phpにコードを追加した場合:
<code class="language-bash">composer require pre/short-closures</code>
これは、テスト/bootstrap.php
に由来します
…そして、テストファイルでの前処理を有効にします(preの場合、それを.preに変更することを意味します)。次に、テストファイルで同じプリプロセッサの使用を開始できます。
<code class="language-json">"autoload": { "psr-4": { "App\": "src" } }, "autoload-dev": { "psr-4": { "App\Tests\": "tests" } }</code>
これは、テスト/sessiontest.pre結論に由来します
この方法はあなたにとって効果的ですか?非同期HTTPサーバーまたはその他の長期にわたるプロセスに適応できます。コメントであなたの考えを教えてください。
JavaScriptスタイルテストオブザーバーのFAQ(FAQ)
PHPでテストオブザーバーを使用することには多くの利点があります。コードの変更に関する即時フィードバックを提供します。これにより、エラーをより速く検出および修正するのに役立ちます。また、コードを変更するたびに手動でテストを実行する必要がないため、時間を節約できます。さらに、コードのテストを作成することをお勧めします。これにより、コードの品質が向上し、維持が容易になります。
はい、JavaScript関数内でPHPコードを使用できますが、これは推奨されません。 PHPはサーバー側の言語であり、JavaScriptはクライアント側の言語です。これは、ページがクライアントに送信される前にPHPコードがサーバーで実行され、ページが受信された後にJavaScriptコードがクライアントで実行されることを意味します。したがって、JavaScript関数内でPHPコードを使用しようとすると、PHPコードはJavaScript関数の前に実行され、予期しない結果につながる可能性があります。
Codeceptionは、単体テスト、機能テスト、および受け入れテストをサポートするPHPのテストフレームワークです。 CodeceptionでPHPコードをテストするには、まずCodeceptionをインストールし、プロジェクト用に構成する必要があります。次に、Codeceptionの構文を使用してコードのテストを作成し、CodeCeptionのコマンドラインツールを使用してテストを実行できます。
技術的にはJavaScriptでPHPコードを記述できますが、これは推奨されません。 PHPはサーバー側の言語であり、JavaScriptはクライアント側の言語です。これは、ページがクライアントに送信される前にPHPコードがサーバーで実行され、ページが受信された後にJavaScriptコードがクライアントで実行されることを意味します。したがって、JavaScriptでPHPコードを記述しようとすると、PHPコードがJavaScriptコードの前に実行され、予期しない結果につながる可能性があります。代わりに、Ajaxを使用してクライアントからサーバーにデータを送信する方が良いでしょう。
以上がPHPでJavaScriptスタイルのテストウォッチャーを書く方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。