Testen von Web-Applikationen
Ein weiteres Gebiet, auf dem häufig Tests vernachlässigt werden sind die Web-Applikationen. Noch nicht einmal große Firmen - die es sich leisten könnten und eigentlich von einer funktionierenden Seite profitieren - testen ausreichend ihre Web-Applikationen.
Web-Applikationen sollten neben der Usability auf zwei Punkte hin getestet werden: Die Funktionalität und wie sich die Anwendung unter Last verhält. Bevor Lasttests gemacht werden, sollte erst die Funktionalität überprüfen. Denn was bringt eine Webseite, die gut skaliert aber nicht die gewünschten Funktionen bietet. Für Lasttests gibt es Tools wie JMeter, das in Java geschrieben ist, und openSTA, das es nur für Windows gibt. Perl bietet auch die Möglichkeit, mit HTTP::Recorder Lasttests durchzuführen.
Um die Funktionalität zu überprüfen, gibt es vor allem zwei Module, die dies erleichtern: Test::WWW::Mechanize und Test::WWW::Selenium. Man kann sich die Testsuite auch mit LWP zusammenbauen, aber die zwei genannten Module bieten schon alle wichtigen Funktionen.
In den folgenden Sektionen werden die Module für die Funktionstests und das Modul für Lasttests vorgestellt.
Test::WWW::Mechanize
Test::WWW::Mechanize setzt - wie der Name schon sagt - auf WWW::Mechanize auf. Mit dem Modul kann man sehr leicht die Funktionalität einer Webseite überprüfen und ob immer das richtige Ergebnis geliefert wird.
Man kann natürlich WWW::Mechanize und Test::More selbst kombinieren, aber das macht unnötig Arbeit und wird schnell unübersichtlich.
Mit
#!/usr/bin/perl
use strict;
use Test::More tests => 2;
use Test::WWW::Mechanize;
my $mechanize = Test::WWW::Mechanize->new();
# check "home"
$mechanize->get_ok( 'http://www.foo-magazin.de' );
$mechanize->content_like(qr/Perl/i, "found Perl" );
$mechanize->title_is( '$foo - Perl-Magazin', 'Perl-Magazin title' );
# check "preis"
$mechanize->follow_link_ok( {text => 'Preise'}, 'go to prices' );
$mechanize->content_contains( 'Einzelheft', 'contains price for one magazine' );
$mechanize->content_contains( '6.00 €', 'and there\'s a price of 6 Euro' );
Wird die Webseite
http://www.foo-magazin.de überprüft. Die ersten drei Tests betreffen die Startseite. Hier wird erstmal überprüft, ob eine Antwort kommt. Irgendwo im Seiteninhalt muss dann das Wort ``Perl'' auftauchen. Der dritte Test checkt dann, ob die Seite den richtigen Titel enthält.
Die darauffolgenden drei Tests überprüfen eine weitere Seite und ob man von der Startseite zu der ``Preise''-Seite kommt. Bei den Preisen muss dann ein Preis für ein Einzelheft genannt. Und es muss ein Preis von 6 Euro auftauchen...
Die Ausgabe des Testskripts sieht dann so aus:
C:\>test_mechanize.pl
1..6
ok 1
ok 2 - found Perl
ok 3 - Perl-Magazin title
ok 4 - go to prices
ok 5 - contains price for one magazine
ok 6 - and there's a price of 6 Euro
Test::WWW::Selenium
Selenium ist in Java geschrieben - was hat das dann hier zu suchen? Es ist nur der Server in Java geschrieben, der Rest in Perl. Um mit Test::WWW::Selenium zu arbeiten, ist eine relativ neue Version der Java Runtime Environment
(JRE) nötig - für neue Versionen von Test::WWW::Selenium ist die JRE 1.5 notwendig.
Im Gegensatz zu Test::WWW::Mechanize wird nicht Perl als Browser verwendet, sondern ein lokal installierter Browser. Dadurch ist es auch möglich,
JavaScript? zu testen, was bei Test::WWW::Mechanize nicht möglich ist.
Selenium kann mit den gängigsten Browsern arbeiten:
- Internet Explorer
- Firefox
- Safari
- Opera
- und andere
Installation
Bei der Installation müssen zwei Pakete installiert werden: Test::WWW::Selenium und Alien::SeleniumRC. Alien::SeleniumRC enthält die Server-Komponente, und das Test-Modul hält die Funktionen für die Tests vor.
Wenn alles installiert ist, kann es mit dem Testen losgehen. Es soll wieder eine Webseite des Perl-Magazins getestet werden.
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Test::More tests => 2;
6 use Test::WWW::Selenium;
7
8 my $url = 'http://www.foo-magazin.de';
9
10 my $sel = Test::WWW::Selenium->new(
11 host => 'localhost',
12 port => 4444,
13 browser => '*firefox',
14 browser_url => $url,
15 default_names => 1,);
16 $sel->open_ok($url);
17 $sel->title_like(qr/Perl.Magazin/);
Bevor der Test durchgeführt werden kann, muss noch der Selenium-Server gestartet werden, der dann als Proxy dient. Der Server nimmt die Anfragen aus dem Skript entgegen und leitet diese dann weiter.
--
ReneeBaecker - 15 Apr 2009