Heim >Backend-Entwicklung >PHP-Tutorial >Schneller Tipp: Testen von Symfony -Apps mit einer verfügbaren Datenbank

Schneller Tipp: Testen von Symfony -Apps mit einer verfügbaren Datenbank

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-14 10:22:11703Durchsuche

Quick Tip: Testing Symfony Apps with a Disposable Database

Schlüsselpunkte

  • In-Memory-Datenbank existiert nur im Anwendungsspeicher und ist eine praktische Lösung für den Testcode, der mit der Datenbank interagiert. Sie sind einfach mit Symfony -Anwendungen mithilfe von Doktrin einzurichten und sind aufgrund ihrer Entwöhnbarkeit ideal für Tests.
  • Die Testumgebungskonfiguration von
  • Symfony ermöglicht die Erstellung von entschlossenen Testdatenbanken. Die Konfigurationsdatei, die zum Festlegen dieser Datenbanken bearbeitet werden muss, lautet app/config/config_test.php. Unterstützung für In-Memory-Datenbanken mit SQLite3 kann das Testen erleichtern, indem SQL-Abfragen an funktionale Datenbanken gesendet werden, wodurch die Notwendigkeit der Verspottung der Repository-Klassen beseitigt wird.
  • Bei Verwendung einer In-Memory-Datenbank in einer Testklasse muss zuerst das Schema erstellt werden, was bedeutet, dass die Tabellen der Entität und alle erforderlichen Vorrichtungen für die Testsuite geladen werden müssen. Der Datenbank -Bootloader kann verwendet werden, um den größten Teil der Arbeiten zu erledigen, ähnlich wie die Ausführung des Befehls zur Konsolen -Konsole des Doktrin -Modus.

Testcode, der mit einer Datenbank interagiert, kann sehr schmerzhaft sein. Einige Entwickler verspotteten Datenbankabstraktionen, daher gibt es keine tatsächliche Abfrage zu testen. Andere Entwickler erstellen Testdatenbanken für Entwicklungsumgebungen. Dies kann jedoch auch in Bezug auf die kontinuierliche Integration und die Aufrechterhaltung des Zustands dieser Datenbank schmerzhaft sein. Quick Tip: Testing Symfony Apps with a Disposable Database In-Memory-Datenbank ist eine Alternative zu diesen Optionen. Da sie nur im Speicher der Anwendung vorhanden sind, sind sie wirklich einmalig und sehr geeignet zum Testen. Zum Glück sind diese sehr einfach mit Symfony -Anwendungen eingerichtet, die Doctrine verwenden. Lesen Sie unsere Anleitung zum Funktionstest mit Symfony, um das End-to-End-Verhalten von Testanwendungen zu verstehen.

Symfony -Umgebungskonfiguration

Eine der mächtigsten Merkmale des Symfony -Frameworks ist die Fähigkeit, verschiedene Umgebungen mit ihren eigenen einzigartigen Konfigurationen zu erstellen. Symfony-Entwickler können diese Funktion ignorieren, insbesondere die weniger bekannten Aspekte der hier untersuchten Testumgebungen. Die Anleitung von Symfony zum Mastering und Erstellen neuer Umgebungen erläutert, wie Frameworks Konfigurationen verschiedener Umgebungen umgehen und einige nützliche Beispiele anzeigen. Die Konfigurationsdatei, die bearbeitet werden muss, um die entschärgerbare Testdatenbank festzulegen, lautet app/config/config_test.php. Wenn der Kernel auf eine Anwendung in einer Testsuite zugreift, wird der Kernel mit der Testumgebung geladen und diese Konfigurationsdatei wird verarbeitet.

In-Memory-Datenbank mit Doctrine

SQLite3 unterstützt In-Memory-Datenbanken und ist für Tests sehr geeignet. Mit diesen Datenbanken können Sie Ihre Anwendung testen, indem Sie tatsächlich SQL -Abfragen an die Funktionsdatenbank senden und so die mühelose Simulation von Repository -Klassen mit vordefiniertem Verhalten beseitigen. Die Datenbank wird zu Beginn des Tests neu sein und am Ende sauber zerstört. Um die Konfiguration der Standard -Doktrinverbindungskonfiguration zu überschreiben, müssen Sie der Testdatei der Testumgebung die folgende Zeile hinzufügen. Wenn in Ihrer Anwendung mehrere Doktrin -Verbindungen konfiguriert sind, müssen Sie sie möglicherweise ein wenig anpassen.

<code class="language-yaml"># app/config/config_test.yml

doctrine:
    dbal:
        driver:  pdo_sqlite
        memory:  true
        charset: UTF8</code>

Verwenden der Datenbank in Testklassen

Bei Verwendung dieser glänzenden neuen In-Memory-Datenbank in der Testklasse muss zuerst das Schema erstellt werden. Dies bedeutet, eine Tabelle mit Entitäten zu erstellen und alle für die Testsuite erforderlichen Vorrichtungen zu laden. Die folgende Klasse kann als Datenbank -Bootstrap verwendet werden, was den größten Teil der Arbeit erledigt. Es hat den gleichen Effekt wie das Ausführen des Befehls für die Aktualisierungskonsole des Doktrin -Modus.

<code class="language-php"><?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,您可以在此处加载它们
    }
}</code>

Wenn Sie einen Entitätsmanager benötigen, um die Klasse zu testen, müssen Sie den Bootloader anwenden:

<code class="language-php"><?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');

        // ...
    }
}</code>

Im obigen Beispiel wird der Container verwendet, um den Dienst zu testen. Wenn dieser Dienst vom Entity -Manager abhängt, wird er mit demselben Entitätsmanager erstellt, der in der setUp -Methode gestartet wurde. Wenn mehr Kontrolle benötigt wird, z. B. eine andere Abhängigkeit, können Sie den Entitätsmanager jederzeit aus dem Container abrufen und für die manuelle Instanziierung der Klasse verwenden, die getestet werden muss. Die Verwendung von Doktrin -Vorrichtungen zur Fülle einer Datenbank mit Testdaten kann ebenfalls eine gute Idee sein, hängt jedoch von Ihrem Anwendungsfall ab.

(Der verbleibende FAQ -Teil sollte hier übersetzt werden, um es mit der ursprünglichen Textstruktur übereinzuhalten)

Das obige ist der detaillierte Inhalt vonSchneller Tipp: Testen von Symfony -Apps mit einer verfügbaren Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn