Aufbau | Übersicht der Befehle | Konstanten und Variablen | Befehle im Detail | Reguläre Ausdrücke
Javatest-Script.
# beginnen, sind Befehle.
Diese müssen GROSS geschrieben sein.* oder + beginnen, werden direkt
als HIT-Request gesendet.; beginnen oder komplett leer sind, werden
ignoriert.Vor jeder Ausführung eines Befehls oder Requests werden Konstanten und Variablen ersetzt.
Tritt irgend ein Fehler auf, beendet sich das Script.
Konstanten werden in % eingeschlossen. Diese enthalten einen festen Wert,
der entweder vom Javatest vorgegeben ist oder zu Beginn des Scripts festgelegt
wird.
Folgende Konstanten sind möglich:
| Konstante | Wert |
|---|---|
%Heute% | das Datum von heute
im Format TT.MM.JJJJ |
%Morgen% | das Datum von
morgen im Format TT.MM.JJJJ |
%Gestern% | das Datum von
gestern im Format TT.MM.JJJJ |
%Vorgestern% | das Datum von
vorgestern im Format TT.MM.JJJJ |
%HeuteX% | das Datum von heute
im Format yyyy-mm-dd |
%MorgenX% | das Datum von
morgen im Format yyyy-mm-dd |
%GesternX% | das Datum von
gestern im Format yyyy-mm-dd |
%VorgesternX% | das Datum von
vorgestern im Format yyyy-mm-dd |
%Jetzt% | den aktuellen
Zeitpunkt
im Format dd.MM.yyyy HH:mm:ss.SSS |
%VorMeldefrist% | das Datum
im Format TT.MM.JJJJ, vor dem die Meldefrist für Aposti
überschritten ist |
%HeuteMin<x>Tage% | Heute
minus <x> Tage im Format TT.MM.JJJJ |
%HeuteMin<x>MonateRoundDown% | Heute
minus <x> Monate im Format TT.MM.JJJJ, wobei beim
Abrunden "überstehende" Tage "abgeschnitten" werden |
%Heute<tage>T<monate>M<jahre>J% | Dynamische
Berechnung des Datums relativ zu Heute und im Format TT.MM.JJJJ.
Für die Parameter <tage>, <monate>
und <jahre> kann jede negative und positive Zahl
sowie die 0 verwendet werden. Wichtig: Kein Leerzeichen
zwischen den %%! |
%MemUsed% | Anzahl Bytes, die
das Javatest-Programm im gerade aktuellen TestCase belegt |
%ENV:name% | Übernimmt den
Wert aus den Umgebungsvariablen des Betriebssystems, die beim Start des
Javatest gesetzt waren.
Es sind alle Namen links des Groß-/Kleinschreibung wird hier beim Konstantennamen ausnahmsweise nicht berücksichtigt. |
Die Groß- und Kleinschreibung wird berücksichtigt. Sollte am Ende des Ersetzungsvorgangs eine Konstante mit unbekanntem Namen stehen bleiben, dann wird nichts ersetzt und die Konstante bleibt mit den umschließenden Prozentzeichen stehen.
Variablen werden in $ eingeschlossen. Diese können durch die Befehle
#SETVAR, #UPDATEVAR
und #REMVAR
gesetzt und gelöscht werden. Auf definierte Variablen wird dann durch $<variable>$
zugegriffen. Die Groß- und Kleinschreibung der Variablennamen wird berücksichtigt, d.h. $hit$
und $Hit$ und $HIT$ sind drei verschiedene Variablen.
Eine nicht definierte Variable wird nicht ersetzt und führt zu keinem Fehler
(da das HIT-Protokoll das Zeichen $ auch verwendet), z.B.:
#SETVAR Foo Bar
#PRINT $Foo$ zahlen bitte!
#PRINT Geldbeutel: $leer$
liefert im Logfile
Bar zahlen bitte
Geldbeutel: $leer$
Einzelne Befehle setzen definierte Variablen:
| Variable | Wert |
|---|---|
$LOM$ | wird von #START_LOM
und #NEXT_LOM gesetzt |
$SqlBnrRange$ | wird von #SET_BNR_RANGE
gesetzt |
$SqlLomRange$ | wird von #SET_LOM_RANGE
gesetzt |
Um das Zeichen $ selbst zu verarbeiten, stellt man ihm ein
Backslash \ vor (das erste $ einer Deklaration
reicht):
#SETVAR Foo Bar
#PRINT $Foo$ zahlen bitte, \$Foo$!
liefert im Logfile
Bar zahlen bitte, $Foo$!
Neben diesen Variablen, die mit Zeichenkettenwerten arbeiten, existieren noch weitere Typen:
Arrays speichern Spalten und Zeilen, die entweder aus einer HIT-Abfrage (mit #ARRAY_HIT)
oder einer CSV-Datei (mit #ARRAY_LOAD)
eingelesen werden können. Speichern in einer CSV-Datei (mit #ARRAY_SAVE)
ist auch möglich. Zusätzlich erlauben Arrays das Mitführen von
Datentypen je Spalte, sofern sie bekannt sind - standardmäßig sind es
Zeichenketten. Ein Array als Ganzes wird als Variable unter einem Namen <name>
gesetzt. Der Name dient dabei als Verweis auf das Array und muss somit bei
allen Array-Befehlen angegeben werden.
Wenn im Array Daten hinterlegt sind, dann können diese als Variable $<name>[zeile][spalte]$
jederzeit verwendet werden:
#ARRAY_LOAD demo test.csv #PRINT "$demo[1][1]$" steht in der erste Zeile und ersten Spalte. #PRINT "$demo[1][BNR15]$" auch.
zeile und spalte sind 1-basierte Indexe, zudem
darf spalte auch eine benannte Spaltenbezeichnung sein.
Neben den Elementzugriffen existieren folgende Sonderindexe:
Zeilen-
IndexSpalten-
Indexwird ersetzt durch Beispiel liefert z.B. ohne ohne nichts! $$-Ausdruck bleibt stehen$demo$$demo$#ohne Anzahl Datenzeilen im Array $demo[#]$5##Anzahl Spalten im Array $demo[#][#]$30ohne CSV-String der Spaltennamen $demo[0]$BNR15;NAME;SYS_VON0spalteSpaltenname der gegebenen Spalte $demo[0][3]$SYS_VON1..nohne CSV-String der Spaltendaten $demo[3]$276090000000001;Name-1;...
Alle anderen Varianten und Inhalte liefern nichts, d.h. der Variablenausdruck bleibt unverändert stehen.
Das komplette Array kann leicht so im Logfile ausgegeben werden:
#FORALL_ARRAY demo row #PRINT $row$ #NEXT
Wichtig: mit #REMVAR und anderen
Variablenbefehlen kann nur <name> bearbeitet werden, jedoch
nicht eine konkrete Spalte in einer konkreten Zeile!
Je nach Anwendungsfall ist zu empfehlen, nach Gebrauch mit einem #REMVAR
<name> ein Array komplett freizugeben, da sich sonst der
Speicherverbrauch drastisch erhöht.
Ein Substitutor hat die Aufgabe, Ersetzungen vorzunehmen. Jeder dieser führt intern eine Übersetzungstabelle mit, die wie folgt gefüllt wird:
Ein Substitutor wird analog den Arrays als Ganzes unter
einem Namen <name> als Variable gesetzt. Der Name dient dabei
als Verweis auf den Substitutor und muss somit bei allen Substitutor-Befehlen
angegeben werden.
Die Ersetzung eines Wertes kann auf zwei Arten vorgenommen werden:
#SUBST_REPLACE den Inhalt
einer bereits gesetzten Variable durchdessen Ersetzungswert ersetzen$<name>[<variable>]$.
Die Variable <variable> muss den zu ersetzenden Wert enthalten, der
-Vorteil gegenüber 1.- in der Variable nicht verändert wird.Auch Substitutoren konnen gesichert (mit #SUBST_SAVE)
und geladen (mit #SUBST_LOAD) werden. #SUBST_LOAD
erkennt anhand separat gespeicherter Metadaten, um welchen Substitutor es sich
handelt und erzeugt und initialisiert diesen mit genau diesen Daten.
Beispiel:
#SUBST_CREATE_TEXT textSubst 0 0 16 #SETVAR t irgendwas #PRINT alt: $t$ -> neu: $textSubst[t]$ #SUBST_REPLACE textSubst t
Zeile 1: #SUBST_CREATE_TEXT definiert einen
Text-Substitutor (erzeugt zufällige Zeichenketten) mit dem Namen textSubst.
Zeile 2 setzt Variable t auf einen Wert, der durch eine zufällige
Zeichenkette ersetzt werden soll.
Zeile 3 gibt einen Text aus, der t im Originalzustand und als
Ersetzung anhand des Substitutors ausgibt. Der Name textSubst gibt
an, welcher Substitutor es ist und der Variablenname t als
Parameter gibt an, welcher Wert übersetzt werden soll. Die Variable (hier t)
wird hierbei inhaltlich nicht verändert.
Zeile 4 führt die identische Ersetzung durch, setzt jedoch den ersetzten Wert
in der Variable t.
Das Beispiel gibt dann z.B. dies aus:
alt: irgendwas -> neu: XXXxXXxxxxxxxxx
Bei Listen- oder Arrayverarbeitung läßt sich die Variablenersetzung ebenfalls verwenden:
; gib aus dem Array "betriebe" den Inhalt der Spalte "NAME" der Zeile "3" aus #PRINT NAME der 3ten Zeile: $betriebe[3,NAME]$. ; Ersetzen und ausgeben (anhand obigem Substitutor): #PRINT ersetzter NAME der 3ten Zeile: $textSubst[betriebe,3,NAME]$.
Beginnt der Variablenausdruck mit einem Substitutor (2tes #PRINT),
dann folgt im Klammerausdruck eine Verweis-Liste, die ausgehend von einer Liste
bzw. einem Array bis hin zum einzelnen Element, das ersetzt werden soll. Hier
ist es die Spalte NAME der 3-ten Zeile des Arrays betriebe.
Eine Rückübersetzung ist auch möglich mit #SUBST_REVERSE
(kein entsprechender Variablenausdruck vorhanden).
Je nach Anwendungsfall ist zu empfehlen, nach Gebrauch mit einem #REMVAR
<name> einen Substitutor komplett freizugeben, da sich sonst der
Speicherverbrauch drastisch erhöht.
Die Syntax der Befehle wird wie folgt beschrieben:
<>
eingeschlossen sind Pflichtparameter,[] eingeschlossen
optionale Parameter,... bedeutet Wiederholung des links
stehenden Parameters,#ECHO <modus>
Legt fest, wieviel protokolliert werden soll. Es gibt folgende Modi:
Modus Bedeutung -1Absolut nichts ausgeben.
Selbst alle expliziten0Fast nichts ausgeben.
Nur Ausgabebefehle wie1zusätzlich zu Modus 0wird die Befehlszeile ausgegeben2zusätzlich zu Modus 1wird der HIT-Status ausgegeben3zusätzlich zu Modus 2werden die HIT-Antworten ausgegebenGenerell werden Im Logfile wird bei Modi
1-3automatisch die Zeilennummer bei der Befehlszeile mitprotokolliert. Da bei Modus0keine Befehlszeile ausgegeben wird, wird auch hier zusätzlich diese bei der Ausgabeergebnisse der Befehle mit ausgegeben.
#LINE_NUMBERS [0/1]
Schaltet die Ausgabe der Zeilennummern im Logfile ein- bzw. aus. Default:
1
#PRINT [text]
#PRINT_LINE [text]
Gibt den angegebenen Text
<text>aus. Ist kein Text vorhanden, dann nur eine leere Zeile.
Wartet auf einen Tastendruck, bevor im Script fortgefahren wird
Wartet
<sekunden>Sekunden, bevor im Script fortgesetzt wird. Es ist maximal eine Stunde (=3600 Sekunden) möglich.
beendet das Script sofort
#GOTOLINE <zeile>
Springt zur angegebenen Zeilennummer
<zeile>. Es sind nur Vorwärts-Sprünge erlaubt.Fügt man zwischen
#GOTOLINEund dem Ziel neue Zeilen ein, dann ist der Sprung verschoben. Eine elegantere Variante ist daher#SKIPmit#CONTINUE_HERE.Innerhalb einer
#FORALLund#ENDFORALLSchleife ist#GOTOLINEnicht zulässig und führt zu einem Fehler.
#SKIPüberspringt alle folgenden Zeilen bis zum#CONTINUE_HERE. Wird bis zum Ende des Scripts kein#CONTINUE_HEREgefunden, beendet sich das Script. Überspringt nur vorwärts.Innerhalb einer
#FORALLund#ENDFORALLSchleife ist#SKIPnicht zulässig und führt zu einem Fehler.
#INCLUDE <dateiname>
Liest die Datei
<dateiname>ein und verarbeitet sie wie jedes andere Javatest-Script. Es übernimmt sämtliche Konstanten und Variablen des aufrufenden Scripts.Der Dateiname
<dateiname>kann auch relativ sein: der Dateiname bezieht sich dann auf das Verzeichnis des aufrufenden Scripts.Kann die Datei nicht gelesen werden, bricht der Javatest ab. Ebenso, wenn eine Datei zum zweiten Mal gleichzeitig verarbeitet wird, da sonst eine Endlosschleife auftreten würde.
Gibt den Speicherverbrauch der Java-VM ins Logfile aus: aktueller Verbrauch, verfügbarer Speicher und die max. Heap Space size.
#DEFINE <key>
#UNDEF <key>
#IFDEF <key>
#ELSE
#ENDIF
Bedingtes Ausführen von Blocken anhand von Schlüsselwörtern analog der Programmiersprache C.
Ein
#DEFINElegt ein Schlüsselwort fest, ein#UNDEFentfernt eines - beide Befehle erwarten ein Schlüsselwort<key>als Parameter.Schlüsselwörter können dann mit einem
#IFDEF <key>abgefragt werden und ist das Schlüsselwort definiert, dann werden alle Befehle bis zum nächsten#ELSEbzw.#ENDIFausgeführt. Analog dazu überspringt Javatest Befehle wegen nicht erkannter Schlüsselwörter ebenso bis zum nächsten#ELSEbzw.#ENDIF. Bei einem nicht vorhandenem Schlüsselwort bei#IFDEFwird der#ELSE-Block, sofern vorhanden, bis zum#ENDIFausgeführt.
#IFDEF...#ENDIF-Blöcke können verschachtelt werden. Schleifendurchläufe u.ä. werden ignoriert, d.h. man muss selbst dafür Sorge tragen, dass Schleifen-Enden nicht öfters aufgerufen werden als Schleifen-Starts.Ein
#IFNDEFlässt sich durch ein#IFDEFund#ELSEohne Befehle dazwischen nachbilden, daher nicht implementiert.Die verwendeten Schlüsselwörter sind weder als Variablen, noch als Konstanten verwendbar. Sie werden in einer eigenen Symboltabelle gespeichert, die nur zum Preprocessing verwendet wird.
#SETVAR <name> [wert]
Setzt eine Variable
<name>auf den Wert<wert>. Der Wert kann weggelassen werden, so dass eine leere Zeichenkette zugewiesen wird.Beginnt der Wert
<wert>mit einem@, dann wird der Rest hinter dem@als Name einer Datei aufgefasst, aus der der Wert der Variable<name>gelesen wird. Z.B.#SETVAR AUS_DATEI @C:\javatest_variable.txt #PRINT Dateidaten: $AUS_DATEI$Beginnt der Wert
<wert>mit einem#, dann wird der Rest hinter dem#als Name einer Datei aufgefasst, aus der der verschlüsselte Wert der Variable<name>gelesen wird. Insbesondere für PINs o.ä. geeignet. ACHTUNG: Lässt sich der verschlüsselte Inhalt der Datei nicht decodieren, dann wird dieser codiert und in die Datei zurückgeschrieben!
#REMVAR <name>
Löscht die angegebene Variable
<name>. Danach findet keine Ersetzung mehr statt.
#UPDATEVAR <name> [wert]
Setzt eine Variable
<name>auf den Wert<wert>., wenn die Variable<name>bereits gesetzt ist. Ist die Variable<name>noch nicht verwendet oder mit#REMVARgelöscht worden, dann wird der Wert<wert>nicht zugewiesen und die Variable<name>bleibt gelöscht. Der Wert kann weggelassen werden, so dass eine leere Zeichenkette zugewiesen wird.Für Werte
<wert>, die mit@oder#beginnen, gelten die gleichen Regeln wie bei#SETVAR.
#CONCATVAR <name>
<begrenzer> [wert]
Erweitert die Variable
<name>mit dem Begrenzer<begrenzer>um den Wert[wert](wird[wert]nicht angegeben, wird eine leere Zeichenkette""angenommen)Damit lassen sich Zeichenketten, wie z.B. CSV-Zeichenketten leicht bauen. Der Begrenzer
<begrenzer>wird nur dann an den Wert von<name>angehängt, wenn die Variable<name>noch nicht gesetzt war. Der Begrenzer darf leer sein, muss aber angegeben werden (mit"").Beispiel:
#SETVAR autos Audi;BMW;Opel;VW #REMVAR alle #FORALL autos i #CONCATVAR alle " + " $i$ #ENDFORALL #PRINT alle zusammen: $alle$Dies arbeitet die Liste der Automarken ab und erzeugt mit ihnen eine neue Variable
alle, die dannAudi + BMW + Opel + VWbeinhaltet. Das#REMVARsorgt sicherheitshalber dafür, dass$alle$vor der ersten Verwendung leer ist. Vor dem ersten WertAudiwird dabei kein Begrenzer gesetzt, weil$alle$leer war.Für Werte
[wert], die mit@oder#beginnen, gelten die gleichen Regeln wie bei#SETVAR.
Gibt alle momentan verwendeten Variablen alphabetisch sortiert im Logfile aus. Neben den Namen werden die Typen und deren Inhalte ausgegeben.
#ARRAY_CREATE <name>
[colname[:coltype] ...]
Legt ein neues zwei-dimensionales Array in der Variable
<name>an. In dieses können zeilen- und spaltenbasierte Daten eingestellt werden, die aus CSV-Dateien (mit#ARRAY_LOAD) oder aus der letzten HIT-Abfrage (mit#ARRAY_HIT) stammen. Nach dem Anlegen mit#ARRAY_CREATEist das Array leer.Beim Anlegen eines Arrays können optional Spaltennamen und -typen mitgegeben werden (durch Leerzeichen getrennt):
#ARRAY_CREATE demo NAME:String STR_NR PLZ:Integer ORT:java.lang.StringDie Typen entsprechen exakt denen von Java. Normalerweise müssen sie in der sogenannten Fully Qualified Name (FQN)-Schreibweise angegeben werden, aber die Standard-Typen aus dem Namespace
java.lang.*undjava.math.*dürfen abgekürzt angegeben werden (im Beispiel beiNAME, verglichen mit der vollen Schreibweise beiORT). Wird durch:getrennt kein Typ angegeben, wird automatischStringangenommen (im Beispiel beiSTR_NR).Details zur Verwendung des
<name>im Javatest finden sich hier.
#ARRAY_ADD <name>
<spalte> [spalte...]
Erzeuge eine neue Datenzeile und hänge sie an das Array
<name>an und fülle sie mit 1..n<spalte>n.Eine
<spalte>darf wiederum ein CSV-String sein, der vor dem Hinzufügen in die Datenzeile am CSV-Trennzeichen;aufgesplittet wird. Jeder dieser Befehle#ARRAY_ADD demo eins;zwei;drei;vier #ARRAY_ADD demo eins zwei drei vier #ARRAY_ADD demo eins zwei;drei;vier #ARRAY_ADD demo eins zwei;drei vier #ARRAY_ADD demo eins;zwei drei;vierfügt somit die gleichen vier Datenspalten der Datenzeile hinzu.
Ist
<name>vorher noch nicht verwendet worden, legt#ARRAY_ADDautomatisch ein neues Array an. Da so keine Typen und Spaltennamen übergeben werden können, enthält das neue Array keine Typen und dynamisch generierte Spaltennamen (aufsteigende Zahlenfolge).Umgekehrt bedeutet dies bei einem bestehenden Array mit Spaltennamen und/oder Typen, dass die hier angegebenen Daten (vorerst ungeprüft(!)) übernommen werden.
#ARRAY_HIT <name> [append]
Lese alle Spalten und Zeilen aus der letzten HIT-Antwort in das mit
<name>angegebene Array.Wird als zweiter Parameter
appendoder1angegeben, werden die Daten an bereits bestehende Daten im Array angehängt - vorausgesetzt, die Spaltenzahl und ggf. die Spaltentypen passen zusammen. Ohne den zweiten Parameter werden bestehende Daten gelöscht, bevor neue Daten gespeichert werden.Ist
<name>vorher noch nicht verwendet worden, legt#ARRAY_HITautomatisch ein neues Array an.Wird die Abfrage (mit
RS), die#ARRAY_HITin ein Array einlesen soll, mit dem SubcodeV1abgesetzt, merkt sich der Befehl die Spaltentypen, indem es diese in Java-Pendants übersetzt und speichert. Ohne den Subcode wird jede Spalte alsjava.lang.Stringaufgefasst.
#PRINT_ARRAY <name>
Gib das Array
<name>mit seinen Datentypen im Logfile aus.
#ARRAY_SAVE <name>
<dateiname> [append]
Speichere alle Spalten und Zeilen des mit
<name>angegebenen Arrays in die angegebene Datei<dateiname>(ggf. in Anführungszeichen""). Es wird das CSV-Format verwendet, d.h. es wird ggf. an den Dateinamen noch.csvangehängt. Existiert die Variable<name>nicht, dann bricht der Javatest ab.Wird als zweiter Parameter
appendoder1angegeben, werden die Daten an bereits bestehende Daten in der Datei angehängt. Ohne den zweiten Parameter wird die Zieldatei neu angelegt, bevor neue Daten gespeichert werden.Spaltentypen
Als besonderes Feature speichert der Befehl in einer zweiten Datei mit dem Namen
<dateiname>.types.csvdie Typen der einzelnen Spalten. Diese Typendatei besteht nur aus zwei Zeilen: Kopf- und Typenzeile. Diese Datei wird beim Einlesen mit#ARRAY_LOADmitberücksichtigt, sollte sie existieren. Damit kann ein Typabgleich zwischen zu lesenden und bereits vorhandenen Daten stattfinden. Ein Spaltentyp hat die Formpackage.Classname(gemäß der Java-Spezifikation).Die Typen können entweder manuell in einer
.types.csv-Datei angegeben und dann mit#ARRAY_LOADmitberücksichtigt werden
oder
via#ARRAY_HITautomatisch mit eingelesen werden, wenn beimRSder SubcodeV1angegeben wurde.Beispiel:
*3:RS/V1:CODES/CODESET;CODENR;CODE;CODETEXT:CODESET;EQ;RASSE #ARRAY_HIT ergebnis #ARRAY_SAVE ergebnis ausgabe.csv
ergebnisenthält nun alleRASSE-Schlüssel und auch die Typen der vier Spalten. Mit#ARRAY_SAVEwerden alle vier Spalten jeder Rasse inklusive Kopfzeile in die Dateiausgabe.csvgeschrieben:CODESET;CODENR;CODE;CODETEXT RASSE;1;SBT;Holstein-Sbt RASSE;2;RBT;Holstein-Rbt ... RASSE;97;XFF;Kreuzung Fleischrind x Fleischrind RASSE;98;XFM;Kreuzung Fleischrind x Milchrind RASSE;99;XMM;Kreuzung Milchrind x MilchrindZusätzlich wird eine Typen-Datei
ausgabe.types.csvangelegt, die die gleiche Kopfzeile und eine Zeile mit den Typen enthält:CODESET;CODENR;CODE;CODETEXT java.lang.String;java.lang.Long;java.lang.String;java.lang.String
#ARRAY_LOAD <name>
<dateiname> [append]
Lese alle Spalten und Zeilen aus der angegebenen Datei
<dateiname>(ggf. in Anführungszeichen"") in das mit<name>angegebene Array. Eine zusätzlich vorhandene Typen-Datei wird mitberücksichtigt, wobei die Anzahl Spalten und Spaltennahmen exakt übereinstimmen müssen. Mehr dazu und zur Dateinamensemantik siehe#ARRAY_SAVE.Wird als zweiter Parameter
appendoder1angegeben, werden die Daten an bereits bestehende Daten im Array angehängt - vorausgesetzt, die Spaltenzahl und ggf. die Spaltentypen passen zusammen. Ohne den zweiten Parameter werden bestehende Daten gelöscht, bevor neue Daten gespeichert werden.Ist
<name>vorher noch nicht verwendet worden, legt#ARRAY_LOADautomatisch ein neues Array an.
#SUBST_CREATE_TEXT <name>
<seed> <min>
<max> [words] [charset [charsetLC]]
Definiert einen Substitutor mit Namen
<name>, der beliebige Texte durch dynamisch generierte Texte ersetzt.
<seed>legt einen numerischen Startwert für den Zufallsgenerator fest. Ist er0, wird ein nicht reproduzierbarer Zahlenstrom generiert (sollte immer so angegeben werden). Alle anderen Werte erlauben reproduzierbare Texte.Mit
<min>und<max>werden die Zeichenkettenlängen festgelegt, die der neu generierte String haben soll. Die Länge wird zufällig ermittelt und liegt zwischen beiden Werten (jeweils einschließlich).<min>und<max>dürfen identisch sein, so dass man damit immer Zeichenketten der gleichen Länge erzeugen kann.Schließlich legt
[charset]fest, welche Zeichen der neue String haben darf. Jedes Zeichen, einschließlich aller Weißraumvarianten, ist dabei zulässig. Ohne die Angabe eines[charset]wird der minimalistische Zeichenvorrat"xX"verwendet.Beispiel:
#SUBST_CREATE_TEXT demo 0 10 16 1 aBcDeFgDer Substitutor erzeugt Zeichenketten der zufälligen Länge zwischen 10 und 16 Zeichen, der aus zufällig zusammengesetzten Zeichen des Zeichenvorrats
aBcDeFgbesteht (ohne Leerzeichen, da nur1Wort). Etwa:FgBeccFeacD.Statt einem konkreten Zeichenvorrat können auch folgende Konstanten angegeben werden, welche dann intern durch bestimmte konkrete Zeichenvorräte ersetzt werden:
Konstante Zeichenvorrat defaultxXlowerabcdefghijklmnopqrstuvwxyzupperABCDEFGHIJKLMNOPQRSTUVWXYZalnumABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789de_upperABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜde_lowerabcdefghijklmnopqrstuvwxyzäöüßde_euroABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ
abcdefghijklmnopqrstuvwxyzäöüß
0123456789
€de_whiteABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜmit Leerzeichen und Tabulator
abcdefghijklmnopqrstuvwxyzäöüß
0123456789
€ascii!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~latin1
iso-8869-1!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿlatin9
iso-8859-15!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿWenn man wider Erwarten doch einen Zeichenvorrat haben möchte, der tatsächlich aus den Zeichen z.B.
asciibestehen soll, dann verschiebt man einfach ein Zeichen willkürlich, etwa zuiasci.Werden zwei
[charset]angegeben, dann wird der erste Zeichenvorrat für den ersten Buchstaben eines Wortes und der zweite Vorrat für die restlichen Buchstaben eines Wortes verwendet. So kann man beispielsweise recht einfach Wörter erzeugen, die jeweils mit einem Grossbuchstaben beginnen und Kleinbuchstaben enden:#SUBST_CREATE_TEXT demo 0 70 70 5 upper lowerDa die Generierung vollständig zufällig geschieht, sind Rückschlüsse auf das Original weder über die Länge der Zeichenkette, noch über die Position von Weißraum (sofern im Zeichenvorrat angegeben bzw. wenn Anzahl Wörter > 1), noch über die einzelnen Zeichen möglich.
#SUBST_CREATE_BNR <name>
<start-bnr>
Definiert einen Substitutor mit Namen
<name>, der konkrete Betriebsnummern durch dynamisch generierte andere ersetzt. Identische Betriebsnummern erhalten dementsprechend identische Ersetzungen.Für jede zu ersetzende Betriebsnummer wird intern, ausgehend von der Start-BNR
<start-bnr>, aufsteigend eine neue erzeugt und vermerkt. Es findet keinerlei Prüfung auf korrekte BNR statt, d.h. der Substitutor kann auch leicht für andere Zwecke genutzt werden.Beispiel:
#SUBST_CREATE_BNR demo 276097878787878Dieser Substitutor erzeugt folgende BNR:
276097878787878,276097878787879,276097878787880,276097878787881,276097878787882,276097878787883,276097878787884und so weiter.
#SUBST_CREATE_LOM <name>
<startwert> ["alnum"]
Definiert einen Substitutor mit Namen
<name>, der konkrete Ohrmarkennummern (kurz LOMs) durch dynamisch generierte andere ersetzt. Identische LOMs erhalten dementsprechend identische Ersetzungen.Da man bei LOMs unterschiedliche europäische Länder zur Verfügung stehen, wird die zu ersetzende LOM in ILAND (3-stellig) und den Rest (12-stellig) zerlegt. Nun wird für jedes erkannte ILAND eine eigene Ersetzungstabelle angelegt, d.h. alle
DE-LOMs werden aufsteigend ersetzt, alle österreichischen (AT) LOMs ebenso und so weiter. Eine ungültige LOM (z.B. Dummy-LOMs) wird automatisch zu einerDE-LOM (Anm.: wird wohl nicht so bleiben, wird evtl. mal geändert).Der Startwert für jedes ILAND wird mit
<startwert>angegeben und darf maximal 12-stellig sein.Als optionalen dritten Parameter kann das Wort
alnum(genau so) angegeben werden. Damit werden die LOMs intern gleich als alpha-numerische LOM weiterverarbeitet. Die Option ist derzeit inaktiv, da die momentane Umsetzung sehr einfach gehalten ist, d.h. die Gefahr ist relativ groß, ungültige LOMs zu erhalten.Beispiel:
#SUBST_CREATE_LOM demo 12121212Dieser Substitutor erzeugt diese LOM-Liste
DE 01 000 00012, AT 023 464 706, DE 01 000 00036, DE 01 000 00082, CZ 310105 219, 980011080000009folgende Ersetzungen
276000012121212, 40000023464706, 276000012121213, 276000012121214, 203000012121213, 276000012121215Wie unschwer zu erkennen, ist die
DE-LOM nun ungültig, da sie kein BLAND mehr enthält. Es ist daher zu empfehlen, eine 10-stellige Nummer mit gültigem BLAND (01-16) zu verwenden, beispielsweise0912121212.
#SUBST_CREATE_EMAIL <name>
<seed> <max> <domain-suffix>
Definiert einen Substitutor mit Namen
<name>, der Email-Adressen mit einem gegebenen<domain-suffix>erzeugt. Die maximale Länge ist hierbei<max>. Intern wird die Länge der Emailadresse anhand<max>aufgeteilt: eine Hälfte ist für den lokalen Teil vor dem@, die andere für den Domain-Teil nach dem@.
<seed>legt einen numerischen Startwert für den Zufallsgenerator fest. Ist er0, wird ein nicht reproduzierbarer Zahlenstrom generiert (sollte immer so angegeben werden). Alle anderen Werte erlauben reproduzierbare Texte.#SETVAR demo Irgendwas #SUBST_CREATE_MAIL sEmail 0 33 .example.com #SUBST_REPLACE sEmail demoliefert z.B. in demo den Wert
eGah4FxPL@2cZZ.example.com.
#SUBST_REPLACE <name> <variable>
[params ...]
Ersetze anhand des Substitutors
<name>den Inhalt der Variable<variable>durch einen dynamisch generierten Wert.<variable>muss vorher gesetzt worden sein. Beispiel:#SETVAR text Lorem ipsum #SUBST_CREATE_TEXT demo 0 0 16 #SUBST_REPLACE demo textDie Variable
textwird hier anhand des Substitutorsdemodurch einen zufällig generierten Text ersetzt.Damit konkrete Werte beispielsweise einer Zeile ersetzt werden können, sind weitere Parameter nötig:
; Abfrage in Array $betriebe$: *2:RS/S:BTR_D/BNR15;NAME;NAME2;STR_NR;PLZ;ORT;ORTSTEIL: _ BNR15;BW;09 199 000 0000;09 199 000 9999;ORDER;1 ; Fülle Array mit den Betriebsdaten #ARRAY_ADD_HIT betriebe ; Substitutor für Name in $fremde$ #SUBST_CREATE_TEXT fremde 4711 10 30 2 latin1 ; nun zeilenweise alle Betriebe durchgehen #FORALL_ARRAY betriebe row ; ersetze Spalte NAME in der Row anhand Referenz: ; unter Verwendung des Substitutors "fremde" via ; Zeile "row" die Spalte "NAME" ersetzen #SUBST_REPLACE fremde row NAME ; zeige ganze Zeile als CSV an - die Spalte NAME ist ; nun ersetzt durch etwas zufälliges #PRINT ersetzt: $row$ #NEXT #PRINT Beispiel-NAME der 3ten Zeile: $betriebe[3,NAME]$.Über zusätzliche (durch Leerzeichen getrennte) Parameter lassen sich auch Listen- und Array-Elemente ersetzen, indem Index-Variablen oder -Werte übergeben werden. Die Parameter müssen als Zugriffskette logisch aufbauen, d.h. erst ggf. Array, dann Liste, dann Einzelelement. Die Parameterliste im Beispiel
row NAMEsagt aus, dass ausgehend von der aktuellen Zeilerowdie konkrete SpalteNAMEverarbeitet werden soll. Würde man diese Zugriffskette nicht angeben, würden lediglich lokale Variablen ersetzt, die nach dem Verlassen der Schleife obsolet würden.Ein dem Substitutor nicht bekannter Wert wird dabei durch die Substitutor-Vorschrift neu generiert, intern vermerkt und dann in
<variable>gesetzt. Bei bekannten Werten wird dessen Pendant aus der internen Liste ermittelt und in<variable>gesetzt. Die Substitutor-Vorschrift hängt vom verwendeten Substitutor ab, d.h. der BNR-Substitutor generiert fortlaufende Betriebsnummern oder der Text-Substitutor zufällig erzeugte Zeichenketten.Eine Ersetzung kann auch direkt als Variablenausdruck
$<name>[<variable>]$vorgenommen werden, ohne dass#SUBST_REPLACEals Zwischenschritt verwendet werden muss. Hat auch den Vorteil, dass der Wert der Variablen<variable>unverändert bleibt.
#SUBST_REVERSE <name> <variable>
[params ...]
Ersetze anhand des Substitutors
<name>den Inhalt der Variable<variable>durch dessen Original.<variable>muss vorher gesetzt worden sein.Damit die Rück-Übersetzung funktioniert, muss sich das Original in der internen Liste befinden. Existiert es nicht, bricht das Script ab.
Eine direkte Rück-Ersetzung als Variablenausdruck analog der normalen Ersetzung existiert nicht.
#SUBST_SAVE <name> <dateiname>
Speichert den Substitutor
<name>mit dessen Übersetzungstabelle in die angegebene Datei<dateiname>(ggf. in Anführungszeichen""). Es wird das CSV-Format verwendet, d.h. es wird ggf. an den Dateinamen noch.csvangehängt. Existiert die Variable<name>nicht, dann bricht der Javatest ab.Als besonderes Feature speichert der Befehl in einer zweiten Datei mit dem Namen
<dateiname>.options.csvdie Parameter und insbesondere den Typ des Substitutors.Beispiel anhand eines BNR-Substitutors:
#SUBST_CREATE_BNR uebersetzung 276097878787878 *2:RS:BTR_D/BNR15:BNR15;BW;09 199 000 0000;09 199 000 9999;ORDER;1 #FORALL_HIT row #SETVAR tmp $row[BNR15]$ #SUBST_REPLACE uebersetzung tmp #PRINT vorher: $row[BNR15]$ -> nachher: $tmp$ #NEXT #SUBST_SAVE uebersetzung tabelle.csvDer Substitutor mit Namen
uebersetzungwird mit dem Startwert276097878787878inituialisiert und wird innerhalb der#FORALL_HIT-Schleife via Variable tmp gefüllt. tmp wird dabei jeweils auf einen Ersetzungswert gesetzt.Beim Speichern in die Datei
tabelle.csvwird etwa folgende Tabelle abgelegt:ORIGINAL;SUBSTITUTION 276091990005312;276097878787930 276091990000023;276097878787900 276091990000040;276097878787917 ... 276091990000015;276097878787892 276091990000038;276097878787915Die Liste ist nach der ersten Spalte sortiert.
Damit beim Einladen der richtige Substitutor mit dessen Parametern wieder identisch reproduziert werden kann, speichert #ARRAY_SAVE noch folgendes in die Datei
tabelle.options.csv:Substitutor;NextBNR;StartBNR;Steps Javatest.hitscript.subst.BnrSubst;276097878787941;276097878787878;1Die Spalte
Substitutorenthält den Typen des Substitutors und die restlichen Spalten dessen Parameter, die je nach verwendetem Substitutor variieren.
#SUBST_LOAD <name> <dateiname>
Lese die Übersetzungstabelle und dessen Parameter aus der angegebenen Datei
<dateiname>(ggf. in Anführungszeichen"") und legen einen neuen Substitutor in der Variable<name>ab. Eine zusätzlich vorhandene Parameter-Datei wird mitberücksichtigt. Mehr dazu und zur Dateinamensemantik siehe#SUBST_SAVE.Ist
<name>vorher noch nicht verwendet worden, legt#SUBST_LOADautomatisch einen neuen Substitutor an.
#PRINT_SUBST <name>
Gib die Übersetzungstabelle des Substitutors
<name>im Logfile aus.
#IFVAR <name> <op>
<wert>
Prüft anhand eines Operators
<op>, ob der Inhalt der Variable<name>und der gewünschte Wert<wert>passen.Ist eine Bedingung erfüllt, dann wird der nachfolgende Block analog
#IFDEFausgeführt. Wenn nicht, dann erst wieder nach dem#ELSEoder#ENDIF.Mögliche Operatoren
<op>sind:
Der nachfolgende Block wird ausgeführt, wenn ... EQ,=... die Variable <name>den Wert<wert>besitzt.NE,!=,<>.. die Variable <name>nicht den Wert<wert>besitzt.LT,<.. die Variable <name>"kleiner" dem Wert<wert>ist.LE,<=.. die Variable <name>"kleiner gleich" dem Wert<wert>ist.GT,>.. die Variable <name>"größer" dem Wert<wert>ist.GE,>=.. die Variable <name>"größer gleich" dem Wert<wert>ist.IN.. der Wert <wert>als Teilzeichenkette in der Variable<name>vorkommt.NI.. der Wert <wert>als Teilzeichenkette nicht in der Variable<name>vorkommt.Derzeit werden nur Zeichenkettenvergleiche durchgeführt.
Existiert die Variable nicht oder ist der Operator unbekannt, dann bricht der Javatest ab.
#IF <wert1> <op> <wert2>
Prüft anhand eines Operators
<op>, ob der linke Wert<wert1>und der rechte Wert<wert2>passen.Ist eine Bedingung erfüllt, dann wird der nachfolgende Block analog
#IFDEFausgeführt. Wenn nicht, dann erst wieder nach dem#ELSEoder#ENDIF.Als Operatoren gelten die gleichen wie bei
#IFVAR, nur eben<wert1>statt Inhalt der Variable<name>.Derzeit werden nur Zeichenkettenvergleiche durchgeführt.
Existiert die Variable nicht oder ist der Operator unbekannt, dann bricht der Javatest ab.
#FORALL <name> <index>
#FORALL_VAR <name> <index>
Enthält eine Variable
<name>einen CSV-String (d.h. Werte, die durch Semikolon;getrennt sind), dann kann man mit der#FORALL-Schleife über alle Werte zyklisch die Indexvariable<index>füllen lassen.Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Beispiel:
#SETVAR autos Audi;BMW;Opel;Alfa
#FORALL autos i
#PRINT $i$ ergänzen
#UPDATEVAR alle $alle$ +
#SETVAR alle $alle$$i$
#ENDFORALL
#PRINT komplett: $alle$liefert im Logfile
Audi ergänzen
BMW ergänzen
Opel ergänzen
Alfa ergänzen
komplett: Audi + BMW + Opel + AlfaIn erster Linie ist die
#FORALL-Schleife für's Abarbeiten von Listen gedacht, weniger für zyklische Zeichenkettenverarbeitung, wie im Beispiel gezeigt.Eine Schleife wird mit
#NEXTabgeschlossen.
#FOR <name> <start> <end> [step]
[digits]
#FORALL_STEPS <name> <start> <end> [step]
[digits]
Ein
#FORbildet einen einfachen Zähler ab. Beginnend bei einem Startwert<start>wird mit einer Schrittweite[step](Vorgabe:1) solange hochgezählt, bis der Endwert<end>erreicht ist. Der Wert bei jedem Durchlauf wird in der angegebenen Variable<name>gespeichert.[step]darf auch negativ sein, jedoch nicht0.Wird
[digits]nicht angegeben, wird die Variable<name>mit dem numerischen Wert des Zählers belegt.
Ist[digits]jedoch angegeben (numerische Werte zwischen 0 und 99), dann wird der numerische Wert als Zeichenkette interpretiert und vorne mit so vielen0en aufgefüllt, bis die Länge[digits]erreicht ist. Ist der Zähler als Zeichenkette "länger" als[digits], dann wird der Wert nicht gestutzt (z.B. ein[digits]von2gibt trotzdem1000aus)! Ist beispielsweise hilfreich, wenn ein Ohrmarkenbereich über eine Schleife abgedeckt werden soll, der immer fünf Ziffern benötigt (aus einem Schleifenwert z.B.47wird dann00047). Damit[digits]angegeben werden kann, muss ein ggf. fehlendes[step]mit1angegeben werden.Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Beispiel:
#FOR i 1 100 3
#PRINT $i$
#NEXTDie Schleife gibt alle Werte zwischen 1 und 100 in 3er-Schritten aus: 1, 4, 7, ..., 94, 97, 100.
[digits]-Beispiel:
#FOR i 1 100 1 5
#PRINT DE 01 234 $i$
#NEXTDie
5(4. Parameter) zeigt an, dass der Indexwert in der Variableiimmer fünfstellig sein soll. Damit wird jede einzelne OhrmarkennummerDE 01 234 00001bisDE 01 234 00100ausgegeben.
#FORALL_HIT <name>
Wurde vor dieser Schleife eine HITP-Abfrage (mit Command
RSo.ä.) durchgeführt, dann kann mit#FORALL_HITjede Ergebniszeile abgearbeitet werden. Der<name>wird dabei als Array-Prefix verwendet, d.h. er wird bei jedem Durchlauf mit den Werten der einzelnen Spalten als Array-Index in der Form<name>[spaltennummer]und<name>[spaltenname]gefüllt.Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Beispiel:
*3:RS:CODES/CODESET;CODENR;CODE;CODETEXT:CODESET;EQ;RASSE
#FORALL_HIT col
#PRINT Code $col[2]$: $col[CODETEXT]$
#NEXTDie Schleife gibt folgendes aus:
Code 1: Holstein-Sbt
Code 2: Holstein-Rbt
Code 3: Jersey
...
Code 97: Kreuzung Fleischrind x Fleischrind
Code 98: Kreuzung Fleischrind x Milchrind
Code 99: Kreuzung Milchrind x MilchrindDie Variable
$col[2]$wird hierbei durch den Wert der zweiten Spalte ersetzt, die Variable$col[CODETEXT]$durch den Wert mit dem SpaltennamenCODETEXT. Auch hier gilt wie bei allen Variablen die korrekte Groß-/Kleinschreibung!
#FORALL_FILE <name> <dateiname>
[header_ignorieren]
#FORALL_FILEöffnet anhand<dateiname>eine CSV-Datei und verarbeitet jede gelesene Zeile als CSV. Der<name>wird dabei als Array-Prefix verwendet, d.h. er wird bei jedem Durchlauf mit den Werten der einzelnen Spalten als Array-Index in der Form<name>[spaltennummer]gefüllt. Der optionale Parameter[header_ignorieren]ermöglicht es, eine mögliche Kopfzeile zu überspringen (=1, Vorgabe) oder sie auch als Daten aufzufassen (=0).Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Ein
#FORALL_FILE col C:/data/adressen.csv
#PRINT Mitgliedsnummer $col[1]$: $col[2]$ aus $col[4]$ $col[5]$
#NEXTliefert beispielsweise Zeilen wie
Mitgliedsnummer 12: Heinz Müller aus 12345 MusterhausenNB: Der
<dateiname>darf leider keine Leerzeichen enthalten!
#FORALL_SELECT <name> <sql_select>
Per DB-Zugriff (sofern aktiviert in Ini-Datei) kann der gegebene SELECT
<sql_select>ausgeführt werden. Ein fehlendes SchlüsselwortSELECTzu Beginn von<sql_select>wird automatisch hinzugefügt; zudem wird ein überflüssiges Semikolon;am Ende automatisch entfernt. Der<name>wird dabei als Array-Prefix verwendet, d.h. er wird bei jedem Durchlauf mit den Werten der einzelnen Spalten als Array-Index in der Form<name>[spaltennummer]und<name>[spaltenname]gefüllt.Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Analog dem Beispiel oben bei
#FORALL_HIT:
#FORALL_SELECT col select * from %SqlQualifier%CODES where codeset = 'RASSE';
#PRINT Code $col[2]$: $col[4]$
#NEXTliefert das selbe Ergebnis wie bei
#FORALL_HIT.Da ein
SELECTdie einzelnen Spalten mit ihren Datentypen liefert, kann man innerhalb einer solchen Schleife (also nur in#FORALL_SELECT) eine Ausgabeformatierung verwenden. Das Format ist<name>[spaltennummer]:FORMATbzw.<name>[spaltenname]:FORMAT. AlsFORMATkann verwendet werden:
Formatierbefehl wird formatiert als :DATETT.MM.JJJJ :TIMEhh.mm.ss :TSTT.MM.JJJJ/hh.mm.ss.f :SQLDATE'TT.MM.JJJJ' :SQLTIME'hh.mm.ss' :SQLTS'JJJJ-MM-TT-hh.mm.ss.ffffff' :SQLSTR'string' Damit lassen sich leicht neue SQL-Statements bauen. Selbst NULL-Werte werden korrekt als
NULLabgebildet. Inkompatible Datentypen (z.B. String als Timestamp ausgeben) werden nicht ersetzt, d.h. die Variablenangabe bleibt unverändert stehen und es wird auch kein Fehler generiert.Ein
$col[DBET_BIS]:SQLTS$gibt beispielsweise
'2100-12-31-00.00.00.000000'aus. Ohne den Formatierbefehl so:2100-12-31 00:00:00.0.
#FORALL_DIRS <name> <dirspec>
[dirspec ...]
Erlaubt es, ein oder mehrere Verzeichnisse mit einem Schleifendurchlauf zu durchsuchen und anhand von Mustern gewünschte Dateinamen zu filtern. Bei jedem Durchlauf werden Informationen über die nächste gefundene Datei der Variablen mit dem Array-Prefix
<name>zugewiesen.Das Format einer
<dirspec>ist<dir> [options] [pattern ...]mit
<dir>: absolutes und existierendes Verzeichnis als Basisverzeichnis[options]: derzeit gibt es folgende Optionen
/Raktiviert das rekursive Durchsuchen des Basisverzeichnisses/I <name>ignoriert das Verzeichnis mit dem Namen <name> beim rekursiven Durchsuchen (ist ohne/Rwirkungslos)[pattern]: ein oder mehrere Dateimuster mit den Platzhaltern*und?, die auf Dateien im Basisverzeichnis (oder Unterverzeichnissen) passen sollen. Zusätzlich kann dem Muster ein^vorangestellt werden, um die Logik umzukehren (d.h. eine Datei, die nicht auf das Muster paßt)Es können mehrere
<dirspec>s angegeben werden, die der Reihe nach und getrennt voneinander abgearbeitet werden. Am Ende der Abarbeitung ergibt dies eine Liste aller gefundener Dateien, die dann in der Schleife abgearbeitet werden. Es ist je nach<dirspecs>-Konstellation möglich, dass Dateien mehrfach auftreten können, da die Ergebnisliste nicht auf doppelte Einträge überprüft wird.Es gibt einen Sonderfall: wird statt
<dir>eine konkrete Datei angegeben, dann wird diese als separate<dirspec>der Form<Verzeichnis der konkreten Datei> <Dateiname ohne Platzhalter>interpretiert.Verzeichnis-, Datei- und Musterangaben können in doppelte Hochkomma (
") eingeschlossen werden, wenn in diesen Leerzeichen vorkommen. Sonst werden die einzelnen Elemente des Befehls am Leerzeichen getrennt, was z.B. beiC:\Program Files\HitBatchzu Problemen führen wird.Informationen jeder gefundenen Datei werden dann Variablen mit dem Prefix
<name>zugewiesen:
Datei-Information Variable Voller absoluter Pfad der Datei <name>[fullpath]Basis-Verzeichnis (wie er bei <dirspecs>, s.o., angegeben wurde)<name>[basedir]Verweis auf die Datei, relativ zum Basis-Verzeichnis
ggf. auch mit Unterverzeichnissen, wenn rekursiv abgearbeitet<name>[relfile]dito, formatiert zur Verwendung in URLs <name>[urlrelfile]Verweis auf das Verzeichnis der Datei, relativ zum Basis-Verzeichnis
ggf. auch mit Unterverzeichnissen, wenn rekursiv abgearbeitet<name>[reldir]Name der Datei (ohne Verzeichnisangaben) <name>[name]dito, formatiert zur Verwendung in URLs <name>[urlname]Dateierweiterung ohne führenden Punkt (z.B. mp3beimusik.mp3)<name>[ext]Größe der Datei in Bytes (unformatiert) <name>[size]Lfd. Nummer der Datei in der #FORALL_DIRS-Liste<name>[num]Innerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Beispiel:
#FORALL_DIRS file D:\HIT *.java ^D?A*.java
#PRINT Mein Name ist $file[name]$ und bin $file[size]$ Bytes groß.
#NEXTEs werden alle Dateien im Verzeichnis
D:\HIT(nur dort, nicht in Unterverzeichnissen) gesucht, die dem Muster*.javaentsprechen. Da ein negatives Muster angegeben wurde (^D?A*.java), werden diese aus der Ergebnisliste gelöscht. Danach wird diese Liste Datei für Datei abgearbeitet und jeweilsfile[]gefüllt.
#FORALL_ARRAY <array> <rowname>
Arbeitet jede Datenzeile des Arrays
<array>ab. Der<rowname>wird dabei als Array-Prefix verwendet, d.h. er wird bei jedem Durchlauf mit den Werten der einzelnen Spalten als Array-Index in der Form<name>[spaltennummer]und<name>[spaltenname]gefüllt.Neben den Spaltenzugriffen existieren folgende Sonderindexe:
Spalten-
Indexwird ersetzt durch Beispiel liefert z.B. ohne null$row$276090000000001;Merkel;Berlin#Anzahl Spalten in der Zeile $row[#]$3spalteSpaltenname der gegebenen Spalte $row[3]$ORTInnerhalb einer Schleife sind Sprünge mit
#GOTOLINEund#SKIPnicht erlaubt und führen zu einem Fehler.Beispiel:
#ARRAY_LOAD rassen rassen.csv #FORALL_ARRAY rassen row #PRINT Code $row[2]$: $row[CODETEXT]$ #PRINT $row[#]$ Spalten mit $row$ #NEXT
#FORALL_LIST <row> <colval>
Arbeitet die gegebene Datenzeile
<row>ab und stellt den Wert der aktuellen Spalte in der Variablen<colval>bereit.
Eine Schleife (egal welche) läuft durch bis zum
#ENDFORALLbzw.#NEXTund wiederholt sich solange, bis alle Werte abgearbeitet sind.Innerhalb einer Schleife verwendete Variablen werden nach dem Ende der Schleife vollständig zurückgesetzt auf die Werte, die sie vor dem Start der Schleife hatten!
Definiert man mit
#START_LOMeine numerische LOM<lom>(15stellig), dann kann man sich das eigenhändige Hochzählen von neuen LOM-Nummern sparen, indem man in Befehlen die Variable$LOM$einfügt. Das Hochzählen übernimmt dann der Befehl#NEXT_LOM.
#SET_LOM_RANGE
<untergrenze> <obergrenze>
Um das gelegentliche fehlerträchtige Ändern von Ohrmarkenbereichen für SQL-Statements einfacher zu gestalten, kann man hier mit
<untergrenze>und<obergrenze>einen Bereich festlegen. Der Wert steht dann in der Variable$SqlLomRange$in Form vonbetween <untergrenze> and <obergrenze>, die dann in Statements angegeben werden kann, z.B.:
#SET_LOM_RANGE 276000914500000 276000914599999
#EXEC_SQL delete from %SqlQualifier%ERSTERF where lom $SqlLomRange$;Dies würde dann z.B. in folgendes übersetzt:
delete from HTX.ERSTERF where lom between 276000914500000 and 276000914599999;
#SET_BNR_RANGE
<untergrenze> <obergrenze>
Um das gelegentliche fehlerträchtige Ändern von Betriebsnummernbereichen für SQL-Statements einfacher zu gestalten, kann man hier mit
<untergrenze>und<obergrenze>einen Bereich festlegen. Der Wert steht dann in der Variable$SqlBnrRange$in Form vonbetween <untergrenze> and <obergrenze>, die dann in Statements angegeben werden kann, z.B.:
#EXEC_SQL delete from %SqlQualifier%BTR_D where bnr15 $SqlBnrRange$;
#HITP_QUOTE
<name> [param ...]
#HITP_UNQUOTE
<name> [param ...]
Maskiert (=
#HITP_QUOTE) oder demaskiert (=#HITP_UNQUOTE) den Wert in der gegebenen Variable<name>.Über zusätzliche (durch Leerzeichen getrennte) Parameter lassen sich auch Listen- und Array-Elemente maskieren, indem Index-Variablen oder -Werte übergeben werden. Die Parameter müssen logisch aufbauen, d.h. erst ggf. Array, dann Liste, dann Einzelelement. Beispiel:
; Abfrage HIT *2:RS/S:BTR_D/BNR15;NAME;NAME2;STR_NR;PLZ;ORT;ORTSTEIL:BNR15;BW;09 199 000 0000;09 199 000 9999;ORDER;1 ; jede Zeile durchgehen #FORALL_HIT row #FORALL_LIST row col #HITP_QUOTE row col #NEXT #PRINT die Zeile maskiert: $row$ #NEXTEine Angabe
#HITP_QUOTE col(ohnerow) funktioniert nicht, da sonst nur der Wert incolgeändert würde und nicht der entsprechende Wert inrow!
#SETHITVAR <name>=<wert> [name=wert
...]
Setzt 1 .. n Schlüssel-Wert-Paare für HIT-Ausdrücke. Ein Schlüssel-Wert-Paar
<name>=<wert>wird ohne Leerzeichen zusammengeschrieben. Enthält der Wert Leerzeichen, dann den Wert in ".." einschließen. Die " werden dabei nicht ausgegeben. Die gespeicherten Daten werden automatisch als lokale Variablen$hitFelder$und$hitDaten$gespeichert, z.B.:
#SETHITVAR BNR15=276090000000001 LOM="DE 09 12345678" ABGA_DAT=12.06.2006
*2:XS:ABGANG/$hitFelder$:$hitDaten$wird ersetzt durch
*2:XS:ABGANG/BNR15;ABGA_DAT;LOM:276090000000001;12.06.2006;DE 09 12345678Wichtig dabei ist, dass durch die Art der internen Speicherung die Reihenfolge der hinzugefügten Felder "willkürlich" ist. Die Felder werden nicht in der Reihenfolge ausgegeben, wie sie hinzugefügt wurden!
Nicht erkannte Ausdrücke werden ignoriert.
#REMHITVAR <name> [name ...]
Löscht 1 .. n Schlüssel samt deren Werte aus den Hit-Ausdrücken. Unbekannte Schlüssel werden ignoriert. Die lokalen Variablen
$hitFelder$und$hitDaten$werden dann aktualisiert.Wird
allals einziger Parameter verwendet, dann werden alle Hit-Ausdrücke samt Werte gelöscht.
#ALWAYS_BW <untergrenze> <obergrenze>
Setzt ein globales Intervall für die Schwere aller folgenden HIT-Antworten. Antworten außerhalb der Grenzen
<untergrenze>und<obergrenze>führen zum Abbruch des Scripts. Default sind-9999und9999.
#ZEILEN_ZAHL_BW
<untergrenze>
<obergrenze>
Prüft, ob die Anzahl der Antwortzeilen der letzten HIT-Anwort zwischen
<untergrenze>und<obergrenze>liegt.
#SCHWERE_EQ <schwere>
Prüft, ob die Schwere der letzten HIT-Anwort gleich dem Wert
<schwere>ist.
#SCHWERE_BW <untergrenze>
<obergrenze>
Prüft, ob die Schwere der letzten HIT-Anwort zwischen den Werten
<untergrenze>und<obergrenze>liegt.
#PLAUSI_COUNT <plausinr>
<anzahl>
Prüft, ob die Anzahl der Plausi
<plausinr><anzahl>mal in der letzten HIT-Anfwort enthalten ist.
#PLAUSI_EXIST_ALL
[plausinr] ...
Prüft, ob sämtliche angegebenen Plausis
[plausinr] ...in der letzten HIT-Anfwort enthalten sind. Zusätzlich zu den gegebenen dürfen weitere existieren.
#PLAUSI_EXIST_ONE
[plausinr] ...
Prüft, ob eine der angegebenen Plausis
[plausinr] ...in der letzten HIT-Anfwort enthalten ist.
#PLAUSI_NOT_EXIST
[plausinr] ...
Prüft, ob keine der angegebenen Plausis
[plausinr] ...in der letzten HIT-Anfwort enthalten ist.
#PLAUSI_EXIST_ONLY
[plausinr] ...
Prüft, ob genau sämtliche der angegebenen Plausis
[plausinr] ...in der letzten HIT-Anfwort enthalten sind.
#PRINT_STATUS [status]
Gibt die Plausis und Fehler der letzten HIT-Antwort aus. Ist eine Meldung
[status]angegeben, wird dieser als Status ausgeben.
#PRINT_DATEN [kopfzeile]
Gibt die Daten der letzten HIT-Antwort in ihrer "Rohform" aus. Ist eine Meldung
[kopfzeile]angegeben, wird dieser als Vorspann ausgeben.
#PRINT_DATENX [kopfzeile]
Gibt die Daten der letzten HIT-Antwort in aufbereiteter Form aus. Ist eine Meldung
[kopfzeile]angegeben, wird dieser als Vorspann ausgeben.
#WRITE_DATEN [kopfzeile]
Gibt die Daten der letzten HIT-Antwort in ihrer "Rohform" in die aktuelle Ausgabedatei aus. Die Ausgabedatei muss vorher mit
#SET_OUTFILEdefiniert werden. Ist eine Meldung[kopfzeile]angegeben, wird dieser als Vorspann ausgeben.
#SPALTE_MIT_TEXT
<text>
Prüft, ob in einer Spalte der letzten HIT-Antwort-Datensätze der Text
<text>enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#SPALTE_OHNE_TEXT
<text>
Prüft, ob in einer Spalte der letzten HIT-Antwort-Datensätze der Text
<text>nicht enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#HEAD_MIT_TEXT
<text>
Prüft, ob in einer Überschrift der letzten HIT-Antwort-Datensätze der Text
<text>enthalten ist.
#HEAD_OHNE_TEXT
<text>
Prüft, ob in einer Überschrift der letzten HIT-Antwort-Datensätze der Text
<text>nicht enthalten ist.
#ZEILE_MIT_TEXT
<text>
Prüft, ob in einer Zeile der letzten HIT-Antwort-Datensätze der Text
<text>enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#ZEILE_OHNE_TEXT
<text>
Prüft, ob in einer Zeile der letzten HIT-Antwort-Datensätze der Text
<text>nicht enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#ZEI_N_MIT_TEXT
<text>
Prüft, ob in der
<zeile>ten Zeile der letzten HIT-Antwort-Datensätze der Text<text>enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Für<zeile>sind Werte zwischen 1 bis Anzahl Zeilen möglich.
#ZEI_N_OHNE_TEXT
<text>
Prüft, ob in der
<zeile>ten Zeile der letzten HIT-Antwort-Datensätze der Text<text>nicht enthalten ist. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Für<zeile>sind Werte zwischen 1 bis Anzahl Zeilen möglich.
#SPALTE_MIT_REGEX
<text>
Prüft, ob in einer Spalte der letzten HIT-Antwort-Datensätze der Text
<text>enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Ob die gesamte Spalte oder nur ein Teil davon geprüft wird, legt#REGEX_EXACT_MATCHfest.
#SPALTE_OHNE_REGEX
<text>
Prüft, ob in einer Spalte der letzten HIT-Antwort-Datensätze der Text
<text>nicht enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#ZEILE_MIT_REGEX
<text>
Prüft, ob in einer Zeile der letzten HIT-Antwort-Datensätze der Text
<text>enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Ob die gesamte Zeile oder nur ein Teil davon geprüft wird, legt#REGEX_EXACT_MATCHfest.
#ZEILE_OHNE_REGEX
<text>
Prüft, ob in einer Zeile der letzten HIT-Antwort-Datensätze der Text
<text>nicht enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird.
#ZEI_N_MIT_REGEX <zeile>:<text>
Prüft, ob in der
<zeile>ten Zeile der letzten HIT-Antwort-Datensätze der Text<text>enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Für<zeile>sind Werte zwischen 1 bis Anzahl Zeilen möglich. Ob die gesamte Zeile oder nur ein Teil davon geprüft wird, legt#REGEX_EXACT_MATCHfest.
#ZEI_N_OHNE_REGEX
<zeile>:<text>
Prüft, ob in der
<zeile>ten Zeile der letzten HIT-Antwort-Datensätze der Text<text>nicht enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Zu beachten ist, dass die Datensatzposition zurückgesetzt wird. Für<zeile>sind Werte zwischen 1 bis Anzahl Zeilen möglich.
#REGEX_EXACT_MATCH <bool>
Stellt den RegEx-Vergleichsmodus ein, der für alle folgenden regulären Ausdrücke gilt.
1ist Default.
0reguläre Ausdrücke sollen nur auf einen Teil des Prüftextes passen 1reguläre Ausdrücke sollen auf den gesamten Prüftext passen Man kann mit Modus
0auch den kompletten Prüftext prüfen, wenn man dem regulären Ausdruck vorne ein^und hinten ein$anhängt.
#IS_VALID_LOM
<lom>
Prüft die
<lom>auf ihre Korrektheit. Bricht ab, wenn sie falsch ist und gibt die Fehlermeldung dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass mindestens Schwere 2 den Test nicht abbricht.
#IS_INVALID_LOM
<lom>
Prüft die
<lom>auf ihre "Falschheit". Bricht ab, wenn sie wider erwarten korrekt ist und gibt die numerische LOM dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass mindestens Schwere 2 den Test nicht abbricht.
#IS_VALID_SW_LOMB
<lom>
Prüft die Schweine-
<lom>(Betriebsohrmarken) auf ihre Korrektheit. Bricht ab, wenn sie falsch ist und gibt die Fehlermeldung dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#IS_INVALID_SW_LOMB
<lom>
Prüft die Schweine-
<lom>(Betriebsohrmarken) auf ihre "Falschheit". Bricht ab, wenn sie wider erwarten korrekt ist und gibt die LOM dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#IS_VALID_SZ_LOMB
<lom>
Prüft die Schafe/Ziegen-
<lom>(Betriebsohrmarken) auf ihre Korrektheit. Bricht ab, wenn sie falsch ist und gibt die Fehlermeldung dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#IS_INVALID_SZ_LOMB
<lom>
Prüft die Schafe/Ziegen-
<lom>(Betriebsohrmarken) auf ihre "Falschheit". Bricht ab, wenn sie wider erwarten korrekt ist und gibt die LOM dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#IS_VALID_SZ_LOMS
<lom>
Prüft die Schafe/Ziegen-
<lom>(Einzeltier-Ohrmarken) auf ihre Korrektheit. Bricht ab, wenn sie falsch ist und gibt die Fehlermeldung dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#IS_INVALID_SZ_LOMS
<lom>
Prüft die Schafe/Ziegen-
<lom>(Einzeltier-Ohrmarken) auf ihre "Falschheit". Bricht ab, wenn sie wider erwarten korrekt ist und gibt die LOM dazu zurück. Bricht jedoch nicht ab, wenn#ALWAYS_BWso gesetzt ist, dass Schwere 3 den Test nicht abbricht.
#PLAUSI_MIT_TEXT
<text>
Prüft, ob in einer Plausi der letzten HIT-Antworten der Text
<text>enthalten ist.
#PLAUSI_OHNE_TEXT
<text>
Prüft, ob in einer Plausi der letzten HIT-Antworten der Text
<text>nicht enthalten ist.
#PLS_N_MIT_TEXT
<text>
Prüft, ob in der
<zeile>ten Plausi der letzten HIT-Antworten der Text<text>enthalten ist. Für<zeile>sind Werte zwischen 1 bis Anzahl Plausis möglich.
#ZEI_N_OHNE_TEXT
<text>
Prüft, ob in der
<zeile>ten Plausi der letzten HIT-Antworten der Text<text>nicht enthalten ist. Für<zeile>sind Werte zwischen 1 bis Anzahl Plausis möglich.
#PLAUSI_MIT_REGEX
<text>
Prüft, ob in einer Plausi der letzten HIT-Antworten der Text
<text>enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Ob die gesamte Plausi oder nur ein Teil davon geprüft wird, legt#REGEX_EXACT_MATCHfest.
#PLAUSI_OHNE_REGEX
<text>
Prüft, ob in einer Plausi der letzten HIT-Antworten der Text
<text>nicht enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck.
#PLS_N_MIT_REGEX <zeile>:<text>
Prüft, ob in der
<zeile>ten Plausi der letzten HIT-Antworten der Text<text>enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Für<zeile>sind Werte zwischen 1 bis Anzahl Plausis möglich. Ob die gesamte Plausi oder nur ein Teil davon geprüft wird, legt#REGEX_EXACT_MATCHfest.
#PLS_N_OHNE_REGEX
<zeile>:<text>
Prüft, ob in der
<zeile>ten Plausi der letzten HIT-Antworten der Text<text>nicht enthalten ist. Der Text<text>ist ein Perl-kompatibler regulärer Ausdruck. Für<zeile>sind Werte zwischen 1 bis Anzahl Plausin möglich.
#RECONNECT [connect timeout]
[server timeout]
baut die Verbindung zum Server wieder auf, wenn z.B. Antwort der Schwere 4 (Panik) die Verbindung unterbrochen hat.
Optionale Parameter sind der Connect- und Connection-Timeout (beide angeben).
#SET_HITP_SERVER <host>
<port>
Beendet in jedem Fall die aktuelle Verbindung zu einem HitServer und baut eine neue zum Host
<host>an Port<port>auf.Wird gar kein Parameter angegeben, dann übernimmt Javatest wieder die Standardeinstellungen aus der Ini-Datei.
#CSV_UPLOAD <command> <entity>
<filename> [<csv-in> <header-template> <input-template>]
Der Inhalt der CSV-Datei wird mit dem angegebenem Befehl
<command>als Meldung mit dem Namen<entity>gesendet. Arbeitet ähnlich wie Batch-Client oder Massen-Upload im Onlineprogramm. Pfadangaben in Dateinamen spezifiziert man am besten mit Slash (c:/tmp/xx.csv) statt mit Backslash.
<csv-in>legt fest wie das CSV-Format interpretiert wird.0(strict) ist Default.
0striktes CSV, d.h. hex-encoded, %--als NULL ... (default)1readable, d.h. mit Strings in Hochkomma, Hochkomma verdoppelt Analog können mit optionalen Templates die Überschriftenzeilen mittels
<header-template>und Datenzeilen mittels<input-template>modifiziert werden (Details siehe.Doku Batch-Client)Bricht ab, wenn eine Fehlerschwere außerhalb der mit
#ALWAYS_BWgesetzten Fehlergrenzen auftritt.Beispiele:
#CSV_UPLOAD IS ZUGANG JavaTest/cvs_upload_zugang.csv
#CSV_UPLOAD * ZUGANG JavaTest/cvs_upload_zugangX.csv
#CSV_UPLOAD IS ZUGANG JavaTest/cvs_upload_zugang.csv #[2];#[1];#[3];MELD_DAT #[2];#[1];#[3];#[3]
#HITBATCH <inifile>
Mit der gegebenen Ini-Datei
<inifile>wird ein HitBatch gestartet.Bricht ab, wenn eine Fehlerschwere außerhalb der mit
#ALWAYS_BWgesetzten Fehlergrenzen auftritt.
Führt ein SQL-Statement aus (sofern aktiviert in Ini-Datei).
INSERT;DELETEundUPDATEsind möglich.
#TEST_LOM [lom]
Nimmt die angegebene numerische Ohrmarke
[lom]und berechnet für das Tier sämtliche Aposti-Vorgänge (sofern aktiviert in Ini-Datei). Wird[lom]nicht angegeben, dann wird die automatische LOM verwendet, die mit#START_LOMgesetzt und mit#NEXT_LOMhochgezählt wird. Wurde weder[lom]angegeben noch eine automatische LOM definiert, beendet sich der Befehl mit einem Fehler.Ist
[lom]nicht numerisch, wird versucht, mit der üblichen LOM-Umschlüsselungslogik eine numerische Form zu ermitteln. Ist dies nicht möglich, weil die LOM keine gütige EU-LOM ist, wird mit einem Fehler abgebrochen.Es werden alle errechneten Plausis -getrennt nach VVVO und Veterinäre- und der Lebenslauf des Tieres gespeichert. In der Datenbank werden physikalisch Daten geändert, gelöscht und gespeichert! Damit kann man sich den Testfall sofort im Web ansehen.
Nach erfolgreichem Berechnen wird die Anzahl der Vorgänge ausgegeben.
Gebe die Plausinummern der mit
#TEST_LOMberechneten VVVO-Vorgänge aus.
Gebe die Plausinummern der mit
#TEST_LOMberechneten Veterinär-Vorgänge aus.
#PRINT_LEBENSLAUF [lom]
Gibt den Lebenslauf des Tieres mit der gegebenen numerischen Ohrmarke
[lom]aus (wie er in Aposti verwendet wird). Wird[lom]nicht angegeben, dann wird die automatische LOM verwendet, die mit#START_LOMgesetzt und mit#NEXT_LOMhochgezählt wird. Wurde weder[lom]angegeben noch eine automatische LOM definiert, beendet sich der Befehl mit einem Fehler.
#HAS_VVVO_VORGANG [plausinr]
...
Vergleicht die zuletzt mit
#TEST_LOMberechneten VVVO-Vorgänge mit sämtlichen angegebenen[plausinr] .... Bei einer Abweichung wird mit Fehler abgebrochen.
#HAS_VET_VORGANG [plausinr]
...
Vergleicht die zuletzt mit
#TEST_LOMberechneten Veterinär-Vorgänge mit sämtlichen angegebenen[plausinr] .... Bei einer Abweichung wird mit Fehler abgebrochen.
#APOSTI_PLAUSIS_IN_DB
<lom> [plausinr]
...
Ruft physikalisch via SQL (sofern aktiviert in Ini-Datei) alle Vorgänge zur gegebenen LOM
<lom>ab und vergleicht deren Plausinummern.mit sämtlichen angegebenen[plausinr] .... Bei einer Abweichung wird mit Fehler abgebrochen.Im Gegensatz zu den anderen Aposti-Testfunktionen verarbeitet der Befehl die VVVO- und Veterinärvorgänge gemeinsam, d.h. es müssen Plausinummern beider "Kategorien" angeben werden!
#HTTP_GET <url>
Holt eine URL
<url>via HTTP GET Request. Eventuelle Parameter müssen zuvor via z.B.#FORM_SEToder#FORM_ADDvorbereitet werden. Eventuell vorhandene Cookies werden bei der Anfrage mitgesendet undSet-Cookie:Header werden ausgewertet. Beim Start des Testscripts sind keine Cookies vorhanden.Anmerkung: Nach dem Ausführen wird der interne Formular-Container geleert, siehe
#FORM_NEW.Bricht ab, wenn eine Fehlerschwere außerhalb der mit
#ALWAYS_BWgesetzten Fehlergrenzen auftritt.
#HTTP_POST <url>
Analog
#HTTP_GET, jedoch wird ein HTTP POST Request abgesetzt.
Damit Formularparameter an
#HTTP_GETund#HTTP_POSTmitgegeben werden können, wird intern ein Formular-Container mitgeführt. Dieser wird mit diesem Befehl angelegt oder geleert.Mit den Befehlen
#FORM_ADD,#FORM_SET,#FORM_SET_FILEund#FORM_FROM_HTMLkann der Formular-Container gefüllt werden. Mit#PRINT_FORM_DATAwird der aktuelle Inhalt des Containers ins Logfile geschrieben.Achtung: Nach jedem
#HTTP_GETbzw.#HTTP_POSTwird der Container automatisch geleert!
#FORM_ADD
<name>=<value>
Fügt einen Formulareintrag, bestehend aus dem Feldnamen
<name>und dessen Wert<value>, im Formular-Container hinzu. Existiert der Feldname<name>bereits, dann wird<value>als weiterer Wert hinzugefügt. So können Mehrfachauswahlen bei Checkboxen oder Listen nachgebildet werden.
#FORM_SET <name>=<value>
Setzt einen Formulareintrag, bestehend aus dem Feldnamen
<name>und dessen Wert<value>, im Formular-Container. Überschreibt dabei ggf. einen bereits vorhandenen Eintrag für<name>.Hinweis: ASP.NET-Seiten verwenden das Zeichen
$als Verschachtelungstrennzeichen in Feldnamen. Dies kann mit den Javatest-Variablen zu Konflikten führen, wenn Variablennamen gleich lauten, da diese erst ersetzt werden, bevor der Befehl ausgeführt wird. Beispiel:#SETVAR login 900001 #FORM_SET ctl00$content$login$txtBnr15=09 000 000 0001Da
$login$gleich900001ist, wird die Formularvariable inctl00$content900001txtBnr15ersetzt, was dann für die Webseite unbrauchbar ist! Entweder lediglich die Groß-/Kleinschreibung des Variablennamen ändern, oder andere Variablennamen verwenden oder das$vor demloginmit einem\maskieren.
#FORM_SET_FILE
<name>=<filename>
Setzt einen Formulareintrag, bestehend aus dem Feldnamen
<name>und dessen Wert<filename>, im Formular-Container. Überschreibt dabei ggf. einen bereits vorhandenen Eintrag für<name>.<filename>darf nicht in Hochkommas stehen!Die Besonderheit ist, dass der Wert ein Dateiname ist, dessen Datei als Upload zum Server geschickt wird.
Wird nach dem Setzen einer Datei die Anfrage via
#HTTP_GETdurchgeführt, bricht das Script sofort ab, da Anfragen mit Dateien nur per#HTTP_POSTmöglich sind.
#FORM_FROM_HTML [name] ...
Mit deser Funktion können Formularinhalte aus der letzten Abfrage (via
#HTTP_GEToder#HTTP_POST) in den Formular-Container übernommen werden, um sie für die nächste Abfrage wieder zu verwenden.Die Funktion berücksichtigt auch vorselektierte Werte in Listen, Radiobuttons und Checkboxen. Inhalte von Knöpfen werden jedoch ignoriert, da man vor dem Ausführen einer Anfrage explizit den gedrückten Knopf angeben soll.
Ohne Parameter übernimmt die Funktion alle Formularinhalte. Gibt man jedoch Feldnamen
[name]an, dann werden nur diese übernommen. Als Feature kann das Wildcard-Zeichen*verwendet werden:
nameFeldname muss exakt namelautenname*Feldname beginnt mit name*nameFeldname endet mit name*name*Feldname enthältt nameInsbesondere bei der Prüfung von ZID-Webseiten ist wegen der Besonerheit von ASP.NET zwingend ein
#FORM_FROM_HTML __*vor der nächsten Abfrage einer ZID-Webseite erforderlich!
Gibt den aktuellen Inhalt des internen Formular-Containers im Logfile aus.
Gibt die alle aktuellen Cookies in lesbarer Form aus. Für Debuggingzwecke geeignet.
Der Cookie-Cache wird mit diesem Befehl gelöscht.
#USE_PROXY <bool>
Um interne und externe Abfragen absetzen zu können, lässt sich mit dem Schalter
<bool>den Proxy dazuschalten oder nicht. Bei0wird kein Proxy verwendet, sonst die in der Ini-Datei angegebene Proxy-URL verwendet.
Gibt eine kurze Übersicht über die letzte Web-Anfrage aus: sie enthält Angaben über die URL, die Request Method, Anzahl durchgeführter Redirects, ggf. die URL des letzten Redirects, statistische Angaben über die erhaltenen HTTP-Header, den Content-Type und wie lang der Content war.
Gibt die HTTP-Header der zuletzt mit
#HTTP_GEToder#HTTP_POSTabgefragten Seite aus. Für Debuggingzwecke geeignet.
Gibt den kompletten Inhalt der letzten Web-Anfrage aus. Für Debuggingzwecke geeignet.
#TEST_REDIR_URL <url>
Wurde eine Seite nach dem Laden umgeleitet, dann kann hiermit die URL
<url>der letzten Umleitung getestet werden.Die URL ist identisch mit der URL von
#GET_WEBPAGE, wenn keine Umleitung stattgefunden hat.
Prüft den Status der letzten Web-Anfrage. Dabei wird der Status in eine Fehlerschwere umgedeutet und bricht das Script ab, wenn sie außerhalb der zulässigen Grenzen von
#ALWAYS_BWliegen.Umsetzungstabelle der HTTP-Statuscodes:
100-199Status "Informational" Schwere 1 200-299Status "Success" Schwere 0 300-399Status "Redirection" Schwere 1 400-499Status "Client Error" Schwere 3 500-599Status "Server Error" Schwere 3
#HAS_REDIRS [0/1]
Prüft, ob eine Weiterleitung durchgeführt wurde. 0 steht für keine Weiterleitung, 1 für mindestens eine. Stimmt die Aussage nicht, wird das Script mit Schwere 3 abgebrochen, wenn sie außerhalb der zulässigen Grenze von
#ALWAYS_BWliegt.
Setzt die Suche im Webinhalt zurück. Alle folgenden Suchbefehle beginnen dann wieder beim ersten Byte.
Die Suchfunktionen können unabhängig von den Daten durchgeführt werden, d.h. es muss nicht zwingend ein HTML-Dokument dahinter stehen. So lassen sich auch CSV-Dateien auf korrekte Daten untersuchen.
#HTTP_FIND_TEXT <n> <text>
Sucht im Webinhalt nach dem
<n>ten Auftreten des Textes<text>ab der letzten Suchposition. Die Suchposition bleibt dann hinter der zuletzt gefundenen Position stehen, um mit weiteren Aufrufen mit der Suche dort fortsetzen zu können.Ist
<n>keine positive Zahl, dann wird der komplette Parameter als Suchtext verwendet.
#HTTP_FIND_TEXT 2 Einzeltiersucht das zweite Auftreten des Textes
Einzeltier.
#HTTP_FIND_TEXT Alle Einzeltieresucht das erste Auftreten des Textes
Alle Einzeltiere.
#HTTP_FIND_TEXT Einzeltiersucht das erste Auftreten des Textes
Einzeltier.
#HTTP_FIND_TEXT -4 Gradsucht das erste Auftreten des Textes
-4 Grad, da<n>einen ungültigen Wert enthält.
#HTTP_FIND_TEXT 1 3 HäuserMöchte man
3 Häusersuchen, muss man erst mal die Anzahl voranstellen, also1.
#HTTP_FIND_TEXT 3 Häuserwäre falsch, da er sonst das dritteHäusersuchen würde.
#HTTP_FIND_OHNE_TEXT <text>
Findet die Suche ab der letzten Suchposition den Text
<text>im Webinhalt, dann wird ein Fehler ausgelöst.
Startet die Zeitmessung.
#STOPWATCH_STOP
<variable>
Stoppt die Zeitmessung und speichert die gemessene Zeit in Millisekunden in die angegebene Variable
<variable>.
#GET_TIMESTAMP
<variable>
Speichert die aktuelle UNIX-Uhrzeit in Millisekunden in die angegebene Variable
<variable>.
#SET_OUTFILE <dateiname> [<append>]
Setzt den Namen für eine Ausgabedatei, in die mit
#WRITE_OUTFILEgeschrieben werden kann. Pfadangaben spezifiziert man am besten mit Slash (c:/tmp/xx.csv) statt mit Backslash.
[append]legt fest an Datei angehängt oder ob überschrieben wird.1(append) ist Default.
1append, also immer anhängen, kein overwrite 0overwrite, die Datei wird geleert, kein append Beim Festlegen der Ausgabedatei ohne append (=
0) wird die angegebene Datei sofort gelöscht (bzw. sie hat dann die Länge 0)!
#WRITE_OUTFILE [text]
Schreibt den Text
[text]in die Ausgabedatei. Wurde die Ausgabedatei nicht mit#SET_OUTFILEdefiniert, beendet sich das Script mit Fehler. Die Ausgabedatei wird für diesen einen Schreibvorgang mit "append" geöffnet und hinterher gleich geschlossen. Damit können mehrere Prozesse gleichzeitig in die Datei schreiben, ohne dass sie sich (kaum) behindern.Das Neuanlegen einer Datei bzw. Anhängen an eine Datei wird durch
#SET_OUTFILEgesteuert.Daten der zuletzt erhaltenen HIT-Datenabfrage können mit
#WRITE_DATAgeschrieben werden.
#FILE_COMP <dateiname1> <dateiname2>
Vergleicht die Inhalte der Dateien
<dateiname1>und<dateiname2>. Das Script bricht mit einem Fehler ab, sobald sich eine Zeile unterscheidet.
#FILE_PRINT <dateiname>
Gibt den Inhalt der gegebenen Datei
<dateiname>im Logfile aus.Unabhängig von der Einstellung bei
#LINE_NUMBERSwerden dabei keine Zeilennummern ausgegeben.
Die Befehle #SPALTE_MIT_REGEX, #SPALTE_OHNE_REGEX,
#ZEILE_MIT_REGEX, #ZEILE_OHNE_REGEX,
#ZEI_N_MIT_REGEX, #ZEI_N_OHNE_REGEX,
#PLAUSI_MIT_REGEX, #PLAUSI_OHNE_REGEX
verwenden reguläre Ausdrücke, die Perl v5 kompatibel sind.
Es lassen sich auch Parameter (in runde Klammern eingeschlossene Ausdrücke)
erfassen. Die Variable $MATCH_COUNT$ liefert die Anzahl der
gefundenen Parameter, einschließlich des Gesamtausdrucks. $MATCH_0$
repräsentiert den gesamten ge"match"ten Ausdruck, $MATCH_1$
und weitere die Parameter 1 bis $MATCH_COUNT$-1. Wird kein
Parameter erfragt, erhält man nur den gesamten Ausdruck in $MATCH_0$
zurück und $MATCH_COUNT$ ist dann 1.
Nach jedem Aufruf einer der oben genannten Befehle werden diese Parameter neu gesetzt.
Beispiel:
Der Text Der Landwirt 09 123 456 7890 hat ein Kalb mit der Ohrmarke DE
09 123 45678 lila angemalt. soll durch den regulären Ausdruck Landwirt
([\s\d]+).+Ohrmarke ([a-z]+[\s\d]+) erkannt werden.
Javatest liefert dann folgende Variablen zurück: =
$MATCH_COUNT$3 =
$MATCH_0$Landwirt 09 123 456 7890 hat ein Kalb mit der Ohrmarke
DE 09 123 45678
$MATCH_1$ = 09 123 456 7890
$MATCH_2$ = DE 09 123 45678
Kurze Syntaxübersicht:
^ (muss am Anfang stehen). ^Bau
bedeutet, dass alle Texte mit Bau beginnen müssen. Ein Haus^bau
hat keine Wirkung.$ (muss am Ende stehen). definiert irgend ein Zeichen (außer
Zeilenumbrüche)[]
eingeschlossen werden. Zeichenbereiche wie a-z sind auch
zulässig. Das Zeichen - selbst muss als erstes in der Klasse
stehen, wenn es als solches aufgefaßt werden soll.^ eingefügt. Beispiel: alle Zeichen
außer die Ziffern wird als [^0-9] geschrieben.\d für alle Ziffern\w für alle Klein- und Großbuchstaben plus Ziffern\s für alle Leerzeichen, Tabulatoren und Zeilenumbrüche() gruppieren. Nützlich
für Wiederholungen und Parameter.| beschrieben, wenn die Ausdrücke in
Klammern () gefaßt sind. (Haus|Wohnungs)bau
würde sowohl Hausbau als auch Wohnungsbau
erkennen.? bedeutet kein oder einmal* bedeutet kein, einmal oder mehrmals+ bedeutet einmal oder mehrmals{x} bedeutet genau x-mal{x,y} bedeutet x-mal bis y-mal (x <= y){x,} bedeutet mindestens x-mal; das Komma ist wichtig!{,y} bedeutet maximal y-mal; das Komma ist wichtig!() werden als Parameter aufgefaßt. Nach dem
Parsen erhält man die Parameter von links nach rechts durchnummeriert als \1,
\2 etc zurück. Ein Haus(bau) liefert in \1
das Wort bau, wenn der gesamte reguläre Ausdruck paßt. \0
liefert den gesamten passenden Ausdruck. Parameter dürfen geschachtelt
werden - gezählt wird dann immer jede geöffnete Klammer (.(), die als Parameter zählen würden, können mit
der Option ?: deaktiviert werden, so dass sie nicht mitgezählt
werden. Beispiel: (?:Haus)(bau) liefert nur in \1
den Text bau.(Haus)bau\1
würde beispielsweise beim Wort HausbauHaus passen, weil der
erste Parameter (Haus) bei \1 verglichen wird.(?!)
durchführen. Wichtig: Der Ausdruck in der Klammer wird nur zur Prüfung
verwendet - er taucht nirgends im Ergebnis auf! Beispiel: Haus(?!bau)
paßt auf Haus, aber nicht auf Hausbau. Haustür
paßt auch nicht, da hinter dem (?!) kein tür
folgt!
Die Übersicht ist bei weitem nicht vollständig. Eine gute Übersicht findet
sich hier
(neues Fenster öffnet sich) - es
wird dort jedoch die Perl-Syntax beschrieben. Hier in Javatest wird nur der Teil zwischen //
verwendet.
Stand: 02.04.2012