PHPunit
Für die Ausführung von PHPunit Tests sind nur wenige Dateien wirklich notwendig.
Der Start ist immer die Konfiguration des Testing Frameworks:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="TestBootstrap.php">
<php>
<ini name="error_reporting" value="-1"/>
<ini name="display_errors" value="true"/>
<server name="KERNEL_CLASS" value="Shopware\Core\Kernel"/>
<env name="APP_ENV" value="test"/>
<env name="APP_DEBUG" value="1"/>
<server name="APP_URL" value="http://localhost"/>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="weak"/>
</php>
<logging>
<junit outputFile="reports/junit.xml"/>
<teamcity outputFile="reports/teamcity.txt"/>
<testdoxHtml outputFile="reports/testdox.html"/>
<testdoxText outputFile="reports/testdox.txt"/>
</logging>
<testsuites>
<testsuite name="Your Plugin Name Integrations">
<directory suffix=".php">src/Test</directory>
</testsuite>
</testsuites>
<coverage includeUncoveredFiles="true" pathCoverage="false" ignoreDeprecatedCodeUnits="true">
<report>
<clover outputFile="coverage/clover.xml"/>
<cobertura outputFile="coverage/cobertura.xml"/>
<crap4j outputFile="coverage/crap4j.xml" threshold="50"/>
<html outputDirectory="coverage/html-coverage" lowUpperBound="50" highLowerBound="90"/>
<php outputFile="coverage/coverage.php"/>
<text outputFile="coverage/coverage.txt" showUncoveredFiles="false" showOnlySummary="true"/>
<xml outputDirectory="coverage/xml-coverage"/>
</report>
</coverage>
<source>
<include>
<directory suffix=".php">src</directory>
</include>
<exclude>
<directory suffix=".php">src/Test</directory>
<directory suffix=".php">src/Resources</directory>
</exclude>
</source>
</phpunit>
Für PHP-Unit Tests ist aber auch immer ein Bootstrapper notwendig, der dem Framework die Rahmenbedingungen des Tests mitteilt. In unserem Falle haben wir den Vorteil, dass Shopware dort schon die meiste Arbeit gemacht hat und wir deren Bootstrapper einfach verwenden können:
<?php declare(strict_types=1);
use Shopware\Core\TestBootstrapper;
$testBootstrapper = null;
if (is_readable('/opt/share/shopware/tests/TestBootstrapper.php')) {
$testBootstrapper = require '/opt/share/shopware/tests/TestBootstrapper.php';
} else {
$testBootstrapper = (new TestBootstrapper());
}
return $testBootstrapper
->setLoadEnvFile(true)
->setForceInstallPlugins(true)
->addActivePlugins('%pluginname%')
->bootstrap()
->getClassLoader();
Die PhpUnit tests werden über das von Shopware mitgelieferte Package "phpunit" getestet.
$SHOPWARE_ROOT/vendor/bin/phpunit -c custom/plugins/[YourPluginName]/phpunit.xml
Mit der oben genannten Konfiguration werden Coverage und Report Ordner erstellt. Diese dann am besten in die <plugin-root>/.gitignore Datei aufnehmen Um über den aktuellen Stand der Coverage im Bilde zu sein, kann die <plugin-root>/coverage/html-coverage/index.html Datei im Browser geöffnet werden und entsprechend nach durchgelaufenen Tests aktualisiert werden.
Verfassen eines Tests
Ein Unit-Test besteht immer aus den Teilen:
Der Setup und Tear-down Teil wird zum großen Teil von dem IntegrationTestBehaviour Trait übernommen.
Das Testing aber, kommt vom Entwickler. Der Test selbst sollte so kleinteilig wie möglich testen. Eine Funktion - ein Test
Im Nachfolgenden Code wird zum Beispiel geprüft, ob das Plugin erfolgreich installiert wurde. Bei Plugins mit Datenbanktabellen sollte hier also auch geprüft werden, ob die Tabellen existieren und Nutzbar sind.
namespace Leoparden\%pluginname%\Test;
use PHPUnit\Framework\TestCase;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\Plugin\PluginService;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Test;
use Shopware\Core\Framework\Test\TestCaseBase\IntegrationTestBehaviour;
use Leoparden\%pluginname%\%pluginname%;
#[CoversClass(%pluginname%::class)]
class %pluginname%Test extends TestCase
{
use IntegrationTestBehaviour;
public function getName(bool $withDataSet = true): string
{
return '%pluginname%Test';
}
#[Test]
public function IsInstalled(): void
{
$plugin = $this->getContainer()->get(PluginService::class)->getPluginByName('%pluginname%', Context::createDefaultContext());
$this->assertInstanceOf(\DateTimeInterface::class, $plugin->getInstalledAt());
}
Last modified: 29 February 2024