3 Stimmen

Wie testet man Code, der auf der Kanal-API basiert (Google App Engine, Java)?

Ich habe Java-Servlets, die auf die Channel-API von Google App Engine angewiesen sind. Ich versuche, Unit-Tests für diesen Code zu schreiben, aber ich bin ziemlich ratlos, wie ich einen Stub-Client schreiben kann, um eine Antwortnachricht vom Servlet zu erhalten, anstatt mich immer auf eine tatsächliche Webseite als Test-Client verlassen zu müssen. Mein Servlet ist recht einfach:

ChannelService channelService = ChannelServiceFactory.getChannelService();
channelService.sendMessage(new ChannelMessage(someKey, "ECHO: " + someMsg));

Normalerweise lese ich dies in meinem Test-Client, der eine Webseite ist. Aber ich möchte Unit-Tests schreiben, die ich mit einem Framework wie jUnit oder TestNG testen kann. Nach der Lektüre von Googles Seite über Unit-Tests ihrer Java-Dienste habe ich Dinge ausprobiert wie die Verwendung eines LocalServiceTestHelper Objekt in meiner Testklasse und konfiguriere es mit einer LocalChannelServiceTestConfig Objekt. Das Ergebnis ist, dass meine Testklasse eine Instanz von LocalChannelService , eine Klasse, die dieselben Methoden zu implementieren scheint wie ChannelService .

Allerdings:

  • Keine der beiden Klassen hat eine solide Beziehung zueinander (sie implementieren keine ähnliche Schnittstelle, befinden sich nicht in der gleichen Klassenhierarchie...). Das macht es mir unmöglich, ein LocalChannelService-Objekt als Mock-Objekt in mein Servlet zu injizieren.
  • Es gibt keinerlei Dokumentation zur LocalChannelService API (Vielen Dank, Google).
  • Außerdem gibt es keine Dokumentation auf der Seite Local Unit Testing, wie man die Channel API testet (nochmals vielen Dank an Google)

Und dann stieß ich auf dies Beitrag darüber, wie man testet ChannelService in Java-Code. Leider war die einzige relevante Antwort, die gegeben wurde, für Python . Nun, siehe da, Google stellt tatsächlich Python-GAE-Server-Entwicklern Werkzeuge zur Verfügung, um Stub-Clients für Google-Dienste zu schreiben, wie in ihrem Python Local Unit Testing Anleitung . Unglaublich, dass sie es versäumt haben, dasselbe für Java zu tun!


Jetzt, wo ich mir das von der Seele geredet habe (entschuldigen Sie, wenn ich ein bisschen zu aufgeregt klang), würde ich gerne wissen, wie man Java-Code am besten testet, der auf der Channel-API von Google App Engine basiert? Ich möchte mich wirklich auf Testtools statt auf Webseiten verlassen. Muss ich irgendwie Googles Javascript-Client für Kanal-API von Java? Es muss einen besseren Weg geben, wie ich ein Mock-Objekt oder einen Stub verwenden kann.


Aktualisierung 1

Verwendung eines besseren Namens, "Google App Engine" statt nur "App Engine".

4voto

slipheed Punkte 7072

Sie können den LocalChannelService vom LocalServiceTestHelper abrufen, einen gefälschten Client damit verbinden und dann die Nachricht von ihm abrufen:

    LocalChannelService svc = (LocalChannelService) LocalServiceTestHelper.getLocalService("channel");
    ChannelManager channelManager = svc.getChannelManager();
    String connectionId = channelManager.connectClient(token);

    // send a message

    String message = channelManager.getNextClientMessage(token, connectionId);
    assertEquals("123", message);

0voto

dragonx Punkte 14817

Dies sind nur meine Gedanken zum Unit-Test der Kanal-API:

  1. Sie brauchen keine Attrappe. Verwenden Sie einfach die eigentliche API. Tun Sie einfach so, als würde es funktionieren. Es wird kein Fehler zurückgegeben, selbst wenn Ihre Nachricht nicht gesendet werden kann, also können Sie nicht darauf testen.

  2. Haben Sie ein Backup. Ich glaube nicht, dass Sie sich auf die Kanal-API verlassen können. Nachrichten werden nicht angezeigt. Ich persönlich glaube, dass Sie ein Backup brauchen, z. B. eine Abfrage-API, die nicht so reaktionsschnell ist wie die Kanal-API, aber zumindest funktioniert.

  3. Testen Sie Ihre Backup-API.

  4. Verwenden Sie Selenium, um die Kanal-API in einem Browser zu testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X