ホームページ >バックエンド開発 >PHPチュートリアル >PHPマスター|モックオブジェクトテストの紹介

PHPマスター|モックオブジェクトテストの紹介

William Shakespeare
William Shakespeareオリジナル
2025-02-26 11:27:11734ブラウズ

PHP Master | An Introduction to Mock Object Testing

シミュレートされたオブジェクト単位テストの重要なポイント

モックオブジェクトは、実際のオブジェクトを置き換え、実際のオブジェクトの実行動作をシミュレートするために単体テストで使用される代替物です。オブジェクトのシミュレーションは、オブジェクトの依存関係がまだ実装されていない場合、またはシミュレートが困難な要因に依存している場合に役立ちます。
  • テストでは、モックオブジェクトが作成され、システムに注入されて依存関係を満たし、開発者がビジネスロジックの作成を開始できるようにします。
  • 最初に手作りのモックオブジェクトを使用できますが、テスト要件がより複雑になるため、実際の模擬フレームワークが必要になる場合があります。シミュレーションフレームワークは、時間を節約し、よりクリーンなコードを作成できます。
  • Phpunitのシミュレーションフレームワークは、テスト用のモックオブジェクトを作成するために使用できるようなツールです。このプロセスには、シミュレートされるオブジェクトを識別し、シミュレートするメソッドを定義し、パラメーターと戻り値を指定することが含まれます。
  • シミュレートされたオブジェクトは、主にテスト中のシステムを分離するための単体テストに使用されます。それらは、複雑な実際のオブジェクトの実行動作をシミュレートし、アプリケーションの特定のモジュールが他のモジュールとどのように相互作用するかをテストするのに非常に役立ちます。
  • 開発チームの一員である場合、コードは通常、チームメイトによって書かれたコードに依存します。しかし、現時点でコードが利用できない場合はどうなりますか?たとえば、チームメイトがまだ書き終えていませんか?または、必要なコードに設定が困難な他の外部依存関係が必要な場合はどうなりますか?制御できない他の要因のためにコードをテストできない場合はどうなりますか?あなたはただたむろして何もしませんか、あなたのチームが終了するのを待っていますか、それともすべてが準備ができていますか?もちろん違います!この記事では、この依存関係の問題を解決するためにコードを書く方法について説明します。理想的には、ユニットテストに関する背景知識が必要であり、SitePointでMichelle Saverが書いた単体テストに関する優れた入門記事がすでにあります。この記事ではそれを必要としませんが、自動化されたデータベーステストに関する他の記事をチェックしてください。
シミュレートされたオブジェクトのケース

ご想像のとおり、オブジェクトをock笑すると、紹介で言及したトリッキーな状況を解決できます。しかし、模擬オブジェクトとは何ですか?模擬オブジェクトは、実際のオブジェクトの実際の実装を置き換える代替オブジェクトです。なぜ実際のオブジェクトの代わりに代替オブジェクトが必要なのですか?モックオブジェクトは、テストケースで実際のオブジェクトの実行動作をシミュレートするために単体テストに使用されます。それらを使用することにより、実装しているオブジェクトの機能をテストしやすくなります。モックオブジェクトを使用する場合の便利な状況を次に示します。

  1. オブジェクトの1つ以上の依存関係の実際の実装はまだ実装されていません。あなたのタスクがデータベース内のいくつかのデータの処理を行うことであると仮定します。オブジェクトまたはデータリポジトリへの何らかの形式のデータアクセスを呼び出すかもしれませんが、データベースがまだ設定されていない場合はどうなりますか?データが利用可能である場合(私は何度も遭遇しました)、またはデータベースを照会するコードがまだ記述されていない場合はどうなりますか?データアクセスオブジェクトをシミュレートして、事前定義された値を返すことにより、実際のデータアクセスオブジェクトをシミュレートします。これにより、データベースのセットアップ、データの検索、またはデータベースを照会するコードの書き込みの負担から救われます。

  2. オブジェクトの依存関係の実際の実装は、シミュレートが困難な要因に依存します。 Facebookの投稿に日ごとに数字やコメントの数を数えたいとします。データはどこで入手しますか? Facebook開発者アカウントは新しいです。おっと、あなたにはまだ友達がいません!いいねやコメントをどのようにシミュレートしますか?オブジェクトをシミュレートすると、同僚を悩ませるよりも、いくつかの投稿を好むかコメントする方法が提供されます。日ごとにデータを表示したい場合、これらすべての操作を時間枠でどのようにシミュレートしますか?毎月はどうですか?想像力に富んでいない場合、Facebookが現在ダウンしている場合はどうすればよいですか?模擬オブジェクトは、Facebookライブラリのふりをして、必要なデータを返すことができます。タスクの実行を開始するために、私がちょうど言及した問題を経験する必要はありません。

練習中のシミュレーションオブジェクト

モックオブジェクトが何であるかがわかったので、いくつかの実用的な例を見てみましょう。 Facebookの投稿にいいね!やコメントを数えるなど、前述のシンプルな機能を実装します。次の単体テストから始めて、オブジェクトがどのように呼び出されるか、そして返品値がどうなるかについての期待を定義します。

このテストを実行すると、結果が失敗します。これはまだ何も実装していないために予想されます!それでは、サービスの実装を書きましょう。もちろん、最初のステップはFacebookからデータを取得することです。
<code class="language-php"><?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}</code>

Facebookオブジェクトが空であるため、このテストも失敗します。 FacebookアプリケーションIDなどを使用して実際のインスタンスを作成して実際の実装を挿入できますが、何のために?私たちは皆、そうすることで、目の前のタスクの痛みから逸脱することを知っています。モックオブジェクトを注入することでこれを回避できます!モックオブジェクトを使用する方法(少なくとも私たちの場合)は、get()メソッドを使用してクラスを作成し、モック値を返すことです。これは、実際のオブジェクトがock笑されているだけであるときに、実際のオブジェクトの実装を呼び出すことをクライアントにだましてだましてください。

<code class="language-php"><?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}</code>

モッククラスができたので、インスタンスをインスタンスにして、それを使用できるようにStatusserviceに注入しましょう。ただし、最初に、セッターを使用して、Facebookライブラリで使用するStatusserviceを更新します。

<code class="language-php"><?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}</code>
今すぐモックFacebookライブラリを挿入:

<code class="language-php"><?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}</code>

テストは依然として失敗しますが、少なくとも非オブジェクトでメソッドを呼び出すことに関するエラーを受け取ることはありません。さらに重要なことは、この依存関係を満たす必要性を解決したことです。これで、割り当てられているタスクのビジネスロジックの作成を開始し、テストに合格することができます。

<code class="language-php"><?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}</code>

さらに一歩進んでください:シミュレーションフレームワークを使用

最初に開始するときに手作りのモックオブジェクトを使用できますが、自分自身を発見したように、ニーズがより複雑になるにつれて、実際のモックフレームワークを使用する必要があるかもしれません。この記事では、phpunitに付属の模擬フレームワークの使用方法を示します。私の経験では、手動で書かれたモックオブジェクトを使用することと比較して、模擬フレームワークを使用することにはいくつかの利点があります。

    あなたは怠け者になることができます。これは、多くの抽象的なメソッドを使用して抽象クラスを扱うときに特に当てはまります。抽象クラスまたはインターフェイスの方法をいくつかシミュレートできます。これを手動で行う場合、これらすべてのメソッドを手動で実装する必要があります。また、タイプのプロンプトを事前にパッケージ化します。
  • クリーナーコードを書くことができます。ここでは読みやすさが重要です。フレームワークベースのシミュレーションにより、シミュレーションがテストで記述されているため、テストが理解しやすくなります。他の場所に記載されているセルフライターシミュレーションを表示するために、ファイルを下にスクロールしたり切り替えたりする必要はありません。モックオブジェクトを複数回呼び出して結果が異なる場合はどうなりますか?フレームワークベースのシミュレーションを使用して、これを行うために必要なIF-ELSEボイラープレートコードはすでによくカプセル化されています。したがって、理解しやすいです。
  • phpunitを使用したシミュレーションフレームワーク

シミュレーションフレームワーク Phpunitを使用してシミュレーションフレームワークに焦点を当てましょう。ステップは実際には非常に直感的であり、それを把握すると、第二の性質になります。このセクションでは、Phpunitのシミュレーションフレームワークを使用して、例の場合の模擬オブジェクトを作成します。ただし、これを行う前に、手作りのモックオブジェクトを使用するテストでコードラインをコメントまたは削除します。通過できるように、最初に失敗する必要があります。その後、新しいシミュレーションの実装を挿入します。

phpunitを実行しているときにテストが失敗することを確認します。次に、オブジェクトを手動でシミュレートする方法と呼び出したい方法について考えてください。私たちは何をしましたか?

<code class="language-php"><?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}</code>

最初のステップは、シミュレートするオブジェクトを識別することです。上記の分析の例関数では、Facebookライブラリをシミュレートしました。私たちは最初のステップと同じことをしています。
  1. classをモックするクラスを定義したので、クラス内のメソッドを模倣するメソッドを知る必要があり、メソッドが存在する場合は、パラメーターと戻り値を指定します。ほとんどの場合に使用する基本的なテンプレートは、おおよそ次のとおりです。
  2. メソッドが呼び出される回数(必須)を指定します。

    メソッド名(必須)を指定します。
    1. メソッドが期待するパラメーター(オプション)を指定します。
    2. return値(オプション)を指定します
    3. サンプルテストに今述べた手順を適用しましょう。
    <code class="language-php"><?php
    class StatusServiceTest extends PHPUnit_Framework_TestCase
    {
        private $statusService;
        private $fbID = 1;
    
        public function setUp() {
            $this->statusService = new StatusService();
        }
    
        public function testGetAnalytics() {
            $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));
    
            $this->assertEquals(array(
                "2012-01-01" => array(
                    "comments" => 5,
                    "likes"    => 3,
                ),
                "2012-01-02" => array(
                    "comments" => 5,
                    "likes"    => 3,
                ),
                "2012-01-03" => array(
                    "comments" => 5,
                    "likes"    => 3,
                ),
                "2012-01-04" => array(
                    "comments" => 5,
                    "likes"    => 3,
                ),
                "2012-01-05" => array(
                    "comments" => 5,
                    "likes"    => 3,
                )
            ), $analytics);
        }
    
    }</code>

    モックFacebookオブジェクトをもう一度作成したら、再びサービスに注入してください:

    <code class="language-php"><?php
    class StatuService
    {
        private $facebook;
    
        public function getAnalytics($id, $from, $to) {
            $post = $this->facebook->get($id);
        }
    }</code>

    さて、もう一度テストに合格する必要があります。おめでとう!モックオブジェクトでテストを開始しました!うまくいけば、より効果的にプログラムできることを願っています。最も重要なことは、将来の依存関係で遭遇する障害を取り除くことができることを願っています。

    Fotoliaの写真

    (モックオブジェクトテストに関するFAQセクションをここに追加する必要があります。コンテンツは入力テキストのFAQパーツと一致していますが、複製を避けるために少し書き直して研磨する必要があります) >

以上がPHPマスター|モックオブジェクトテストの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。