6.3.2. Wie kann ich Portal-Anwendungen testen?

In Portal-Anwendungen ist es möglich, mehrere Portlets auf einer Webseite anzuzeigen. Da insbesondere auch das gleiche Portlet mehrfach auf der Webseite angezeigt werden kann, muss die Portal-Anwendung die Eindeutigkeit der HTML-IDs sicherstellen. Zu diesem Zweck wird jeder Portlet-Instanz in der Regel eine dynamische ID zugeordnet, die als Präfix für die HTML-IDs verwendet wird. Die Vergabe der Portlet-ID kann während des Deployments oder während des Starts des Application-Servers erfolgen. Insbesondere ist diese Portlet-ID zum Zeitpunkt der Testerstellung nicht verfügbar. Wie kann man in diesem Umfeld GUI-Tests programmieren?

Checkerberry web bietet den großen Vorteil des Modellansatzes, über den die erforderliche Implementierung realisiert werden kann. Die Lösung ist dabei von der konkreten Anwendung und Portal-Implementierung abhängig. Dennoch lässt sich ein allgemeiner Lösungsweg beschreiben.

Die wesentliche Aufgabe bei dem Test von Portal-Anwendung besteht darin, die Zuordnung zwischen Portlet und Portlet-ID herzustellen. Zu diesem Zweck bietet checkerberry web die abstrakte Klasse AbstractRemoteControlPortlet. Für jedes Portlet der Anwendung wird eine eigene Portlet-Klasse implementiert z.B. LoginPortlet. In dieser Klasse implementiert der Entwickler Getter-Methode für alle Webseiten, die zu diesem Portlet gehören z.B. public LoginPage getLoginPage(). Die abstrakte Portlet-Klasse verfügt über das Property portletId. Dieses Property kann über die enthaltenen Page-Modellklassen an die Komponenten weitergereicht werden.

Das folgende Beispiel zeigt eine Implementierung der LoginPage im Portal-Umfeld. Im Gegensatz zu dem vorherigen Beispiel enthält die LoginPage-Klasse nun eine Referenz auf das Portlet, in dem die Seite angezeigt wird. Über die Portlet-ID kann dann die HTML-ID der enthaltenen Komponenten dynamisch erzeugt werden.

Beispiel 6.5. Login-Page-Modell im Portal-Umfeld

public class LoginPage extends AbstractRemoteControlPage {

  private AbstractRemoteControlPortlet portlet;

  // Konstruktor mit Contextprovider und Portlet aufrufen
  public LoginPage(ContextProvider contextProvider, AbstractRemoteControlPortlet portlet) {
      super(contextProvider);
      this.portlet = portlet;
  }

  public RemoteControlComponent getUserTextField() {
    // Portlet Präfix bei der HTML-ID berücksichtigen.
    return createComponentProxy(portlet.getPortletId() + ":userId");
  }
}


Da das LoginPage-Modell über das Portlet erzeugt wird, kann die Referenz auf das Portlet leicht übergeben werden. Das folgende Beispiel zeigt eine mögliche Implementierung.

Beispiel 6.6. Beispiel-Implementierung Login-Portlet-Modell

public class LoginPortlet extends AbstractRemoteControlPortlet {

  // Konstruktor mit Fernsteuerung und ContextProvider aufrufen
  public LoginPortlet(ContextProvider contextProvider) {
    super(contextProvider);
  }

  public LoginPage getLoginPage() {
    // LoginPage mit Referenz auf dieses Portlet aufrufen. (Das
    // Portlet ist auch ein ContextProvider...)
    return new LoginPage(this);
  }
}


Das Portlet-Modell wird mit dem aktuellen ContextProvider erzeugt. Über Getter-Methoden werden die Modelle der Webseiten zur Verfügung gestellt, die innerhalb des Portlets verwendet werden. Bei der Erzeugung dieser Modelle wird die Referenz auf das entsprechende Portlet einfach übergeben.

Das vorgestellte Verfahren bietet eine gute Möglichkeit, Modelle in Portal-Umgebungen zu definieren. Die entscheidende Frage ist bisher jedoch unbeantwortet geblieben: Wie kann die Portlet-ID für ein Portlet ermittelt werden?

Eine Möglichkeit für die Ermittlung der Zuordnung von Portlet und Portlet-ID besteht in der Erweiterung der HTML-Datei. Über ein zusätzliches oder bestehendes HTML-Tag kann die Information in die Webseite eingebunden werden. Es ist z.B. möglich, ein DIV-Element um jedes Portlet zu definieren, das einen Portlet-Namen und die Portlet-ID in der HTML-ID enthält z.B. <DIV ID=“PORTLET:NAME=Login;ID=XYZ4711“>. Der vollständige Inhalt der HTML-Seite kann über die Methode RemoteControl.getHtmlSource() ermittelt werden, sodass die Zuordnung ausgelesen und interpretiert werden kann.

Es ist abhängig von der Portal-Anwendung, wann die Zuordnung von Portlet und Portlet-ID ausgelesen und verarbeitet wird. Aus Performance-Gründen kann es sinnvoll sein, die HTML-Seite einmal einzulesen und in die ermittelten Zuordnungen in der Klasse WebContext zu speichern. In anderen Portal-Anwendungen kann es sinnvoller sein, die Zuordnung direkt bei der Erzeugung des Portal-Modells vorzunehmen.