Eine andere Möglichkeit, Laravel-Datenbanktests durchzuführen (SQLite)

不言
Freigeben: 2023-04-03 07:16:01
Original
3028 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich eine andere Methode zur Durchführung von Laravel-Datenbanktests vor (SQLite). Jetzt kann ich ihn mit Ihnen teilen

Laravel-Datenbanktests

Wenn es ums Testen geht, bietet die Laravelintegrierte NutzungPHPUnit eine sehr praktische Lösung. Beim Testen des Hinzufügens, Löschens, Änderns und Abfragens einer Datenbank besteht ein sehr wichtiges Problem darin, wie das ursprüngliche Erscheinungsbild der Datenbank nach Abschluss des Tests wiederhergestellt werden kann. Zum Testen einer Benutzerregistrierungsmethode ist beispielsweise ein Benutzerdatensatz erforderlich in die Datenbank eingefügt werden soll, aber nach Abschluss des Tests möchten wir nicht, dass dieser Testfall in der Datenbank gespeichert wird. Um dieses Problem zu lösen, bietet Laravel eine sehr praktische Lösung:

  • Migration verwenden: DatabaseMigrations

  • Transaktion verwenden: DatabaseTransactions

Referenz: https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test

Außerdem Eine Lösung: Verwenden Sie die In-Memory-Datenbank von SQLite. Die beiden von :memory:

Laravel bereitgestellten Lösungen lesen und schreiben weiterhin Vorgänge in der Datenbank, die Sie manchmal nicht ausführen möchten (z. B Mehrere Personen teilen sich eine Online-Entwicklungsdatenbank. Zu diesem Zeitpunkt können Sie auch einen eleganteren Weg verwenden: SQLlite Die Logik ist eigentlich sehr einfach: Ersetzen Sie beim Ausführen des Testfalls die Datenbankverbindung durch SQLite.

Verwendungsbeispiel

Zum Beispiel haben wir die folgende Testklasse (dieses Beispiel ist nicht repräsentativ, dient nur zur Veranschaulichung des Problems und geht davon aus, dass die Maschine installiert wurdeSQLite) :

class HomePageTest extends TestCase {
    
    public function testHomePage() 
    {
        // 创建一个测试用户,并保存
        $user = factory(App\User::class)->create();
        $this->actingAs($user)->visit('/home')->see('Dashboard');
    }
}
Nach dem Login kopieren
  • Fügen Sie zunächst eine neue Datenbankverbindung in der Datenbankkonfigurationsdatei von Laravel hinzu, also im config/database.php-Array von connections

'sqlite' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],
Nach dem Login kopieren

Hier ist ein sehr wichtiger Parameter: 'database' => ':memory:'. Die :memory:-Datenbank ist eine in SQLite integrierte In-Memory-Datenbank Der Speicher wird nach Abschluss des Tests automatisch gelöscht und ist sehr schnell isoliert. Dies ist auch sehr praktisch Ein sehr wichtiger Grund, warum wir die Datenbank SQLite als Testbibliothek ausgewählt haben. Für eine ausführliche Erklärung klicken Sie hier.

  • Anschließend müssen Sie die Konfigurationsdatei von PHPUnit ändern. Ändern Sie in phpunit.xml die Datenbankverbindung in die gerade definierte SQLite-Verbindung

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    
    <!-- 将数据库连接改为刚刚定义的SQLite连接 -->
    <env name="DB_CONNECTION" value="sqlite" />
</php>
Nach dem Login kopieren

Dadurch wird die in .env definierte Datenbankverbindung DB_CONNECTION=mysql überschrieben und das Framework angewiesen, beim Ausführen des Tests die sqlite-Verbindung anstelle der mysql-Verbindung zu verwenden.

  • Schließlich müssen Sie vor der Ausführung des Testfalls eine Datenbankmigration durchführen und die TestCase.phpMethode setUp

public function setUp()
{
    parent::setUp();
    // 执行数据库迁移 
    $this->artisan('migrate');
}
Nach dem Login kopieren
in der Basisklasse der Testklasse hinzufügen , d. h.

Auf diese Weise werden vor der Ausführung jedes Testfalls alle Migrationen in die SQLite-Datenbank von :memory: durchgeführt, um die für die Geschäftslogik erforderlichen Datentabellen zu generieren.

Vor- und Nachteile der Lösung

  • Der Kernpunkt dieser Lösung ist die Verwendung einer integrierten In-Memory-DatenbankSQLite von :memory:, also Es ist schneller und verfügt über eine gute Isolation. Es hat keine Auswirkungen auf unsere Entwicklungsdatenbank.

  • Natürlich weist diese Lösung auch Mängel auf. Wenn die Projektdatenbank riesig ist und eine große Anzahl von Datentabellen oder Migrationsdateien enthält, verbraucht sie viel Speicher Test ausgeführt wird, ist möglicherweise nicht genügend Speicher vorhanden, was dazu führt, dass der Test unterbrochen wird. Zu diesem Zeitpunkt müssen Sie PHP den entsprechenden Speicher zuweisen und die Konfiguration in php.inimemory_limit = 128M

ändern. Das Obige ist der gesamte Inhalt dieses Artikels Hilfreich für das Lernen aller. Weitere Informationen finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

<a title="如何解决Laravel.log 文件写入的问题" href="http://www.php.cn/php-weizijiaocheng-406465.html" target="_blank">如何解决Laravel.log 文件写入的问题</a>

Laravel Development Environment Deployment Homestead Installations- und Konfigurationsprozess (Windows-System)

Laravels Routing (Router) detaillierte grafische Erklärung

Das obige ist der detaillierte Inhalt vonEine andere Möglichkeit, Laravel-Datenbanktests durchzuführen (SQLite). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!