Dec 27

canoo webtest Report

Das auf Groovy basierende Webframework Grails ermöglicht in der Java Welt eine schnelle Entwicklung von Webapplikationen. Die Schnelligkeit erkauft man sich aber nicht durch den Verzicht auf Tests. Im Gegenteil.

Mit dem Canoo – Webtest Plugin sind die Tests genauso schnell geschrieben, wie die Anwendung selbst (was aus meiner Sicht der einzige Weg ist dem Entwickler das Testen schmackhaft zu machen).

Für die Installation reicht ein simples:

> grails install-plugin webtest

Und mit:

1
2
3
4
5
6
7
> grails create-webtest
WebTest name not specified. Please enter:
<domain -name>
     [copy] Copying 1 file to <pfad zur Grails App>
     [copy] Copying 1 file to </pfad><pfad zur Grails App>/webtest/tests
Web Test generated at webtest/tests/<domain -name>Test.groovy
</domain></pfad></domain>

erstellt man seinen ersten Test für eine Domainklasse von Grails. Alle Tests werden standardmäßig unter /webtest/tests abgelegt. Ein generierter Test könnte so aussehen:
Continue reading »

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , ,

Nov 19

Aller Anfang ist schwer. Um HTML und CSS zu erlernen kann man entweder Kurse besuchen oder sich selbst durchbeißen. Das Selbststudium ist heute allerdings nicht mehr so schwierig wie früher. Wo man vor ein paar Jahren nur selfhtml (womit auch ich angefangen habe) als online Quelle zur Verfügung hatte, ist die Auswahl heute um ein Vielfaches größer. So ist heute die schwierigste Aufgabe die Spreu vom Weizen zu trennen.

little boxes 1

Neben selfhtml, das ich weiterhin uneingeschränkt empfehlen kann, ist jetzt mit Little Boxes Teil 1 ein weiterer Buch Bestseller online. Unter littleboxes.de steht die aktuelle Auflage des Buches von Peter M. Müller bereit.
Erklärt werden neben den HTML und CSS Grundlagen auch fortgeschrittene CSS Gestaltungs Techniken, wie Positionierung und mehrspaltige Layouts. So können auch Quereinsteiger und Fortgeschrittene ihr Wissen erweitern, zumal alle Beispieldateien zum Download bereitgestellt wurden. Ein eigenes Kapitel für nützliche Tools rundet das Buch ab.

Dass das Bereitstellen von Büchern im Internet und der Verkauf der Printausgabe auch parallel funktioniert, zeigt spätestens die Open Book Initiative des Galileo Verlages.

Wem also das online Angebot von Little Boxes gefällt, sollte sich auch das Buch unters Kopfkissen legen. :-)

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , ,

Nov 08

Weiter geht’s in der Reihe “weekly links”. Dies waren meine Highlights in der letzten Woche:

Linux auf dem IBM Thinkpad
Notebooks von IBM oder dem Nachfolger Lenovo eignen sich besonders gut für Linux. Hier ist eine kurze Anleitung für Kubuntu 9.10, wie man das Notebook zum Stromsparen überredet und noch mehr Sondertasten in Betrieb nimmt.
Closure Tools – Google Code
Die Google Online Tools nutzen alle ausgiebig Javascript. So ist es nicht verwunderlich, dass Google jetzt seinen Javascript Compiler, eine Bibliothek für DOM Manipulation und UI Elemente, sowie Templates für Javascript und Java unter dem Namen Closure Tools auf Google Code zur freien Nutzung bereitstellt. Ich freue mich schon auf die ersten Vergleiche mit der Yahoo UI Bilbliothek.
Technische Kurzdokumentationen von Torsten Horn
Ich stehe auf technische Kurzdokumentationen (Tutorials), besonders wenn sie die Qualität wie die von Torsten Horn aufweisen.
Continuous Integration für PHP mit dem Hudson
Testen macht nur Sinn, wenn die Tests regelmäßig durchgeführt werden. Hier ist ein Artikel, wie man PHP Tests in Hudson integriert.
google-maps-icons
Freie Icons kann man als Webentwickler nie genug haben. Hier ist eine große Auswahl, die Google bereitstellt.
PDF-Erzeugung mit dem Zend Framework
Die viel genutzte PHP Bibliothek FPDF zur Erzeugung von PDF Dokumenten gerät bei komplexen Layouts schnell an ihre Grenzen. Dieser Artikel beschreibt eine Alternative mit Zend, die über den Umweg von Office Templates auch komplexe PDF Strukturen ermöglichen soll.
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , , , , ,

Oct 21

In meiner kleinen Serie verlasse ich nun die PHP Welt und wechsel zu Java, der Programmiersprache, die von meiner Lieblings IDE Eclipse am besten unterstützt wird. Mit PHP erreicht man zwar schnell Ergebnisse, durch Java wird man aber zur sauberen OO – Programmierung angehalten. So fühle ich mich in der Java Welt eher zu Hause, denn Ordnung muss sein (zumindest auf dem Computer).

Was hat dass alles mit HTTP Clients zu tun? Eigentlich nichts, außer dass HttpUnit vollständig in Java implementiert ist. Was HttpUnit so komfortabel macht, ist die Verbindung eines HTTP Request – Response Handlers und eines HTML Parsers in einer API, die wie aus einem Guss wirkt. Forms kann man submiten und Links kann man clicken, man fühlt sich fast wie im Browser. Sogar Javascript wird unterstützt, wovon man bei Applikationen die von AJAX ausgiebig Gebrauch machen nicht zu viel erwarten sollte.

