Schrift
[thread]12066[/thread]

Perl-Unterprogramme in anderen Dateien



<< >> 5 Einträge, 1 Seite
Mdui
 2008-06-23 17:17
#111374 #111374
User since
2008-05-05
10 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen!
Gibt es in Perl noch Alternativen zu eval?
Meine Frage hat folgenden Hintergrund:
Ich Programmiere eine Test-Suite für eine Webseite mit Selenium (da man mit Selenium aufgezeichnete Tests wunderbar in Perl exportieren kann).
Die Suite überprüft zuerst konfiguration und startet zur Zeit über require $testscript den Test.
Leider wartet das Hauptprogramm nicht das ende des Testscripts ab und platziert die Ergebnisse die ich mithilfe von Test::More erzeuge nach Ablauf des Hauptprogramms.
Desweiteren würde ich gerne wissen ob es eine möglichkeit gibt ein mit Fehler abgebrochenes Testscript abzufangen damit das Hauptscript nicht abstürzt.

Ich hoffe ich hab mich nicht zu kompliziert ausgedrückt :)
Danke für eure Hilfe!
renee
 2008-06-23 17:22
#111376 #111376
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Testskripte bei Fehlern abgebrochen werden, bleibt Dir vermutlich nur das Block-eval.

Was meinst Du mit
Quote
Leider wartet das Hauptprogramm nicht das ende des Testscripts ab und platziert die Ergebnisse die ich mithilfe von Test::More erzeuge nach Ablauf des Hauptprogramms.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Mdui
 2008-06-23 17:27
#111377 #111377
User since
2008-05-05
10 Artikel
BenutzerIn
[default_avatar]
Selenium liefert bei erfolgreicher Aktion ein 'OK' welches ich mit is($seleniumausdruck,'OK','Ausdrucksbeschreibung') überprüfe. Test::More liefert dazu schöne Meldungen auf die STDOUT die man wunderbar per CGI auf einer Webseite anzeigen lassen kann. Leider wird zuerst der HTML-Code des Hauptscripts dargestellt und dann ganz am ende die STDOUT von Test::More, obwohl der aufruf des Testscripts mitten im Hauptcode steht.
renee
 2008-06-23 17:36
#111379 #111379
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zeig mal wie Du das machst...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Mdui
 2008-06-23 17:46
#111381 #111381
User since
2008-05-05
10 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
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
#!/usr/bin/perl -w

BEGIN{
    use strict;
    use rcconfig;
    use Test::More tests =>1;
}
END
{
# Selenium RC-Config
    my $rcserver = rcconfig->new();
    my $rchost = $rcserver->get_rchost();
    my $rcport = $rcserver->get_rcport();
    my $rcbrowser = $rcserver->get_rcbrowser();
    my $rcurl = $rcserver->get_rcurl();
    
my $obj = WWW::Selenium -> new(host => $rchost,
                               port => $rcport,
                               browser => $rcbrowser,
                               browser_url => $rcurl);

$obj->start();
is($obj->open("/cosmo_90/"),'OK','Domain oeffnen');
$obj->stop();
}

1;

Das ist ein kleines Testscript
Code (perl): (dl )
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    ##################################################
    # eigene Klassen/Dateien/Module einbinden und Existenz überprüfen
    my @required_config_files = ("test_definitions",
                                 "rcconfig"); # zu überprüfende Module/Klassen
    my $file; # Hilfsvariable
    foreach $file (@required_config_files){ # für jedes angegebene Modul
        eval"use $file"; # Versuche Modul zu laden
        if($@){# wenn es einen Fehler beim laden des Moduls gibt, Fehlermeldung ausgeben
            print "<p class=\"error\"><b>$file</b> - Datei/Modul konnte nicht geladen werden:<br /> $@ <br /></p>\n";
        }
    }
    if($@){ # wenn es beim laden der Konfiguration Fehler gab
        print "</body></html>\n"; # HTML-Ende ausgeben
        exit; # Programm beenden
    }
    else{
        print"<p>Konfiguration wurde erfolgreich geladen</p>";
    }
    
    
    # Einbinden der Testscript-Konfiguration
    my $test_def = test_definitions->new();
    my $test_ref = $test_def->getTests();
    
    ##########################################
    # überprüfen der Test-Script-Configuration und Ausführung der Tests
    
    my %tests = %$test_ref; # Test-Definitionen dereferenzieren
    my $test; # Hilfsvariable für Tests-Hash
    my $key; # Hilfsvariable für Tests-Hash
    my @errors; # Fehler-Container
    my $error; # Hilfsvariable zur Fehlerausgabe
    my $UA = new LWP::UserAgent;
    my $count_tests = keys %tests; # Zählvariable
    my $count_ok = 0;# Zählvariable zum überprüfen erfolgreicher Tests
    my $count_fail = 0; # Zählvariable für Fehler
    my $config_error_flag; # Variable zum markieren fehlerhafter Test-Konfigurationen
    my $script_error_flag; # Variable zum markieren fehlender Scripte
    my $script_file;
    
    # Alle zu überprüfenden Keys festlegen
    my @required_keys = ('title','legend','type');
    
    # hier wird jeder einzelne Schlüssel des Tests überprüft
    foreach $test (sort keys %tests){ # jeden einzelnen Test holen
        $config_error_flag = 0; # Fehler-Flags zurücksetzen (könnte aus vorhergehenden Überprüfungen gesetzt sein)
        $script_error_flag = 0;
        my @missing_keys = (); # Hilfsarrays Script- und Konfigurations-Überprüfung
        my @missing_scripts = ();
        foreach $key (@required_keys){ # für jeden Schlüssel
            unless($tests{$test}->{$key}){ # Schlüssel des geholten Tests überprüfen
                # falls nicht gesetzt oder nicht vorhanden zur Liste fehlender schlüssel hinzufügen
                push(@missing_keys,$key);
                $config_error_flag = 1; # und Test als Fehlerhaft konfiguriert markieren
            }
        }
        # Überprüfen ob Test-Script vorhanden
        $script_file = "$source_cgi$dir_suite$script_dir/".$tests{$test}->{type}."/$test"; # generierung vollständiger Dateiname
        unless(-e $script_file){ # wenn Datei nicht vorhanden
            push(@missing_scripts,$test); # Dateinamen zur Liste fehlender Dateien kopieren
            $script_error_flag = 1; # Test als Script-Fehlend markieren
        }
        if($config_error_flag){ # überprüfen ob es Konfigurationsfehler gab
            # falls ja, Testbezogene Fehlermeldung generieren
            my $errStr = "$test: configuration: Keys not defined: ".join(',',@missing_keys)."<br>";
            # Fehler-Meldung zur Fehler-Liste hinzufügen
            push(@errors,$errStr);
            unless($script_error_flag){ # wenn keine Scripte Fehlen
                next; # zum nächsten Test springen
            }
        }
        if($script_error_flag){ # Überprüfen ob Script gefehlt hat
            my $errStr = "$test: Script: File not found: ".join(',',@missing_scripts)."<br>";
            push(@errors,$errStr);
            next;
        }
        ###############################################
        # An dieser Stelle wird der Test dann ausgeführt (zB per require f_nl_order.cgi)
        my @results = ();
        print "<p class=\"ok\">$test:";
        print"<ul>";
        foreach $key (sort keys %{$tests{$test}}){
            print"<li>$key: $tests{$test}->{$key}</li>";
        }
        print"</ul></p>";
        if(require $script_file){
            $count_ok++;
        }
    }
    
    # Ausgabe Anzahl der definierten Tests
    print"Anzahl definierter Tests: $count_tests<br>";
    # Ausgabe erfolgreicher Tests
    print "Anzahl erfolgreich abgeschlossener Testst: $count_ok";
    # Ausgabe der Fehler
    $count_fail = @errors; # Fehleranzahl ermitteln
    print"<p class=\"error\">Es gab $count_fail Fehler:<br>"; # Fehleranzahl ausgeben
    foreach $error (@errors){ # für jede eingetragene Fehlermeldung
        print $error; # diese ausgeben
    }
    print"</p>";
    
    # Ende HTML
    print "</body></html>\n";

Und das die überprüfung der Config und Aufrufen der Testscripte

EDIT:
Die Ausgaben von Test::More tauchen im HTML-Dokument aber erst nach Ausgabe aller Fehler im Array @errors auf.
Leider hat ein Eval-Block nicht den gewünschten Effekt gezeigt, bei fehlerhaftem Script wird die AUsführung des Hauptprogramms trotzdem unterbrochen...
<< >> 5 Einträge, 1 Seite



View all threads created 2008-06-23 17:17.