GraphQL-Queries testen: Tools und automatisierte Tests
GraphQL-Queries testen: Tools und automatisierte Tests
~8 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Kapitel 3 hat GraphQL-Clients für manuelle Tests eingeführt - für ein Projekt wie die Veranstaltungen-API, das über 16 Kapitel gewachsen ist, reicht rein manuelles Testen aber nicht mehr aus. Dieses Kapitel zeigt, wie sich Queries und Mutations systematisch und automatisiert absichern lassen.
Manuelle Tools im täglichen Workflow
Für die tägliche Entwicklung bleiben GraphQL-Clients wie Altair oder Insomnia die schnellste Feedback-Schleife - beide unterstützen gespeicherte "Environments" mit Variablen für Token und Basis-URL, sodass sich Anfragen gegen die lokale Entwicklungsumgebung nicht bei jedem Test neu zusammenbauen lassen müssen. Magento selbst liefert keine im Adminbereich integrierte GraphiQL-Oberfläche mit aus - externe Tools bleiben der Standardweg.
Automatisierte Tests mit GraphQlAbstract
Magentos eigene Test-Suite für GraphQL liegt unter dev/tests/api-functional/testsuite/Magento/GraphQl/ und basiert auf der Basisklasse \Magento\TestFramework\TestCase\GraphQlAbstract. Ein eigenes Modul kann exakt demselben Muster folgen:
<?php
declare(strict_types=1);
namespace Mironsoft\Event;
use Magento\TestFramework\TestCase\GraphQlAbstract;
/**
* Integration-level tests for the events GraphQL query.
*/
class EventsQueryTest extends GraphQlAbstract
{
/**
* Verifies that the events query returns items and pagination info.
*
* @magentoApiDataFixture Mironsoft_Event::Test/_files/events.php
* @return void
*/
public function testReturnsActiveEventsWithPagination(): void
{
$query = <<<QUERY
{
events(pageSize: 2) {
items {
identifier
title
}
total_count
page_info {
current_page
}
}
}
QUERY;
$response = $this->graphQlQuery($query);
self::assertArrayHasKey('items', $response['events']);
self::assertCount(2, $response['events']['items']);
self::assertSame(1, $response['events']['page_info']['current_page']);
}
}graphQlQuery() übernimmt HTTP-Aufbau, JSON-Encoding/-Decoding und wirft bei einem GraphQL-Fehler automatisch eine PHP-Exception - ein Test muss sich also nicht selbst um das rohe HTTP-Handling kümmern, sondern arbeitet direkt mit dem dekodierten data-Array.
Geschützte Mutations testen: Token in Headern
/**
* Verifies that addEventToFavorites requires a customer token.
*
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Mironsoft_Event::Test/_files/events.php
* @return void
*/
public function testRejectsFavoritingAsGuest(): void
{
$mutation = 'mutation { addEventToFavorites(input: { event_id: 1 }) { event { title } } }';
$this->expectExceptionMessage('You must be logged in as a customer to favorite an event.');
$this->graphQlMutation($mutation);
}
/**
* Verifies that addEventToFavorites succeeds with a valid customer token.
*
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Mironsoft_Event::Test/_files/events.php
* @return void
*/
public function testAcceptsFavoritingAsLoggedInCustomer(): void
{
$mutation = 'mutation { addEventToFavorites(input: { event_id: 1 }) { event { is_favorite } } }';
$headers = ['Authorization' => 'Bearer ' . $this->customerTokenFixture()];
$response = $this->graphQlMutation($mutation, [], '', $headers);
self::assertTrue($response['addEventToFavorites']['event']['is_favorite']);
}Dieses Testpaar deckt exakt das ab, was Kapitel 18 gebaut hat: den abgelehnten Gast-Aufruf und den erfolgreichen, authentifizierten Aufruf - beides in genau der Form, wie ein Client die Mutation tatsächlich verwenden würde.
Wo diese Tests im Projekt laufen
dev/tests/api-functional ist eine eigenständige PHPUnit-Suite mit eigener phpunit.xml.dist, getrennt von den in bin/analyse genutzten Unit-Tests - sie läuft gegen eine echte, vollständig installierte Magento-Instanz (inklusive Datenbank), nicht gegen gemockte Objekte. Im Mark-Shust-Setup dieses Projekts erfolgt der Aufruf über bin/cli innerhalb des App-Containers, in dem die Testsuite bereits konfiguriert ist.
bin/cli vendor/bin/phpunit -c dev/tests/api-functional/phpunit.xml.dist \
dev/tests/api-functional/testsuite/Mironsoft/Event/EventsQueryTest.phpTipp: @magentoApiDataFixture-Klassen (hier fiktiv Mironsoft_Event::Test/_files/events.php) legen vor jedem Test definierte Testdaten an und räumen sie danach automatisch wieder auf - so bleibt jeder Testlauf unabhängig vom aktuellen Datenbankinhalt der Entwicklungsumgebung reproduzierbar.
Mit manuellen Tools für die schnelle Iteration und GraphQlAbstract-Tests für dauerhafte Absicherung geht es in Kapitel 25 um den Umkehrfall: was tun, wenn etwas nicht wie erwartet funktioniert.