Blog

Wie lassen sich Tests für Google Assistant Apps automatisieren?

Ruben Oostinga

Aktualisiert Oktober 21, 2025
4 Minuten

Der beste Weg, Regressionen zu vermeiden und schnelles Feedback während der Entwicklung zu erhalten, sind automatisierte Tests. Vor allem, wenn Sie manuell testen, indem Sie mit Ihrer Sprachapplikation sprechen. Die Logik Ihrer Sprachapplikation ist in einem Webhook namens Fulfillment implementiert. Da es sich bei Fulfillments um reguläre JSON-APIs handelt, werden sie mit der vorhandenen Technologie getestet.

Mikrofon

Die JSON-Anfrage und -Antwort von Fulfillments sind sehr ausführlich. Das könnte das Schreiben und die Pflege Ihrer Tests erschweren. Um dies zu vermeiden, können Sie Hilfsfunktionen erstellen. Das Ziel ist es, den Testcode leicht verständlich zu machen. In diesem Blogpost werden wir automatisierte Tests für eine Google Assistant-App demonstrieren, die mit Dialogflow erstellt wurde. Wir verwenden Typescript, um die Logik zu implementieren, und Jest als Testrunner. Die Ideen in diesem Blogpost sind auch auf Voice-Apps anwendbar, die nicht mit Dialogflow oder Typescript erstellt wurden. Wenn Sie eine Google Assistant App ohne Dialogflow erstellen, können Sie das Actions SDK verwenden. Allerdings müssten Sie das Verständnis der natürlichen Sprache selbst implementieren. Mit Dialogflow sieht eine einfache Interaktion, bei der wir nicht erwarten, dass der Benutzer irgendwelche Parameter angibt, wie folgt aus:

importieren { dialogflow } von "actions-on-google";
const app = dialogflow();
app.intent('Wie geht es Ihnen intent', (conv) =>  {
  conv.add(I'm fine);
});

Wenn ein Benutzer eine Phrase spricht, die mit der Absicht "Wie geht es Ihnen?" in Dialogflow verknüpft ist, antwortet unser Fulfillment mit "Mir geht es gut". Wir möchten dieses Verhalten in unserem Unit-Test eindeutig festlegen. Zu diesem Zweck erstellen wir einige Hilfsfunktionen: getResponseForIntentName und expectResponse. So können wir einen einfach zu lesenden Unit-Test erstellen:

describe('Wie sind Ihre Absichten', () =>  {
  it('sollte antworten', async () =>  {
  const response = await getResponseForIntentName('How are you intent');
  expectResponse("Mir geht's gut", response);
  });
});

Um diese Hilfsprogramme zu erstellen, müssen wir wissen, wie eine Dialogflow-Erfüllungsanfrage aussieht. Wir können eine Beispielanfrage erhalten, indem wir uns die Diagnoseinformationen in Dialogflow ansehen. Eine andere Möglichkeit ist, die Anfrage zu protokollieren: console.log(conv.body);. [caption id="attachment_27130" align="aligncenter" width="480" class="center "]Dialogflow Diagnostische Informationen Die Dialogflow-Diagnoseinfo zeigt die Anfrage, die an Ihr Fulfillment gesendet wird.[/caption] Eine minimale Anfrage, die von der actions-on-google Bibliothek verarbeitet werden kann, sieht so aus:

{
  queryResult: {
  Absicht: {
  displayName: 'Wie sind Ihre Absichten',
  },
  },
}

Nur der displayName des Intents ist erforderlich, damit die Erfüllung ihre Logik verarbeiten kann. Wir werden solche Anfragen in der getResponseForIntentName-Hilfe erstellen. Um den Express-Server zu starten und die Anfrage zu stellen, verwenden wir supertest. Da wir Typescript verwenden, erhalten wir Fehler, wenn wir Tippfehler machen und die automatische Vervollständigung während der Eingabe erhalten. Die Typdefinitionen der Anfrage- und Antwort-Payloads sind in der actions-on-google Bibliothek definiert. Siehe GoogleCloudDialogflowV2WebhookRequest im Beispiel unten.

function getResponseForIntentName(name: string) {
  const request: GoogleCloudDialogflowV2WebhookRequest = {
  queryResult: {
  Absicht: {
  displayName: Name,
  },
  },
  };
  return supertest(createApp())
  .post('/')
  .send(request);
}

Jetzt wollen wir sicherstellen, dass die Antwort in Ordnung ist. Da wir nur an dem zurückgegebenen Text interessiert sind, verwenden wir Jests toMatchObject, um eine Behauptung über Teile der Antwort aufzustellen. Damit dies in Typescript funktioniert, können wir den Typ Partial<. ..> verwenden.

function expectResponse(responseText: string, actual: Response) {
  const conversationResponse: Partial = {
  richResponse: {
  Elemente: [{ simpleResponse: { textToSpeech: responseText } }],
  },
  };
  const webhookResponse: GoogleCloudDialogflowV2WebhookResponse = {
  Nutzlast: {
  google: conversationResponse,
  },
  };
  expect(actual.status).toBe(200);
  expect(actual.body).toMatchObject(webhookResponse);
}

Die Testhilfen können erweitert werden, um fortgeschrittenere Anwendungsfälle zu unterstützen. Dialogflow kann Parameter aus der Spracheingabe analysieren und sie zum Bestandteil der Anfrage machen. Um dies testbar zu machen, können Sie die getResponseForIntentName-Hilfe erweitern. Eine Antwort kann auch einen gewissen Zustand über Interaktionen hinweg speichern, dies wird als Kontext bezeichnet. Um den Kontext zu testen, können Sie die Hilfsfunktion expectResponse erweitern. Beispiele für fortgeschrittene Anwendungsfälle finden Sie hier. Welche Art von Tests das ist, hängt davon ab, wen Sie fragen. Sie könnten es als Unit-Testing bezeichnen, weil Sie schnelles Feedback erhalten und alle Verzweigungen in der Logik testen können. Andererseits isolieren Sie mit Mocks keine einzelne Einheit und wir starten den gesamten Server. Daher könnte man es auch Integrationstests oder Komponententests nennen. In Wirklichkeit spielt es keine große Rolle, solange es einen Nutzen bringt.

Fazit

Obwohl die Entwicklung von Sprachanwendungen eine neue Art der Entwicklung ist, müssen Sie nicht anfangen, mit Ihrem Computer zu sprechen, um Ihre Logik zu testen. Automatisierte Tests machen den Entwicklungsprozess skalierbar. Das bedeutet die Entwicklung einer großen App oder die Entwicklung mit vielen Mitarbeitern. Sofortiges Feedback spart Ihnen und Ihrem Team Zeit, so dass Sie mehr coole neue Funktionen entwickeln können! Ein lauffähiges Beispiel für die Tests in diesem Blogpost finden Sie hier.

Verfasst von

Ruben Oostinga

Contact

Let’s discuss how we can support your journey.