PHPUnit を使用して複数のユーザー タイプを持つ Web サイトを単体テストする最良の方法

StackOverflow https://stackoverflow.com/questions/58969

  •  09-06-2019
  •  | 
  •  

質問

PHPUnit を使用して、作業中の Web サイトをテストする方法を学び始めています。私が直面している問題は、5 つの異なるユーザー タイプが定義されており、異なるタイプを使用してすべてのクラスをテストできる必要があることです。現在ユーザークラスがあり、これを各関数に渡したいのですが、これを渡す方法がわかりません。また、正しいかどうかが返される可能性のあるさまざまなエラーをテストする方法もわかりません。

編集: 言うべきだった。ユーザー クラスがあり、このクラスの異なるインスタンスを各単体テストに渡したいと考えています。

役に立ちましたか?

解決

さまざまなユーザー クラスが親ユーザー クラスから継承する場合は、テスト ケース クラスにも同じ継承構造を使用することをお勧めします。

次のサンプル クラスを考えてみましょう。

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

テスト ケース クラスで次のことを実行できます。

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

各テストはオーバーライドできる作成メソッドに依存しており、テスト メソッドは親テスト クラスから継承されるため、予想される動作を変更するためにオーバーライドしない限り、親クラスのすべてのテストは子クラスに対して実行されます。

これは私の限られた経験の中でうまくいきました。

他のヒント

実際の UI をテストしたい場合は、Selenium (www.openqa.org) などを使用してみてください。これにより、ブラウザを駆動するコードを PHP (phpUnit で動作すると想定しています) で記述することができます。

もう 1 つのアプローチは、異なるユーザー タイプの各テストで呼び出せる共通のメソッドを用意することです。つまり、「ValidatePage」のようなもので、TestAdminUser または Test RegularUser から呼び出して、期待しているものと同じ基本的な検証をメソッドに実行させることができます。

遭遇しないように注意してください アンチパターン ここ。もしかしたらコンストラクターでやりすぎているのではないでしょうか?それとも、実際にはこれらは異なるクラスであるべきなのでしょうか?テストでは多くの場合、次のような手がかりが得られます。 コードのデザイン。 あの人達の話を聞いて。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top