WordPressテーマ・プラグインの自動テストでよく使うテストコードの書き方メモ

WordPressテーマ・プラグインの自動テストでよく使うテストコードの書き方メモ

2018.3.6

WordPressテーマやプラグインの自動テストを行う際、記事の追加をしたりページの移動をするためには、そのようなコードを書く必要があります

今回はテストコードでよく使うメソッドや、そもそもテストコードどうやって書くんだ?という点をまとめました

テスト環境の準備

ユニットテストの環境準備は以下の記事を参考にして下さい

WordPressの自動テストを行う環境を整えるまでの道のり
テーマやプラグインで作った機能の検証をvar_dumpで表示させたり、検証用の記事作っておいたりなど… 機能が多くなってくると毎回ブラウザで確認するのはなかなか…
yosiakatsuki.net

テストコードの書き方

まずはテストコードの書き方

一番簡単なのはWP-CLIを使って作ったサンプルのテストコードをコピーして作るのが楽です

サンプルコードはこんな感じ

/**
 * Sample test case.
 */
class SampleTest extends WP_UnitTestCase {

    /**
     * A single example test.
     */
    function test_sample() {
        // Replace this with some actual testing code.
        $this->assertTrue( true );
    }
}

テストコードのファイル名、関数の書き方

実行するテストのコードが書かれたファイルはtest-xxxxx.phpのようなtest-から始まる名前で作成します

テストコードはWP_UnitTestCaseを継承したクラスの中にtestから始まる名前の関数を作るか、@testアノテーションと呼ばれるコメントを記述することでテストメソッドとして認識されます

/**
 * Sample test case.
 */
class SampleTest extends WP_UnitTestCase {

    /**
     * A single example test.
     */
    function test_sample() {
        // Replace this with some actual testing code.
        $this->assertTrue( true );
    }
    /**
     * @test 
     * A single example test2.
     */
    function sample2() {
        // Replace this with some actual testing code.
        $this->assertTrue( true );
    }
}

検証部分

テストとしての検証部分は$this->assertTrue( true );と書かれている部分になります

assertTrueのようなアサーションメソッドで期待値と実際の値が正しいかを検証します

アサーションメソッドについてはPHPUnitのドキュメントを参考にしてみて下さい

WordPressの自動テスト用コード書き方まとめ

それではここから、WordPressテーマやプラグインで使うことにあるであろうテストコードを徐々にメモしていきます

テスト用の投稿データを作成・更新する

/**
 * 投稿追加
 */
function test_post_add() {
    /**
     * 投稿を追加して、追加した投稿IDを取得
     */
    $post_id = $this->factory->post->create();
    /**
     * 追加した投稿の更新
     */
    wp_update_post( array( 'ID' => $post_id, 'post_title' => '投稿が追加出来ました' ) );
    /**
     * 検証
     */
    $this->assertEquals( '投稿が追加出来ました', get_the_title( $post_id ) );
}

$this->factory->post->createで投稿を作成し、戻り値で投稿IDを取得できます

あとは投稿IDを使ってWordPressの各種関数を実行します

$this->factory->post->createの引数でパラメータをしてしてもOKです

パラメーターについてはwp_insert_postを参照

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_post

the_contentの出力結果をチェック

get_the_contentに投稿IDを指定できないので、expectOutputStringメソッドで期待値をセットした後にthe_contentを実行します

事前に投稿を作成しsetup_postdataで現在の投稿をセットしておきます

/**
 * the_contentの出力結果を確認
 */
function test_post_content() {
    global $post;
    $post_id = $this->factory->post->create( array( 'post_content' => 'コンテンツ' ) );
    $post = get_post( $post_id );
    setup_postdata( $post );
    /**
     * 検証
     */
    $content2 = '<p>コンテンツ</p>' . PHP_EOL;
    $this->expectOutputString( $content2 );
    the_content();
}

expectOutputStringの引数に渡す期待値の末尾に改行が必要になります

URLへ移動

投稿ページ内だけ実行する関数などがあればgo_toでURLへ移動

/**
 * 特定のURLへ移動して検証
 */
function test_go_to() {
    $post_id = $this->factory->post->create();
    $this->go_to( get_the_permalink( $post_id ) );
    /**
     * 検証
     */
    $this->assertTrue( is_single() );
    $this->assertTrue( is_singular() );
    $this->assertFalse( is_page() );
}

設定を更新する

設定の更新はupdate_optionを使います

/**
 * 設定値を更新する
 */
function test_go_to() {
    update_option( 'my_name', 'ワシじゃよ。オーキドじゃ' );
    /**
     * 検証
     */
    $this->assertSame( 'ワシじゃよ。オーキドじゃ', get_option( 'my_name', '誰じゃ誰じゃ誰誰じゃ' ) );
}

ココらへんは普通にWordPressの関数でゴリゴリ変えられるっぽいのかな?

このページの目的

このページは「きっと後で自分が見直す」と思って書いているので、必要になったコードをメモとして随時足しています

徐々に内容が充実していく予定です。

最終更新日は先頭画像の下に書いてある日付をご参照下さい