web development

Selenium

Es gibt verschiedene Test-Technologien, die auf unterschiedlichen Ebenen einer Applikation zum Einsatz kommen. Während JUnit, TestNG und Mockito üblicherweise nicht sichtbare und meistens relativ kleine Teile der Applikation testen, braucht es auch Testframeworks für umfassende Tests, wie Integrationtests und User Acceptance Tests (UATs). Hier bieten sich Arquillian und Selenium an. Während Arquillian ziemlich schwergewichtig unterwegs ist, ist Selenium das Tool der Wahl, wenn es um's automatisierte Testen von WebGUIs geht.

Selenium-Tests können auf zwei Arten erstellt werden:
Zum Einen gibt es die Möglichkeit mit einem der verfügbaren Firefox-Plugins (z.B. "Selenium Builder") Tests zu erstellen. Dabei startet man seine zu testende Web-Applikation und startet das Plugin, welches nun die Interaktionen mit der Web-Applikation im JSON-Format aufzeichnet. Ein so aufgezeichneter Test lässt sich über den Selenium Builder laden und starten. Für eine Integration in einen nightly build oder sonstige automatisierte Tests ist dies kein gangbarer Weg. Ausserdem wird es in komplexen Fällen schwierig das generierte JSON-File zu bewirtschaften.
Der andere Weg ist der programmatische Ansatz. Hierbei werden JUnit bzw TestNG-ähnliche Tests geschrieben, die sich problemlos in Jenkins bzw. Hudson im Rahmen eines nightly builds aufrufen lassen. Diese Variante ist generell vorzuziehen, da oft eine Automatisierung der Tests gefordert ist.
 

Anleitung neuer Service mit PortalPack 3.0.5 Beta, Liferay 6.1 und NetBeans 7.0.1

Hier eine kurze Anleitung, wie man mit PortalPack 3.0.5 Beta, Liferay 6.1 und NetBeans 7.0.1 einen Service baut.

Offen ist noch die DB-Einbindung. Irgendwas stimmt da noch nicht :-/

Unter Tools-Server 'Liferay Portal Server' definieren. Dabei ist Auto Deploy Dir: ...\liferay-portal-6.1.0\deploy und 'Directory Deployment Enabled' gesetzt.

Neues Projekt: - Java Web -> Web Application - NEXT - Project Name. Events - NEXT - Server: Liferay Portal Server - NEXT - Portlet Support aktivieren - Portlet generieren lassen

- FINISH

Jetzt wird das service.xml File angelegt:

Auf dem Events-Projekt rechts klicken und New ... wählen. Den File Type Liferay Plugins -> Service Builder XML wählen. Der Filename ist 'eventsservice' und der Folder ist 'web'.

- FINISH

Jetzt wird der Editor für den eneuen Service automatisch geöffnet:

Der Package Path und der Namespace sind falsch. Also wechseln wir in die XML-Ansicht und passen beides an.

Nun ersetelle ich einen neuen Service für die Events. Dazu klicke ich auf Add (links neben dem Package Path) und erfasse den Enitity Namen 'Event' und die Tabelle 'eventtable' (die Namen haben keine implizite Abhängigkeit untereinander.

Nach dem Add steht die neue Entity 'Event' in der Tabelle links oben. Nun können Columns für ein Event erfasst werden:

Als nächstes könnte ein Finder für Zugriffe über eine oder mehrere der Eventspalten definiert werden. Das mach ich ein anderes Mal.

Als letzter Schritt wird der Service generiert: Klick auf Generate Services (oben links im Services-Editor). Dadurch werden viele Java-Klassen (Service, Datenklassen,...), XMLs und ein ...\Events\service\lib\Events-service.jar erstellt. Die Klassen in ch.osys.events.service.*  sollten nicht von Hand geändert werden, da sie durchs Generieren wieder überschrieben werden.

Die Files in ch.osys.events werden nicht überschrieben durch Generate Services.

Das generierte JAR wird normalerweise ins Portlet WAR integriert. Wenn man will, dass andere Projeket auch diesem Service nutzen können, kann man dies in den Preferences (oben rechts im Editor) setzen.

Jetzt fehlt nur noch das GUI.

Keep it simple:

 <%@page contentType="text/html"%>
 <%@page pageEncoding="UTF-8"%>

 <%-- Uncomment below lines to add portlet taglibs to jsp
 <%@ page import="javax.portlet.*"%>
 <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> 

 <portlet:defineObjects />
 <%PortletPreferences prefs = renderRequest.getPreferences();%>
 --%>

 <%@ page import="javax.portlet.*"%>
 <%@ page import="ch.osys.events.service.service.*"%>
 <%@ page import="ch.osys.events.service.model.*"%>
 <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>

 <portlet:defineObjects />
 <%PortletPreferences prefs = renderRequest.getPreferences();%>

 <table>
  <form method="POST" action="<portlet:actionURL/>">
   <tr>
    <td>Event ID:</td>
    <td><Input type="text" name="id"/></td>
   </tr>
   <tr>
    <td>Datum:</td>
    <td><Input type="text" name="datum"/></td>
   </tr>
   <tr>
    <td>Titel:</td>
    <td><Input type="text" name="titel"/></td>
   </tr>
   <tr>
    <td><Input type="submit"/></td>
   </tr>
  </form>
 </table>
 <H3> Anzahl Events :
  <%
   out.println(EventLocalServiceUtil.getEventsCount());
  %>
 </H3>

Jetzt fehlt noch die Funktionalität hinter dem Submit-Knopf. Dazu füge ich folgendes in ...\Events\src\java\ch\osys\events\Events.java:

public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
 try {
  long id = Long.parseLong(request.getParameter("id"));
  String titel = request.getParameter("titel");
  Event event = EventLocalServiceUtil.createEvent(id);
  event.setId(id);
  event.setTitel(titel);
  event.setDatum(new Date());
  EventLocalServiceUtil.addEvent(event);
  System.out.println("Added");
 } catch (Exception ex) {
  ex.printStackTrace();
 }
}

Fertig!

Nun hab ich noch das Problem mit der DB-Einbindung. Gemäss Fehlermeldung, ist der User nicht berechtigt die Tabelle anzulegen. Ich muss der Sache nachgehen, wenn ich wieder wacher bin (oder 'Zeit habe', was halt zuerst eintritt).