sql >> データベース >  >> RDS >> PostgreSQL

PHPUnit:リモートPostgresサーバーでデータベースの相互作用をテストする方法は?

    簡単な答えは、PHPUnitマニュアルでデータベーステストに関するファインマニュアルのエントリを読むことです。

    そして今、長い答え...

    ユニットテストについて最初に覚えておくべきことは、分離で実行する必要があるということです。 他のすべてのコンポーネントから。多くの場合、この目標は、依存性注入 などの制御の反転(IoC)手法を使用して簡略化されます。 。クラスがコンストラクターメソッドで依存関係を明示的に要求する場合、モック これらの依存関係により、残りのコードを個別にテストできます。

    ただし、モデルと相互作用するコードのテストは少し異なります。通常、モデルにアクセスする必要があるクラスにモデルを注入することは実用的ではなく、お勧めできません。モデルは通常、機能が制限されているか、まったく公開されていない「ダム」データ構造です。結果として、他の方法で注入されたクラス内でモデルをその場でインスタンス化することは、(テスト容易性の観点から)一般的に受け入れられます。残念ながら、これによりデータベースコードのテストが困難になります。これは、PHPUnitのドキュメントに次のように記載されているためです。

    では、モデルが直接注入されていない場合、データベースと相互作用するコードをどのように分離してテストするのでしょうか。これを行う最も簡単な方法は、テストフィクスチャ を利用することです。 。

    あなたは間違いなくすでにPDOを使用しているので またはPDOに基づいて構築されたORMライブラリ (右?)、フィクスチャの設定は、基本的なSQLiteデータベースまたはXMLファイルにテストケースに対応するデータをシードし、データベースと対話するコードをテストするときにその特別なデータベース接続を使用するのと同じくらい簡単です。この接続はPHPUnitブートストラップファイルで指定できますが、PHPUnitデータベースのテストケース

    DBコードをテストするための一般的に受け入れられているベストプラクティスの手順(これらは、DBテストに関するPHPUnitのドキュメントにも反映されています):

    1. フィクスチャを設定する
    2. テスト対象のエクササイズシステム
    3. 結果を確認する
    4. 分解

    したがって、要約すると、「ダミー」のデータベースフィクスチャを作成し、本番環境で使用する実際のデータベースではなく、コードをその既知のデータと相互作用させるだけです。この方法では、既知のデータを処理するため、テスト対象のコードを正常に分離できます。つまり、データベース操作の結果について特定の/テスト可能なアサーションを作成できます。

    更新

    ではないことについて非常に役立つガイドであるという理由だけで テスト容易性を促進したい場合は、コードで行うために、MiskoHeveryの 3v1L、テスト不可能なコードの書き方 。特にデータベースのテストには関係していませんが、それでも役に立ちます。ハッピーテスト!

    アップデート2

    既存のコードベースはPDOを実装していないため、モデルテストの延期に関するコメントに返信したいと思いました。 データベースアクセスの場合:

    モデルは、PHPUnitのDbUnit拡張機能を実装するためにPDOを使用する必要はありません。

    PDOを使用すると、生活が少し楽になりますが、必須ではありません。たとえば、PHPの組み込みのpg_*を使用してアプリケーションを構築したとします。 PostgreSQLの機能。 PHPUnitでは引き続きフィクスチャを指定でき、テストごとにフィクスチャを再構築できます。テストを実行するときに、DbUnit拡張機能がフィクスチャに使用するのと同じリソースに接続を指定するだけで済みます。




    1. MySQL:プログラムで外部キーの関係を決定する方法は?

    2. Oracleにルート要素がないclobのxmlルート要素を作成します

    3. OracleでSQLインジェクションを行う方法

    4. リモートアクセス用のMysql追加ユーザー