PestPHPテストフレームワークを使用してWordPressコードのテストを開始する方法

公開: 2022-05-18

WordPressは当初から長い道のりを歩んできており、ブログソフトウェア以上のものに成長したことは誰もが認めるところです。

基本的にはコンテンツ管理システム(CMS)ですが、wordpress.orgディレクトリに59,000を超えるプラグインがあるため、さらに多くのプラグインにカスタマイズできます。

その人気の理由は、コンテンツの作成者と開発者の両方にとって参入障壁が低いことです。 これにはコストがかかる場合があります。 開発に関しては、WordPressの評判が悪いことは周知の事実です。 PHPコードに関しては、下位互換性を損なう変更を防ぐために、多くのレガシーな手荷物と厳しいルールがあります(グーテンベルクは、私が取り上げないもう1つの話です)。

そのレガシーPHPコードは、プログラミングの世界に参入し始めている開発者によってよく使用されます。その問題は、いくつかの悪いプログラミングパターンを学習できることです。 つまり、彼らは不十分に書かれたコードを再利用し、世界中の悪いコードの量を増やすことを意味します。

これは、WordPressが開発者コミュニティで評判が悪いところです。

サイクルを壊す

では、どうすればこの悪いコードのサイクルを断ち切ることができるでしょうか? 新しい開発者に良いコードを書く方法を教えることによって。 新しい開発者(しかし、まだ「WordPress」のやり方に固執している古い開発者も)を教える1つの例は、チュートリアルを書くことです。

もう1つの方法は、より良いコードを書くのに役立つツールを使用するように促すことです。

私は現在、WordPressコーディング標準の新しいバージョンをリリースすることを目的とした作業に携わっています。これは、コードに潜在的な問題(セキュリティ、ベストプラクティス、コードスタイル)があるかどうかを通知するPHP_CodeSnifferツールに使用される一連のルールです。 )。

私が最近開発したもう1つのツールは、開発者がPestテストフレームワークを使用するWordPress統合テストをセットアップするのに役立つパッケージです。

では、なぜこの新しいツールが必要なのですか?

このパッケージを作成する主な動機は、より多くの人々、特にプラグイン開発者にコードのテストを作成するように促すことです。

WordPressコミュニティの多くの開発者は、このマントラに賛成しています。ブラウザで試してみたので、うまくいくことがわかります。 それは問題ありませんが、問題があります。

まず、時間がかかります。 変更を加えるたびに、それが機能することを確認する必要がありますが、何も壊していないことも確認する必要があります。

第二に、人々は間違いを犯します。 私たちは絶対確実ではありません。コードは、想像もしなかった方法で悪用される可能性があります。 あなたは、コードを書くときに人々がいかに創造的であるかに驚くでしょう。

自動テストは迅速であり、コードの実行時に発生するさまざまなケースのテストに役立ちます。

意図した動作(ハッピーパス)をテストし、すばやく、意図しない方法でコードを使用する方法の例を追加できます(不幸なパス)。

また、コードをリグレッションから保護します。 コードリグレッションとは、新しいコードを追加して、意図せずにコードの一部を壊した場合です。

これまでに設定されたテストの問題

WordPressでのテストは新しいことではありません。 また、以前はコードのテストを設定できなかったわけではありません。 wp-browserのようにすべてをセットアップするのに役立つ素晴らしいライブラリがあります。

しかし、問題は、セットアップ手順がしばしば不格好であるということです。

テスト用に別のデータベースを設定する必要があります。また、特定のスクリプトを実行してから、ファイルを変更してすべてが機能するようにする必要があります。

それに直面しましょう、それは簡単なことではありません、そして開発者は本質的に怠惰な生き物です(それが私たちが私たちのために何かをするためのコードを書く理由です)。

wp-pest統合テストのセットアップの目的は、余分な作業をすべて排除することです。

設定方法

設定するには、プロジェクトでComposerを使用する必要があります。 これは、コードにパッケージを追加するためのデファクトスタンダードの方法です。

ターミナルタイプで

composer require dingo-d/wp-pest-integration-test-setup --dev

パッケージとその依存関係をダウンロードしたら、次のように入力してテーマテストを設定できます。

 vendor/bin/wp-pest setup theme

または、プラグインのテストを設定する場合は、次のように記述できます。

 vendor/bin/wp-pest setup plugin --plugin-slug=your-plugin-slug

オプションで、 --wp-versionパラメーターを指定して、コードをテストするWordPressのバージョンを指定できます。

バックグラウンドで、WordPressインスタンスがダウンロードされ、実行可能なテストの2つの例とともに、メモリ内データベースがセットアップされます。

次に、いずれかを実行します

vendor/bin/pest --group=unit

また

vendor/bin/pest --group=integration

テストを実行します。

Pestの優れている点は、その構文が開発者にとって使いやすいことです。 それは素晴らしいドキュメントと素晴らしい構文を持っています。 簡単な例を見てみましょう。 'Books'というカスタム投稿タイプを登録しているとします。

 <?php /** * Plugin Name: Test plugin * Desctiption: Test plugin * Version: 1.0.0 * License: MIT */ function test_plugin_register_books_cpt() { $args = array( 'label' => esc_html__( 'Books', 'test-plugin' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'book' ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ), ); register_post_type( 'book', $args ); } add_action( 'init', 'test_plugin_register_books_cpt' );

例を追加するセットアップコマンドを実行すると、 BooksCptTest.phpというテストは次のようになります。

 <?php namespace Tests\Integration; beforeEach(function () { parent::setUp(); }); afterEach(function () { parent::tearDown(); }); test('Books custom post type is registered', function () { // We can use assertions from PHP_Unit. $this->assertNotFalse(has_action('init', 'test_plugin_register_books_cpt')); $registeredPostTypes = \get_post_types(); // Or we can use expectations API from Pest. expect($registeredPostTypes) ->toBeArray() ->toHaveKey('book'); });

vendor/bin/pest --group=integrationを実行すると、次の出力が得られます。

 Installing... Running as single site... To run multisite, use -c tests/phpunit/multisite.xml Not running ajax tests. To execute these, use --group ajax. Not running ms-files tests. To execute these, use --group ms-files. Not running external-http tests. To execute these, use --group external-http. PASS Tests\\Integration\\BooksCptTest ✓ Books custom post type is registered Tests: 1 passed Time: 0.14s

結論

そして、まさにそのように、テーマまたはプラグインでWordPress統合テストを実行することができます。 テストは、間違いから私たちを守るだけでなく、クリーンでテスト可能なコードを書くことを強制するので、素晴らしいです。 これは、ロジックが複雑なプラグインやサードパーティのAPIと通信しているプラ​​グインに特に当てはまります。

このようなコードベースのテストを作成すると、コードアーキテクチャがどのように見えるかを考える必要があるため、自動テストを簡単に作成できます。すべてを手動でテストする必要がないため、時間と費用を節約できます。

これがメリットになると思われる場合は、自由に使用して、GitHubでリポジトリにスターを付けてください。

うまくいけば、これにより、より多くのWordPress開発者がコーディングスキルを向上させるツールを使用するようになります。