Referenzen

Aus succestWiki
Wechseln zu: Navigation, Suche

Wenn Zielsysteme z. B. bei der Erstellung von Daten mit einer internen Nummernvergabe arbeiten, ist es schwierig sich in nachfolgenden Testfallschritten auf den eben erstellten Datensatz zu beziehen. Schließlich kennt man dann nicht die ID des Datensatzes.

Die Lösung ist eine Referenz, die im TCE erstellt wird und anhand dieser ein Datensatz eindeutig referenziert werden kann. Der FMC Loader hat bereits eine eigene Implementierung hierfür, welche allerdings nur mit SAP funktioniert. Will man nun bei einem Testfall für eine WebAPI einen Datensatz anlegen und anschließend bearbeiten, kann man dies mit einer Referenz bewerkstelligen.

In succest gibt es die Möglichkeit Rückgabewerte von Testschritten in einer Variable vom Typ SuccestReference zu speichern. Diese Referenz kann in anderen Testschritten angegeben werden um Rückgabewerte über mehrere Testschritte hinaus zu verwenden.

Vorraussetzungen

Es gibt zwei Möglichkeiten um mit Referenzen zu arbeiten. Die erste Möglichkeit ist die Referenz in einer Aktivität zu hinterlegen und diese aus einer Ergebnisvorlage zu befüllen. Die zweite Möglichkeit ist, mit Referenzen direkt auf einer Ergebnisvorlage zu arbeiten. Um bei einem Testschritt eine Referenz verwenden zu können, muss dies in der entsprechenden Erzeugungsvorlage hinterlegt sein.

Aktivitäten

Damit eine Referenz in einer Aktivität genutzt werden kann, muss dieser ein Feld vom Typ SuccestReference zugewiesen werden.

Erzeugungsvorlagen

Um beim Aufruf einer WebAPI eine gespeicherte Referenz mitgeben zu können, muss dies in der Erzeugungsvorlage definiert werden. Es ist möglich einer Erzeugungsvorlage mehrere Referenzen mitzugeben. In dem unteren Beispiel soll die Adresse eines Kunden geändert werden. Mithilfe von Referenzen kann auf den Kunden und dessen Adress-Datensatz verwiesen werden. Die Referenzen werden in diesem Fall von der verknüpften Aktivität ausgelesen. Im Grunde verhalten sich Referenzen genauso wie Aktivitäts- und Vorlagenfelder.

<?xml version="1.0" encoding="utf-8"?>
<root>
  <version>1</version>
  <textTemplateType>GenerationTemplate</textTemplateType>
  <id>9aead5bc-8e3d-4fa4-b22d-80042e6a9125</id>
  <recs>
    <rec>
      <stepId>01B{$RecordIndex:00000000}{$TestCaseId:N}{$Id:N}</stepId>
      <uri>/customers/{$CustomerId}/addresses/{$AddressId}</uri>
      <method>PUT</method>
      <contentType>JSON</contentType>
      <body>
        {
        "City": "{$City}",
        "CountryCode": "{$CountryCode}",
        "HouseNumber": "{$HouseNumber}",
        "Street": "{$Street}",
        "ZipCode": "{$ZipCode}",
        }
      </body>
      <authentication type="JWT">
        <uri>/authenticate</uri>
        <method>POST</method>
        <contentType>JSON</contentType>
        <body>
          {
            "Username": "{$EMail}",
            "Password": "test"
          }
        </body>
      </authentication>
    </rec>
  </recs>
  <fields>
    <field group="Information" name="City" prompt="City" type="System.String" />
    <field group="Information" name="CountryCode" prompt="Country code" type="System.String" />
    <field group="Information" name="HouseNumber" prompt="House number" type="System.String" />
    <field group="Information" name="Street" prompt="Street" type="System.String" />
    <field group="Information" name="ZipCode" prompt="Zip code" type="System.String" />
    <field group="Information" name="EMail" prompt="E-Mail" type="System.String" />
  </fields>
  <loadingObject>WEBAPI</loadingObject>
  <availableInActivities>
    <activity>Referenzen.CustomerWithCustomerIdAndAddressId</activity>
  </availableInActivities>
</root>

Ergebnisvorlagen

Damit eine Referenz ausgelesen werden kann, muss in den Ergebnisvorlagen definiert sein, von wo der Wert ausgelesen werden soll. Also welcher Wert in der Rückgabe die zu speichernde Referenz enthält.

Es gibt zwei Varianten, wie der ausgelesene Wert in einer Referenz gespeichert wird.

Speichern in einem Aktivitätsfeld

Der Standardweg ist, dass der ausgelesene Wert einer Referenz zugewiesen wird, die in einem Aktivitätsfeld hinterlegt ist. Dafür wird zunächst, wie weiter oben beschrieben, eine Aktivität mit einem Feld vom Typ SuccestReference benötigt. Anschließend muss in der Vorlage ein Record vom Typ Referenz hinzugefügt werden.

Zu beachten ist, dass mit dieser Variante nur ein Wert von der Vorlage in einer Referenz gespeichert werden kann. Nämlich immer nur in der ersten leeren Referenz, die an der Aktivität hinterlegt ist.

Die Ergebnisvorlage im unten folgenden Beispiel erwartet, dass die Anfrage einen HTTP-Status-Code 200 zurückgibt und liest gleichzeitig den Wert des eben angelegten Datensatzes aus (dieses Feld ist auch mit isSuccestReference="true" markiert).

<?xml version="1.0" encoding="utf-8"?>
<root>
  <version>2</version>
  <textTemplateType>ResponseAnalyzisTemplate</textTemplateType>
  <id>2b83f7b7-24b1-4fc2-a937-376b2474ccd6</id>
  <recs>
    <rec isSuccestReference="true" isTrue="true" type="xpath">//contentAsXml//Id/text()</rec>
    <rec isSuccestReference="false" isTrue="true" type="xpath">//statusCode[contains(text(), '200')]</rec>
  </recs>
  <internal.recs>
    <recs line="0" id="//contentAsXml//Id/text()" description="Referenz auslesen" isTrue="true" type="SUCCEST_REFERENCE" filtertype="XPath" variable="" isSuccestReference="true" />
    <recs line="1" id="//statusCode[contains(text(), '200')]" description="Status code 200" isTrue="true" type="FIX_VALUE" filtertype="XPath" variable="" />
  </internal.recs>
  <availableInActivities>
    <activity>Referenzen.Customer</activity>
  </availableInActivities>
  <description></description>
  <fields />
</root>

Speichern in einem Vorlagenfeld

Die zweite Möglichkeit besteht darin, den Namen einer Referenz in einem Vorlagenfeld zu hinterlegen. Dafür benötigt die Vorlage zunächst für jede Referenz ein Feld. Anschließend wird für jede Referenz ein eigenes Feld erstellt. Der zugehörige Record muss nun vom Typ "Variable aus Vorlage" sein und das Flag "Is SuccestReference" muss gesetzt werden. Nun kann man wie gewohnt definieren wo der Wert ausgelesen werden soll.

Bei dieser Variante ist es möglich mehr als einen Wert in einer Referenz zu speichern.

Das folgende Beispiel zeigt eine Ergebnisvorlage, die erwartet, dass die Anfrage einen HTTP-Status-Code 200 zurückgibt und liest gleichzeitig den Id- und den Mail-Wert des eben angelegten Datensatzes aus (diese Felder sind auch mit isSuccestReference="true" markiert).

<?xml version="1.0" encoding="utf-8"?>
<root>
  <version>2</version>
  <textTemplateType>ResponseAnalyzisTemplate</textTemplateType>
  <id>53608610-4250-47a4-895c-dd9b14b165f6</id>
  <recs>
    <rec isSuccestReference="true" isTrue="true" type="xpath" expr="//Id/text()">{$Id}</rec>
    <rec isSuccestReference="false" isTrue="true" type="xpath">//statusCode[contains(text(), '200')]</rec>
    <rec isSuccestReference="true" isTrue="true" type="xpath" expr="//Mail/text()">{$Mail}</rec>
  </recs>
  <internal.recs>
    <recs line="0" id="//Id/text()" description="IDRef" isSuccestReference="true" isTrue="true" type="ADDITIONAL_FIELD" filtertype="XPath" variable="Id" />
    <recs line="1" id="//statusCode[contains(text(), '200')]" description="Status code not 200" isSuccestReference="false" isTrue="true" type="FIX_VALUE" filtertype="XPath" variable="" />
    <recs line="2" id="//Mail/text()" description="MailRef" isSuccestReference="true" isTrue="true" type="ADDITIONAL_FIELD" filtertype="XPath" variable="Mail" />
  </internal.recs>
  <availableInActivities>
    <activity>*</activity>
  </availableInActivities>
  <fields>
    <field group="Referenz" name="Id" prompt="Id" defaultvalue="" type="System.String" />
    <field group="Referenz" name="Mail" prompt="Mail" defaultvalue="" type="System.String" />
  </fields>
