Donnerstag, 19. August 2010

Wir basteln uns Test-Daten, Teil 2

Wir haben einen Text in Passagen aufgebrochen. Dies ist für Test-Daten alleine noch zu wenig. Wir benötigen daraus noch weitere Informationen um unsere Test-Daten etwas "gehaltvoller" gestalten zu können.

Wichtig dabei ist, dass die erzeugten Daten reproduzierbar sind. Zufallsgenerierte Daten sind für zu wiederholende Tests oft nicht verläßlich genug. Wir nehmen als Basis jeweils eine Textpassage, die dem Objekt übergeben wird und generieren daraus Informationen wie Textlänge, einen md5-Schlüssel oder eine Array aller enthaltenen Wörter.

Im Gegensatz zur Klasse "TextTeiler" sind einige Attribute der Klasse auf "public" gesetzt und für einen direkten Zugriff vorgesehen. Ein Überschreiben der Attribute hätte für die Klasse keinerlei Auswirkungen, es werden keine Folgeberechnungen durchführt und es gibt keine anderen Abhängigkeiten innerhalb der Klasse.

class AbsatzInspektor
{
//$Objekt = new AbsatzInspektor("String")
//Dem Objekt wird eine Textpassage uebergeben
//
// $Objekt->Anriss, die ersten Worte der Textpassage
// $Objekt->Laenge, die Laenge der Textpassage
// $Objekt->Woerter, Array mit allen Woertern/Teilen der Textpassage
// $Objekt->AnzahlWoerter, die Anzahl der Woerter/ Teile in dem Array
// $Objekt->Schluessel, (fast) eindeutiger Name in md5

    public $Laenge; public $Anriss;
    public $Schluessel; public $AnzahlWoerter;
    private $Inhalt; private $Zeiger = 0;
    private $Woerter = array();


    function __construct($Inhalt)
    {
        $this->Inhalt = utf8_encode($Inhalt);
        $this->Laenge = strlen($this->Inhalt);
        if($this->Laenge>1)
        {
            preg_match('/(.{20,100}?)( )/is', $this->Inhalt, $Ergebnis);
            $this->Anriss = $Ergebnis[1];
            $this->WoerterAufbrechen($this->Inhalt);
            $this->Schluessel = $this->Schluessel($this->Inhalt);
        }
    }

    public function NaechstesWort()
    {
        $Wort = $this->Woerter[$this->Zeiger];
        $this->Zeiger++;
        return $Wort;
    }

    private function WoerterAufbrechen($Inhalt)
    {
        $Inhalt = str_replace("\r\n", ' ', $Inhalt);
        $this->Woerter = explode(' ', $Inhalt);
        $this->AnzahlWoerter = count($this->Woerter);
    }

    public function AlleWoerter() {return $this->Woerter;}
    public function Zeiger() {return $this->Zeiger;}
    private function Schluessel($Inhalt){return md5($Inhalt.$this->Zeiger);}

}
Natürlich kann der Schlüssel aus einer Kombination von einem Zaehler (private static $Zaehler;) und dem übergebenen Text noch eleganter generiert werden. So aber werden immerhin identische Inhalte verhindert.

Keine Kommentare:

Kommentar veröffentlichen