Dieser Artikel stellt hauptsächlich eine andere Methode zur Durchführung von Laravel-Datenbanktests vor (SQLite). Jetzt kann ich ihn mit Ihnen teilen
Wenn es ums Testen geht, bietet die Laravel
integrierte 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
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
.
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'); } }
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' => '', ],
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>
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.php
Methode setUp
public function setUp() { parent::setUp(); // 执行数据库迁移 $this->artisan('migrate'); }
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.
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.ini
memory_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>
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!