dusk中でブラウザに依らないassertを実行

  • 2018年12月20日
  • 2018年12月21日
  • Laravel, PHP

 ブラウザテスト(Laravel Dusk) 5.6 Laravel#使用可能なアサート
 Laravelの自動ブラウザテスト機能duskでは多くのassertが使用可能です。多くのassertが使用可能ですがいずれもブラウザ上で何かを確認するためのassertです。duskは単一責任の原則を守りきれいに作られています。時にはブラウザ上の操作の結果データベース上の値がどうなったかを確認するケースの様にブラウザを介さないassertを実行したい場合があります。このためにduskで使用するコード中にduskを飛び越してduskの使っているPHPUnitにアクセスするコードを埋め込みます。
 duskの使用可能なアサートはだいたい次の様なコードで作られています。

use PHPUnit\Framework\Assert as PHPUnit;
/* 省略 */
    /**
     * Assert that the given text appears within the given selector.
     *
     * @param  string  $selector
     * @param  string  $text
     * @return $this
     */
    public function assertSeeIn($selector, $text)
    {
        $fullSelector = $this->resolver->format($selector);

        $element = $this->resolver->findOrFail($selector);

        PHPUnit::assertTrue(
            Str::contains($element->getText(), $text),
            "Did not see expected text [{$text}] within element [{$fullSelector}]."
        );

        return $this;
    }

 与えられたセレクタに従った要素中に与えられたtextが存在しないならばエラーというassertTrueを呼び出しています。このコード同様にPHPUnit\Framework\Assertからより素朴なassert関数を呼び出すことによってより自由度の高いテストをすることが出来ます。もちろんエラーが起きた際、ログやコンソールにエラーが起きたコード中の場所とエラーメッセージが表示されます。

    /**
     * 契約取消しテスト
     * @param Browser $browser
     * @throws \Facebook\WebDriver\Exception\TimeOutException
     */
    private function cancelContractTest(Browser $browser)
    {
        $browser->//省略
        $member = Members::find($this->member_key);
        PHPUnit::assertTrue(is_null($member->contract), "exist expected null contract.");
        $this->assertSeeMemberType($browser, $member);
    }

 最近書いたコードではこのようなものを書きました。これは、契約取消し操作をしたならばmemberはcontractを持っていないはず、というテストでした。
 duskは見事にSeleniumとPHPUnitを繋げて分かりやすく覆った便利なテスト機能です。duskはブラウザ操作とテストケースの抽象化のために幾重ものコードになっていますが、個々のソースはわかりやすく結局はPHPUnitでSeleniumの操作に対してassertするという言葉でまとめられる機能です。以前紹介した個々のテストケース実行コマンドもduskの説明書にないがPHPUnitの説明書にはある機能です。ヘルプには大して記述はありませんがPHPUnitの動作のかなりの部分が簡単にduskで使えます。

追記:
 テストケースを記述するクラスが継承するべきTestCaseクラス自身がPHPUnit\Framework\Assertを継承していました。useせずとも

$this->assertTrue(is_null($member->contract), "exist expected null contract.");

で十分でした。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG