Suche…
Einführung
Das Schreiben von überprüfbarem Code ist ein wichtiger Bestandteil des Aufbaus eines robusten, wartbaren und agilen Projekts. Die Unterstützung des am weitesten verbreiteten Testframeworks von PHP, PHPUnit , ist direkt in Laravel integriert. PHPUnit wird mit der Datei phpunit.xml
konfiguriert, die sich im Stammverzeichnis jeder neuen Laravel-Anwendung befindet.
Das tests
, auch im Stammverzeichnis, enthält die einzelnen Testdateien, die die Logik zum Testen jedes Teils Ihrer Anwendung enthalten. Natürlich liegt es in Ihrer Verantwortung als Entwickler, diese Tests zu schreiben, während Sie Ihre Anwendung erstellen. Laravel enthält jedoch eine Beispieldatei ( ExampleTest.php
, die Sie zum Laufen ExampleTest.php
.
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$this->visit('/')
->see('Laravel 5');
}
}
In der testBasicExample()
-Methode besuchen wir die testBasicExample()
der Site und stellen sicher, dass der Text Laravel 5
irgendwo auf dieser Seite testBasicExample()
. Wenn der Text nicht vorhanden ist, schlägt der Test fehl und generiert einen Fehler.
Testen Sie ohne Middleware und mit einer frischen Datenbank
use DatabaseMigrations
um die Aktualisierung einer neuen Datenbank durch Handwerker vor dem Ausführen von Tests zu ermöglichen. Wenn Sie Middleware wie Auth vermeiden möchten, use WithoutMiddleware
.
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends TestCase
{
use DatabaseMigrations, WithoutMiddleware;
/**
* A basic functional test example.
*
* @return void
*/
public function testExampleIndex()
{
$this->visit('/protected-page')
->see('All good');
}
}
Datenbanktransaktionen für mehrere Datenbankverbindungen
DatabaseTransactions
Eigenschaft DatabaseTransactions
können Datenbanken die Änderungen während der Tests rückgängig machen. Wenn Sie mehrere Datenbanken zurücksetzen möchten, müssen Sie $connectionsToTransact
Eigenschaften von $connectionsToTransact
festlegen
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
$connectionsToTransact =["mysql","sqlite"] //tell Laravel which database need to rollBack
public function testExampleIndex()
{
$this->visit('/action/parameter')
->see('items');
}
}
Testen der Einrichtung unter Verwendung der Speicherdatenbank
Das folgende Setup stellt sicher, dass das Testframework (PHPUnit) verwendet :memory:
Datenbank.
config / database.php
'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
.
.
.
./phpunit.xml
.
.
.
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_URL" value="http://example.dev"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite_testing"/>
</php>
</phpunit>
Aufbau
Die Datei phpunit.xml ist die Standardkonfigurationsdatei für Tests und ist bereits zum Testen mit PHPUnit eingerichtet.
Die Standardtestumgebung APP_ENV
ist als testing
definiert testing
wobei das array
der CACHE_DRIVER
. Bei diesem Setup werden beim Testen keine Daten (Sitzung / Cache) gespeichert.
Um Tests in einer bestimmten Umgebung wie dem Homestead durchzuführen, können die Standardeinstellungen wie folgt geändert werden:
<env name="DB_HOST" value="192.168.10.10"/>
<env name="DB_DATABASE" value="homestead"/>
<env name="DB_USERNAME" value="homestead"/>
<env name="DB_PASSWORD" value="secret"/>
Oder verwenden Sie eine temporäre Datenbank in Arbeitsspeicher :
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
Eine letzte Bemerkung aus der Laravel-Dokumentation :
Löschen Sie Ihren Konfigurationscache unbedingt mit dem Befehl
config:clear
Artisan, bevor Sie die Tests ausführen!