</root>

Verwendung von Referenzen im TCE

Im TCE können nun die Referenzen zugewiesen werden.

Dafür müssen Variablen vom Typ SuccestReference definiert werden. Um diese zu initialisieren brauchen sie einen Standardwert, wofür es drei Möglichkeiten gibt:

  • new SuccestReference()
    Initialisiert eine leere Referenz, ohne Namen. Eignet sich nur, wenn die Referenz über ein Aktivitätsfeld zugewiesen wird.
  • new SuccestReference([Wert])
    Initialisiert eine leere Referenz mit dem angegeben Wert als Initalwert. Eignet sich nur, wenn die Referenz über ein Aktivitätsfeld zugewiesen wird.
  • new SuccestReference([Wert], [Name])
    Initialisiert eine Referenz mit dem angegeben Wert und Name. Diese Variante ist Voraussetzung, wenn die Referenz über die Erzeugungsvorlage zugewiesen wird.

Wichtig: Folgende Stichwörter dürfen nicht als Name für die Referenz verwendet werden, da dies sonst zu Fehlern in der Ausführung führt:

  • BaseAddToDate
  • BaseAddToEod
  • ExecutionDateCalculationBase
  • ExpectedOnSpecialcases
  • GenerationTemplateFile
  • Id
  • IsLastStepInTestcase
  • IsSpecialcase
  • Parameters
  • ResponseAnalysisTemplateFile
  • ResultOnSpecialcases
  • StepComment
  • StepName
  • StepNum
  • SystemUri
  • TestCaseId
  • TestStepActivity
  • TimeSlice

Zu beachten ist außerdem, dass bei den Importen für den Testfall der Namespace Succest geladen werden muss.

Referenzen aus Aktivitätsfeldern

Soll die Zuweisung der Referenz über ein Aktivitätsfeld passieren, muss die Referenz-Variable in das Aktivitätsfeld eingetragen werden.

Wichtig: Werte aus der Ergebnisvorlage werden immer in der ersten leeren Referenz gespeichert. Deswegen darf eine Referenz, die über ein Aktivitätsfeld zugewiesen wird nicht mit einem Wert initialisiert werden. Es darf auch vorher kein Wert zugewiesen werden.

Referenzen aus Vorlagenfeldern

Für die Zuweisung über die Ergebnisvorlage gibt es zwei Möglichkeiten, um in der Vorlage Referenzen zu hinterlegen:

  • Variante 1
    Der Name, der bei der Initalisierung der Referenz definiert wurde, wird in das entsprechende Vorlagenfeld geschrieben.
  • Variante 2
    Die Referenzvariable wird mit dem Stichwort "var" in das entsprechende Vorlagenfeld geschrieben.

Wichtig: Sollte eine verwendete Referenz ohne Namen initialisiert werden, wird automatisch ein Name generiert, sobald der Testfall ausgeführt wird. Dieser ist allerdings nicht während der Bearbeitung des Testfalls einsehbar.

Ausgabe in einem Kiosk-Testfall

Um Referenzen in einem Kiosk-Testfall ausgeben zu können, müssen bestimmte Vorraussetzungen getroffen werden. Im folgenden Abschnitt sind diese beschrieben.

Um einen Wert nach der Ausführung eines Kiosk-Testfalls ausgeben zu können, muss dieser als Ausgabe-Argument im TCE definiert werden. Anschließend kann dieser wie eine Variable verwendet werden. Da Argumente jedoch keinen Standardwert besitzen, ist es nötig die Referenz im Testfall zu definieren. Dies geschieht über die Assign-Aktivität. Dort wird einem Ausgabe-Argument vom Typ SuccestReference der Wert new SuccestReference() zugewiesen.

Bei der Ausgabe im Kiosk wird immer der Wert einer Referenz angezeigt. Es ist auch möglich Listen vom Typ SuccestReference ausgeben zu lassen.