ホームページ > バックエンド開発 > PHPチュートリアル > クイックヒント:使い捨てデータベースを使用したSymfonyアプリをテストします

クイックヒント:使い捨てデータベースを使用したSymfonyアプリをテストします

Jennifer Aniston
リリース: 2025-02-14 10:22:11
オリジナル
697 人が閲覧しました

Quick Tip: Testing Symfony Apps with a Disposable Database

キーポイント

  • メモリ内データベースは、アプリケーションメモリにのみ存在し、データベースと対話するコードをテストする実用的なソリューションです。これらは、Doctrineを使用してSymfonyアプリケーションで簡単にセットアップでき、廃棄物のためにテストに最適です。
  • Symfonyのテスト環境構成により、廃棄可能なテストデータベースを作成できます。これらのデータベースを設定するために編集する必要がある構成ファイルはapp/config/config_test.phpです。 SQLITE3を使用したメモリ内データベースのサポートは、SQLクエリを機能データベースに送信してテストを容易にし、リポジトリクラスをock笑する必要性を排除できます。
  • テストクラスでメモリ内データベースを使用する場合、スキーマを最初に構築する必要があります。つまり、エンティティのテーブルと必要な備品をテストスイートにロードする必要があります。データベースブートローダーは、Doctrine Mode Update Consoleコマンドを実行するのと同様に、ほとんどの作業を実行するために使用できます。
データベースと対話するコードのテストは非常に痛い場合があります。一部の開発者はデータベースの抽象化をmockしているため、実際にテストするクエリはありません。他の開発者は、開発環境のテストデータベースを作成しますが、これは継続的な統合とこのデータベースの状態を維持するという点でも苦痛になる可能性があります。

メモリ内データベースは、これらのオプションに代わるものです。それらはアプリケーションのメモリにのみ存在するため、それらは本当に1回限りで、テストに非常に適しています。ありがたいことに、これらは教義を使用するSymfonyアプリケーションで非常に簡単にセットアップできます。 Symfonyによる機能テストに関するガイドを読んで、テストアプリケーションのエンドツーエンドの動作を理解してください。 Quick Tip: Testing Symfony Apps with a Disposable Database

Symfony Environment Configuration

Symfonyフレームワークの最も強力な機能の1つは、独自の構成を備えた異なる環境を作成する機能です。 Symfony開発者は、この機能、特にここで研究されているテスト環境のあまり知られていない側面を無視する場合があります。新しい環境の習得と作成に関するSymfonyのガイドでは、フレームワークがさまざまな環境の構成を処理する方法を説明し、いくつかの有用な例を示しています。破棄可能なテストデータベースを設定するために編集する必要がある構成ファイルは

です。テストスイートでアプリケーションにアクセスすると、カーネルはテスト環境を使用してロードされ、この構成ファイルが処理されます。 app/config/config_test.php

ドクトリンを使用したメモリ内データベースSQLite3はメモリ内データベースをサポートしており、テストに非常に適しています。これらのデータベースを使用すると、実際にSQLクエリを機能データベースに送信してアプリケーションをテストでき、事前定義された動作を伴うリポジトリクラスの簡単なシミュレーションを排除できます。データベースはテストの開始時に新しくなり、最後にきれいに破壊されます。デフォルトのドクトリン接続構成をオーバーライドするには、テスト環境構成ファイルに次の行を追加する必要があります。アプリケーションで複数のドクトリン接続が構成されている場合は、一致するように少し調整する必要がある場合があります。

# app/config/config_test.yml

doctrine:
    dbal:
        driver:  pdo_sqlite
        memory:  true
        charset: UTF8
ログイン後にコピー

テストクラスでデータベースを使用しています

テストクラスでこの光沢のある新しいインメモリデータベースを使用する場合、最初にスキーマを構築する必要があります。これは、エンティティのテーブルを作成し、テストスイートに必要な備品をロードすることを意味します。次のクラスは、ほとんどの作業を行うデータベースブートストラップとして使用できます。 Doctrine Mode Update Consoleコマンドを実行することと同じ効果があります。

<?php
namespace Tests\AppBundle;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Component\HttpKernel\KernelInterface;

class DatabasePrimer
{
    public static function prime(KernelInterface $kernel)
    {
        // 确保我们处于测试环境中
        if ('test' !== $kernel->getEnvironment()) {
            throw new \LogicException('Primer must be executed in the test environment');
        }

        // 从服务容器获取实体管理器
        $entityManager = $kernel->getContainer()->get('doctrine.orm.entity_manager');

        // 使用我们的实体元数据运行模式更新工具
        $metadatas = $entityManager->getMetadataFactory()->getAllMetadata();
        $schemaTool = new SchemaTool($entityManager);
        $schemaTool->updateSchema($metadatas);

        // 如果您使用的是 Doctrine Fixtures Bundle,您可以在此处加载它们
    }
}
ログイン後にコピー

クラスをテストするためにエンティティマネージャーが必要な場合は、ブートローダーを適用する必要があります。

<?php
namespace Tests\AppBundle;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Tests\AppBundle\DatabasePrimer;

class FooTest extends KernelTestCase
{
    public function setUp()
    {
        self::bootKernel();

        DatabasePrimer::prime(self::$kernel);
    }

    public function testFoo()
    {
        $fooService = self::$kernel->getContainer()->get('app.foo_service');

        // ...
    }
}
ログイン後にコピー
上記の例では、コンテナを使用して、テスト対象のサービスを取得します。このサービスがエンティティマネージャーに依存している場合、

メソッドで起動された同じエンティティマネージャーを使用して構築されます。別の依存関係をock笑するなど、より多くの制御が必要な場合は、常にコンテナからエンティティマネージャーを取得し、テストする必要があるクラスの手動インスタンス化に使用できます。 Doctrine Fixturesバンドルを使用してデータベースにテストデータを入力することも良い考えかもしれませんが、ユースケースに依存します。 setUp

(残りのFAQパーツは、元のテキスト構造と一致するようにここに翻訳する必要があります)

以上がクイックヒント:使い捨てデータベースを使用したSymfonyアプリをテストしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート