[Dresden-pm] Dresden-pm Nachrichtensammlung, Band 102, Eintrag 1

Sebastian Oeste oeste.sebastian at googlemail.com
Mi Apr 4 01:36:32 PDT 2012


Hallo,

Vielen Dank, erstmal für die Antworten.

Da du deine Funktion read_from_file nennst, würde ich annehmen, dass du

lesen willst. Tatsächlich öffnest du aber zum schreiben. Ich würde dir

auch empfehlen, auf Bareword-Filehandle (OUT) zu verzichten. Damit

handelst du dir Probleme ein, die nicht sein müssen. Bspw. sind

Bareword-Filehandle globale Variablen, du kannst sie also nicht in

rekursiven Funktionen einsetzen. Besser wären lexikalische Filehandle:

 open my $fh, "<", $filename or die


Da hast du natürlich recht. Das mit dem zum schreiben öffnen war ein
Tipp-Fehler und das mit dem Bareword wusste ich noch nicht.
Aber ich werds mir merken.
Die erste von dir aufgezeigte möglichkeit finde ich nicht so gut ich wollte
ja den direkten Zugriff auf das Dateisystem vermeiden.
Der Vergleich mit einer bekannten, funktionierenden Funktion ist eine
möglichkeit.

Ich hab fürs erste ein Filehandle übergeben und im Test das _DATA_
Filehandle genommen und dort raus gelesen.

>

Du kannst das File auch mit IO::File lesen.

Zum Testen tauschst Du dann das echte IO::File gegen ein gemocktes aus.

Entweder Du nimmst die Mock Module dafür oder Du schreibst ein IO::File
> selbst, speziell für diesen Test.


Da muss ich mir mal die perldoc von IO::File angucken das hab ich noch
nicht versucht. Aber das zu Mocken gefällt mir ganz gut.
Mal schauen ob ich das hinbekomme.

In weiterer Recherche bin ich auf die Module Test::Output und
Test::Output::Tie gestoßen.
Test::Output ist kein Problem da kann ich was mit der Doku anfangen, ist
halt leider nur für die Standard-Handles.
Test::Output::Tie ??? Keine Ahnung, wie soll ich das nutzten ? Kennt das
jemand?
Habe das so verstanden das man damit auch andere Handles Testen kann. Aber
wie?
Wäre um ein aussagekräftiges Beispiel sehr Dankbar.

Gruß,
Basti



>
> Message: 1
> Date: Sat, 31 Mar 2012 23:13:24 +0200
> From: Sebastian Oeste <oeste.sebastian at googlemail.com>
> To: dresden-pm at pm.org
> Subject: [Dresden-pm] Filehandles testen
> Message-ID:
>        <CAOcXQvs4cdC-epmYWSwJpokUkBTN57+HARyjTcWJ6=-vc+UY6A at mail.gmail.com
> >
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hallo,
>
> ich beschäftige mich grade unteranderem mit TDD unter Perl, kein Problem an
> sich Perl lässt sich sehr gut testen.
> Leider weiß ich nicht so richtig  wie ich Zugriffe auf eine Datei Testen
> soll, ich will ja nicht jedes mal aufs Filessystem.
> Wenn ich jetzt sowas hab:
> sub read_from_file
> {
>  my @insert_line = ();
>  open(OUT, ">>", $file) or die qq/any errormessage/;
>  while (<OUT>)
>  {
>    push(@insert_line, $_);
>  }
>  close(OUT);
>  return \@insert_line;
> }
>
> Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend
> interessieren.
> Wenn ich aber danach google, finde ich leider nur Artikel zu den Dateitest
> Operatoren oden dem DATA Filehandle.
>
> Danke im Vorraus
>
> Gruß,
> Basti
> -------------- nächster Teil --------------
> Ein Dateianhang mit HTML-Daten wurde abgetrennt...
> URL: <
> http://mail.pm.org/pipermail/dresden-pm/attachments/20120331/9d4b6667/attachment-0001.html
> >
>
> ------------------------------
>
> Message: 2
> Date: Sun, 01 Apr 2012 08:24:16 +0200
> From: "Steffen Winkler" <steffen.winkler at gmx.net>
> To: dresden-pm at pm.org
> Subject: Re: [Dresden-pm] Filehandles testen
> Message-ID: <20120401062416.26560 at gmx.net>
> Content-Type: text/plain; charset="utf-8"
>
> Hallo Sebastian,
>
> Du kannst das File auch mit IO::File lesen.
> Zum Testen tauschst Du dann das echte IO::File gegen ein gemocktes aus.
> Entweder Du nimmst die Mock Module dafür oder Du schreibst ein IO::File
> selbst, speziell für diesen Test.
>
> ungetestet:
>
> my $file_handle = IO::File->new($file, '<') or die $!;
> my @insert_line = $file_handle->get_lines;
> $! and die $!; # es gibt auch Fehler beim Datei lesen
> $file_handle->close; # close Fehler gibt es nur beim Schreiben
> return \@insert_line;
>
> --Steffen
>
> -------- Original-Nachricht --------
> > Datum: Sat, 31 Mar 2012 23:13:24 +0200
> > Von: Sebastian Oeste <oeste.sebastian at googlemail.com>
> > An: dresden-pm at pm.org
> > Betreff: [Dresden-pm] Filehandles testen
>
> > Hallo,
> >
> > ich beschäftige mich grade unteranderem mit TDD unter Perl, kein Problem
> > an
> > sich Perl lässt sich sehr gut testen.
> > Leider weiß ich nicht so richtig  wie ich Zugriffe auf eine Datei Testen
> > soll, ich will ja nicht jedes mal aufs Filessystem.
> > Wenn ich jetzt sowas hab:
> > sub read_from_file
> > {
> >   my @insert_line = ();
> >   open(OUT, ">>", $file) or die qq/any errormessage/;
> >   while (<OUT>)
> >   {
> >     push(@insert_line, $_);
> >   }
> >   close(OUT);
> >   return \@insert_line;
> > }
> >
> > Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend
> > interessieren.
> > Wenn ich aber danach google, finde ich leider nur Artikel zu den
> Dateitest
> > Operatoren oden dem DATA Filehandle.
> >
> > Danke im Vorraus
> >
> > Gruß,
> > Basti
>
> --
> NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone!
> Jetzt informieren: http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a
>
>
> ------------------------------
>
> Message: 3
> Date: Sun, 1 Apr 2012 08:37:59 +0200
> From: Maik Hentsche <maik at mm-double.de>
> To: dresden-pm at pm.org
> Subject: Re: [Dresden-pm] Filehandles testen
> Message-ID: <20120401083759.293ba0e7 at zeus>
> Content-Type: text/plain; charset="utf-8"
>
> Sebastian Oeste <oeste.sebastian at googlemail.com> wrote:
>
> > sub read_from_file
> > {
> >   my @insert_line = ();
> >   open(OUT, ">>", $file) or die qq/any errormessage/;
> >   while (<OUT>)
> >   {
> >     push(@insert_line, $_);
> >   }
> >   close(OUT);
> >   return \@insert_line;
> > }
>
> Da du deine Funktion read_from_file nennst, würde ich annehmen, dass du
> lesen willst. Tatsächlich öffnest du aber zum schreiben. Ich würde dir
> auch empfehlen, auf Bareword-Filehandle (OUT) zu verzichten. Damit
> handelst du dir Probleme ein, die nicht sein müssen. Bspw. sind
> Bareword-Filehandle globale Variablen, du kannst sie also nicht in
> rekursiven Funktionen einsetzen. Besser wären lexikalische Filehandle:
>  open my $fh, "<", $filename or die;
>
>
> > Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend
> > interessieren.
>
> Da gibt es mehrere Möglichkeiten. Du könntest z.B. eine Datei anlegen,
> deren Inhalt du genau kennst.
>
>  use Test::More;
>  use MyPackage;
>  my @expected = ("zeile 1\n", "zeile 2\n");
>  my $result = MyPackage::read_from_file('t/file_with_known_content');
>  is_deeply($result, \@expected, 'Read_from_file known content');
>
> Du könntest auch ein bekannt funktionierendes Filelese-Modul verwenden
> und schauen, ob es das selbe liefert wie deine Funktion:
>
>  use Test::More;
>  use MyPackage;
>  use File::Slurp 'read_file';
>
>  my $expected = read_file('t/file_with_unknown_content');
>  my $result   = MyPackage::read_from_file('t/file_with_unknown_content');
>  my $joined   = join '', @$result;
>
>  is($joined, $expected, 'Read_from_file slurp');
>
> Es kann sein, dass noch andere Testmöglichkeiten sinnvoll sind, je
> nachdem, was du testen willst.
>
> so long
> Maik
>
> --
> Der Verstand ist wie eine Fahrkarte. Sie hat nur Sinn wenn man sie
> benutzt. (Ernst R. Hauschka (*1926), deutscher Essayist,
> Aphoristiker und Bibliothekar)
> -------------- nächster Teil --------------
> Ein Dateianhang mit Binärdaten wurde abgetrennt...
> Dateiname   : signature.asc
> Dateityp    : application/pgp-signature
> Dateigröße  : 190 bytes
> Beschreibung: nicht verfügbar
> URL         : <
> http://mail.pm.org/pipermail/dresden-pm/attachments/20120401/6c132f24/attachment-0001.bin
> >
>
> ------------------------------
>
> _______________________________________________
> Dresden-pm mailing list
> Dresden-pm at pm.org
> http://mail.pm.org/mailman/listinfo/dresden-pm
>
> Ende Dresden-pm Nachrichtensammlung, Band 102, Eintrag 1
> ********************************************************
>
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://mail.pm.org/pipermail/dresden-pm/attachments/20120404/111fbcb8/attachment.html>


Mehr Informationen über die Mailingliste Dresden-pm