So nun zum Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class GoogleClient {
 
   public static void main(String[] args) {
      GoogleClient gc=new GoogleClient();
      gc.request();
   }
 
   public void request() {
      WebConversation wc = new WebConversation();
       WebRequest req = new GetMethodWebRequest( "http://www.google.de" );
       try {
         WebResponse resp = wc.getResponse( req );
 
         WebForm form=resp.getForms()[0];
         form.setParameter("q", "http client examples");
         resp=form.submit(form.getSubmitButton("btnG"));
 
         WebLink[] links=resp.getLinks();
         for (int i = 0; i < links.length; i++) {
            WebLink link=links[i];
            if (link.getAttribute("class").equals("l")) {
               System.out.println("<a href=\""
                     +link.getAttribute("href")+"\">"
                     +link.getText()+"</a>");               
            }
         }
      } catch (IOException e) {
         System.out.println(e.getMessage());
      } catch (SAXException e) {
         System.out.println(e.getMessage());
      }
   }
}

Einzig der Zugriff auf die HTML Elemente über die Syntax von CSS Selektoren fehlt.

Fazit:
HttpUnit ist für mich, verglichen mit den vorgestellten PHP Pendanten, der komfortabelste HTTP Client. Die Unterstützung von JavaScript ist ein weiteres Plus. Die letzte Version (1.7) ist allerdings aus dem Mai 2008. Eine Weiterentwicklung gerade in Richtung funktionaler Tests von AJAX Anwendungen würde ich mir wünschen.

Ausblick:
So sauber man mit Java programmieren kann, so erzeugt man damit oft eine Menge Boilerplate Code. Diesen Missstand behebt Groovy, meiner Lieblings Skriptsprache für die Java VM. Doch dazu mehr in Teil 4.

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , ,

Oct 16

Die übliche Kommunikation im Internet besteht aus einer Anfrage (Request) an einen Webserver über das Protokoll HTTP und eine Antwort (Response) vom Webserver auf dem selben Weg. Die anfragenden Programme nennt man deswegen auch HTTP Clients. Die bekanntesten sind ganz klar die Browser. Aber auch eigene Programme, die so kommunizieren, fallen in diese Kategorie.
Nun muss man das Rad nicht neu erfinden. Von daher möchte ich in einer kleinen Serie ein paar Lösungen vorstellen, die die Details des HTTP Protokolls abstrahieren. Die Aufgabe ist für alle gleich:

  • Aufrufen der Google Startseite
  • Starten einer Suche
  • Anzeige der Treffer Links ohne weitere Beschreibung

Den Anfang macht das Package HTTP_Request2 aus dem Pear Repository. HTTP_Request2 unterstützt allerdings nur die reine HTTP Kommunikation, d.h. man erhält Zugriff auf den Header mit seinen Metadaten und den Body mit dem im Normalfall versendeten HTML. Die Zerlegung des HTML’s (Parsen) ist nicht Bestandteil. Diese Aufgabe erledigt das SourceForge Projekt PHP Simple HTML DOM Parser.

Genug der vielen Worte, hier ist der Beispielcode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
require_once 'HTTP/Request2.php';
require_once '../includes/simple_html_dom.php';
 
$html = new simple_html_dom();
 
$url='http://www.google.de';
$request = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);
try {
    $response = $request->send();
    if (200 == $response->getStatus()) {
 
      $html->load_file($url);
      $forms=$html->find('form');
 
      $form=$forms[0];
      $action=$form->getAttribute('action');
      $html->clear();
 
      $request = new HTTP_Request2($url.$action, HTTP_Request2::METHOD_GET);
      $url=$request->getUrl()->setQueryVariable('q', 'http client examples');
 
      $html->load($request->send()->getBody());
 
      foreach ($html->find('a.l') as $link) { 
         echo $link,"<br />";
      }
 
      $html->clear();
    } else {
        echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
             $response->getReasonPhrase();
    }
} catch (HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
}
?>

Die Zeilen 7, 8 und 10 rufen die Google Startseite auf. Der Erfolg dieser Aktion (HTTP Status 200) wird in Zeile 11 kontrolliert. Davon ausgehend, dass die Seite existiert, besorge ich mir in Zeile 13 das HTML und suche darin nach dem ersten Formular. Wichtig für die weitere Kommunikation ist die Aktion (Attribut action), die für diese Form definiert wurde.

Die URL + action + die Suchanfrage, die in Zeile 21 als Parameter dem request hinzugefügt wird, ergeben die neue Anfrage. Die Klasse Simple HTML DOM Parser kann nicht nur das HTML aus einer eigenen Anfrage zerlegen, sondern auch einen String als Quelle (Zeile 23) benutzen.
Dass was mich am meisten an Simple HTML DOM Parser begeistert, ist der Zugriff auf die HTML Elemente über die Syntax von CSS Selektoren. So wird mit a.l auf alle Links der Klasse l zugegriffen.

Danach sollte man noch ein bißchen aufräumen (Zeile 29) – fertig.

Fazit:
Das Gespann aus Pear HTTP_Request2 und PHP Simple HTML DOM Parser ist ein leistungsfähiger HTTP Client für die Skriptsprache PHP. Die einzige Voraussetztung ist eine vorhandene Pear Umgebung, die ich aber sowieso jedem PHP Programmierer empfehlen würde.

Ausblick:
Teil 2 wird sich mit dem Zend Framework beschäftigen. Artikel mit Lösungen für Java und Groovy sind geplant. Welche HTTP Clients nutzt ihr für eure funktionalen Tests oder zur Fernsteuerung von Webanwendungen?

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , ,