WebApi testen

Aus succestWiki
Wechseln zu: Navigation, Suche

Webschnittstellen oder auch Web-API's sind in der heutigen Zeit kaum wegzudenken. Fast jede Webseite besitzt eine oder mehrere Schnittstellen oder nutzt solche, um Daten abzufragen oder andere Systeme mit Daten zu beliefern. Succest kann mit RESTful-API's und somit auch mit OData Schnittstellen interagieren.

Wie Sie mit succest eine Web-API ansprechen und mit Hilfe eines Testfalls eine API mit Daten beliefern können, erfahren sie in diesem Artikel.

Vorraussetzung

Zielsysteme hinterlegen

Um überhaupt einen Testfall gegen eine Web-API ausführen zu können, muss wie bei allen Testfällen erst einmal das entsprechende Zielsystem hinterlegt werden. Ein neues Zielsystem können Sie über einen neuen Eintrag in der LoadingSystemConfiguration anlegen. Das Format für ein Web-API Zielsystem oder ein OData Zielsystem können Sie der Seite LoadingSystemConfiguration entnehmen.

Erzeugungsvorlagen erstellen

Damit das Zielsystem durch den Testfall entsprechend mit Testdaten beliefert werden kann, benötigt es, für die Aktivitäten im Testfall, passende Vorlagen. Da succest aktuell noch keine einfache Verwaltungsoberfläche für Web-API Vorlagen besitzt, müssen Sie die Vorlagen per Hand über den Vorlageneditor im TCR bearbeiten.

Ein Beispiel, wie der Inhalt einer solchen Erzeugungsvorlage ausschaut, können Sie der Seite Web-API Erzeugungsvorlage oder OData Erzeugungsvorlage entnehmen.

Besonderheiten

ContentType: x-www-form-urlencoded

Möchten Sie den ContentType x-www-form-urlencoded verwenden, so muss der Body wie im folgenden Beispiel aufgebaut sein: Hinweis: OData Vorlagen unterstützen aktuell nur den ContentType json.

Username={$Username}&
Password={$Password}

oder

Username={$Username}<![CDATA[&]]>
Password={$Password}

Bei dem Teil, welcher in geschweiften Klammern vorliegt, handelt es sich um Vorlagenfelder. Diese werden über die Aktivität im Testfall mit Daten befüllt und anschließend wird der Wert an der entsprechenden Stelle in der Vorlage hinterlegt.

Wichtig: Bei diesem ContentType müssen die Parameter umbedingt durch ein & oder ein <![CDATA[&]]> voneinander getrennt sein. Fehlt die Trennung, wird succest die Parameter entweder als einen Parameter behandeln oder es wird zu Fehlern führen.

Ergebnisvorlagen

Wie Sie eine Ergebnisvorlage erstellen können, erfahren Sie hier. Mithilfe der Ergebnisvorlage wird die Rückgabe des Zielsystems jeder Testfallschritte auf Erfolg oder Nicht-Erfolg geprüft. Damit Sie die Rückgabe einer Webschnittstelle erfolgreich prüfen können, müssen Sie natürlich wissen, wie eine solche Rückgabe in succest ausschaut und wie Sie diese Filtern können.

Beispiel der Rückgabe einer Webschnittstelle:

<webapi stepId="01B0000000340d9675c31b045c794ca5c3010de13d69d3dc01c2f1b4affb88708d793310442">
<response>
    <content><![CDATA[
	{"AcceptedGDPR":true,"CreditRating":"A","CustomerNumber":"8092583","DateOfBirth":"1994-12-30T00:00:00","DunningBlockTill":"0001-01-01T00:00:00","EMail":"608c8199-35f5-4f16-b95c-001cf353af4f@test.de","FirstName":"Max","Id":"1ece9165-ba3d-4e05-fa94-08d724a84b7a","LastName":"Mustermann","Name":null,"Revision":1,"Telephone":"0123456789","Status":"Standard","Type":"Commercial","ValidFrom":"2019-04-19T00:00:00","ValidTo":"9999-12-31T23:59:59.9999999","VatId":null,"Addresses":[],"PaymentInfos":[]}
    ]]>></content>
    <contentAsXml>
      <root>
        <AcceptedGDPR>true</AcceptedGDPR>
        <CreditRating>A</CreditRating>
        <CustomerNumber>8092583</CustomerNumber>
        <DateOfBirth>2001-01-01T00:00:00</DateOfBirth>
        <DunningBlockTill>0001-01-01T00:00:00</DunningBlockTill>
        <EMail>608c8199-35f5-4f16-b95c-001cf353af4f@test.de</EMail>
        <FirstName>Max</FirstName>
        <Id>1ece9165-ba3d-4e05-fa94-08d724a84b7a</Id>
        <LastName>Mustermann</LastName>
        <Name />
        <Revision>1</Revision>
        <Telephone>0123456789</Telephone>
        <Status>Standard</Status>
        <Type>Commercial</Type>
        <ValidFrom>2019-04-19T00:00:00</ValidFrom>
        <ValidTo>9999-12-31T23:59:59.9999999</ValidTo>
        <VatId />
      </root>
    </contentAsXml>
    <statusCode>200</statusCode>
    <contentLength>-1</contentLength>
    <contentType>application/json; charset=utf-8</contentType>
    <headers>
      <header>
        <name>Transfer-Encoding</name>
        <value>chunked</value>
      </header>
      <header>
        <name>Content-Encoding</name>
        <value></value>
      </header>
      <header>
        <name>Vary</name>
        <value>Accept-Encoding</value>
      </header>
      <header>
        <name>Strict-Transport-Security</name>
        <value>max-age=2592000</value>
      </header>
      <header>
        <name>Content-Type</name>
        <value>application/json; charset=utf-8</value>
      </header>
      <header>
        <name>Date</name>
        <value>Tue, 03 Sep 2019 15:34:28 GMT</value>
      </header>
      <header>
        <name>Server</name>
        <value>Kestrel</value>
      </header>
      <header>
        <name>X-Powered-By</name>
        <value>ASP.NET</value>
      </header>
    </headers>
  </response>
  <request>
    <content><![CDATA[
{
  "AcceptedGDPR": "true",
  "DateOfBirth": "01.01.2001",
  "EMail": "608c8199-35f5-4f16-b95c-001cf353af4f@test.de",
  "FirstName": "Max",
  "LastName": "Mustermann",
  "Telephone": "0123456789",
}
    ]]></content>
    <contentAsXml>
      <root>
        <AcceptedGDPR>true</AcceptedGDPR>
        <DateOfBirth>01.01.2001</DateOfBirth>
        <EMail>608c8199-35f5-4f16-b95c-001cf353af4f@test.de</EMail>
        <FirstName>Max</FirstName>
        <LastName>Mustermann</LastName>
        <Telephone>0123456789</Telephone>
      </root>
    </contentAsXml>
    <headers>
      <header>
        <name>content-type</name>
        <value>application/json</value>
      </header>
    </headers>
  </request>
</webapi>

Um die Rückgabe einer Webschnittstelle zu überprüfen, können in der Ergebnisvorlage unter dem Reiter "Records" verschiedene Kriterien in Form eines XPath, eines Regulären Ausdrucks oder einer Zeichenkette angelegt werden.

Authentifizierung

Manche Webschnittstellen oder manche Abfragen einer Webschnittstelle erfordern im Vorraus eine Authentifizierung, um mit diesen kommunizieren zu können. Folgende Authentifizierung werden aktuell von succest unterstützt:

Basic

Bei der Basic-Authentifizierung muss der Typ der Authentication-Eigenschaft in der Vorlage oder im Zielsystem auf Basic eingestellt werden. Wie eine Basic Authentifizierung in der Vorlage oder im Zielsystem aufgebaut ist, können Sie folgendem Beispiel entnehmen:

Hinweis: Ein OData-Zielsystem unterstützt aktuell lediglich die Basic-Authentifizierung. Die Konfigurationsmöglichkeiten, werden aktuell bei einer OData Schnittstelle nicht unterstützt. Hier muss der Authentication-Tag umbedingt in der LoadingsystemConfiguration hinterlegt werden!

Konfigurationsmöglichkeiten

Ein klarer Vorteil der Konfiguration in der Vorlage, gegenüber der Konfiguration im Zielsystem, ist folgender:

  • Die Vorlage kann Ihre, für die Authentifizierung benötigten Daten, aus dem Testfall bekommen, wohingegen die Konfiguration im Zielsystem statisch ist.
Zielsystemkonfiguration
<!--...-->
<Authentication type="Basic">
          <username>TST</username>
          <password AsCdata="true" Encrypt="true"><![CDATA[[!enc!]AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAuMWgUHTejU69raUXOSTriQQAAAACAAAAAAAQZgAAAAEAACAAAAAOT3dyJguML6jSikq+q5ZO50W2eAMagwuO5btcrLB2tgAAAAAOgAAAAAIAACAAAABw4LiSt6Jscn6yh+zFSAhjmdbsVWVPdYp318xrUgzDcBAAAABLHU3GZTm89Jznmy9DvYq9QAAAAH9FYwZTlg5QUIql+TDyUrOfK3ER6aubdTm0fMTlEWQ4D9NOAdViY9ID6iCqvzhud2aEB7LgRuF62JzWyIEbLBs=[!enc!]]]></password>
</Authentication>
<!--...-->
Erzeugungsvorlage
<!--...-->
<!--Wichtig ist, dass "authentication" im Vergleich zum Zielsystem klein geschrieben wird-->
<authentication type="Basic">
          <username>TST</username>
          <password AsCdata="true" Encrypt="true"><![CDATA[[!enc!]AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAuMWgUHTejU69raUXOSTriQQAAAACAAAAAAAQZgAAAAEAACAAAAAOT3dyJguML6jSikq+q5ZO50W2eAMagwuO5btcrLB2tgAAAAAOgAAAAAIAACAAAABw4LiSt6Jscn6yh+zFSAhjmdbsVWVPdYp318xrUgzDcBAAAABLHU3GZTm89Jznmy9DvYq9QAAAAH9FYwZTlg5QUIql+TDyUrOfK3ER6aubdTm0fMTlEWQ4D9NOAdViY9ID6iCqvzhud2aEB7LgRuF62JzWyIEbLBs=[!enc!]]]></password>
</authentication>
<!--...-->

JWT (Json Web Token)

Bei der JWT-Authentifizierung muss der Typ der Authentication-Eigenschaft in der Vorlage oder im Zielsystem auf JWT eingestellt sein. Bei erfolgreicher Authentifizierung wird von der Schnittstelle ein Token erstellt und an den Client übermittelt. Da jedes Token eine Gültigkeitsdauer besitzt, legt succest die Tokens mit Informationen zum Zielsystem und den hinterlegten Zugangsdaten verschlüsselt ab, um nicht für jede Anfrage ein neues Token anzufordern. Succest prüft vor jedem Testfallschritt, ob valide Tokens für das verwendete Zielsystem vorliegen. Findet succest in der Zwischenablagen gültige Tokens, so werden diese verwendet. Sind keine gültigen Tokens zum Zeitpunkt der Anfrage vorhanden, werden alle ungültigen Tokens gelöscht und neue werden angefordert.

Hinweis: Ein OData-Zielsystem unterstützt aktuell lediglich die Basic-Authentifizierung. Die Konfigurationsmöglichkeiten, werden aktuell bei einer OData Schnittstelle nicht unterstützt. Hier muss der Authentication-Tag umbedingt in der LoadingsystemConfiguration hinterlegt werden!

Konfigurationsmöglichkeiten

Die Authentifizierung an einer Web-API kann über verschiedene Wege konfiguriert werden.

Ein klarer Vorteil der Konfiguration in der Vorlage, gegenüber der Konfiguration im Zielsystem, ist folgender:

  • Die Vorlage kann Ihre, für die Authentifizierung benötigten Daten, aus dem Testfall bekommen, wohingegen die Konfiguration im Zielsystem statisch ist.
Zielsystemkonfiguration

Über die Zielsystemkonfiguration genügt es der Authentication-Konfiguration die Uri-Eigenschaft zu hinterlegen. Die Zugangsdaten müssen hierbei statisch hinterlegt werden.

<!--...-->
  <Loader Name="Susy">
	<Uri>webapi://susy</Uri>
	<BaseUrl>https://webapi-test.net/</BaseUrl>
	<Timeout>5</Timeout>
	<RequestsInParallel>5</RequestsInParallel>
	<Authentication type="JWT">
		<uri>https://webapi-test.net/authenticate</uri>
		<method>POST</method>
		<contentType>json</contentType>
		<body>
		{
		  "Username": "admin@webapi.de",
		  "Password": "test"
		}
		</body>		
	</Authentication>
	<LoaderDirectory>D:\SUCCEST-TCR\TempLoadingFiles\WebApi\snd</LoaderDirectory>
	<LoaderLogfileDirectory>D:\SUCCEST-TCR\TempLoadingFiles\WebApi\rcv</LoaderLogfileDirectory>
	<UseUnixLineFeed>False</UseUnixLineFeed>
	<IsDummyMode>False</IsDummyMode>
	<Encoding>UTF8</Encoding>
  </Loader>
<!--...-->
Erzeugungsvorlage

Über die Erzeugungsvorlage genügt es der Authentication-Konfiguration die Uri-Eigenschaft zu hinterlegen. Die Zugangsdaten können über Vorlagenfelder oder Aktivitätsfelder befüllt oder statisch im Body hinterlegt werden. Es ist bei der Authentication-Uri in der Erzeugungsvorlage irrelevant ob diese mit der BaseUri aus dem Zielsystem übereinstimmt oder nicht, es darf sich hierbei um zwei völlig unterschiedliche URLs handeln.

<!--...-->
<rec>
  <stepId>01B{$RecordIndex:00000000}{$TestCaseId:N}{$Id:N}</stepId>
  <uri>/customers/{$CustomerId}</uri>
  <method>PUT</method>
  <contentType>JSON</contentType>
  <body>
	...
  </body>
  <!--Wichtig ist, dass "authentication" im Vergleich zum Zielsystem klein geschrieben wird-->
  <authentication type="JWT">
	<uri>https://webapi-test.net/authenticate</uri>
	<method>POST</method>
	<contentType>json</contentType>
	<tokenResultProperty>access_token</tokenResultProperty> 
	<body>
	 {
	  "Username": "{$AuthUsername}",
	  "Password": "{$AuthPassword}"
	}
	</body>
  </authentication>
</rec>
<!--...-->
Zielsystem & Erzeugungsvorlage

Über die BaseUrl-Eigenschaft wird der Pfad zu dem zu testenden System hinterlegt. Die Url zur Validierung der Authorisierung erfolgt durch die Kombination der BaseUri & der Uri der Erzeugungsvorlage. Wichtig dabei ist es, in der Uri-Eigenschaft der Erzeugungsvorlage keine komplette Uri anzugeben.

  <!--...-->
  <Loader Name="Susy">
	<Uri>webapi://susy</Uri>
	<BaseUrl>https://webapi-test.net/</BaseUrl>
	<Timeout>5</Timeout>
	<RequestsInParallel>5</RequestsInParallel>
	<LoaderDirectory>D:\SUCCEST-TCR\TempLoadingFiles\WebApi\snd</LoaderDirectory>
	<LoaderLogfileDirectory>D:\SUCCEST-TCR\TempLoadingFiles\WebApi\rcv</LoaderLogfileDirectory>
	<UseUnixLineFeed>False</UseUnixLineFeed>
	<IsDummyMode>False</IsDummyMode>
	<Encoding>UTF8</Encoding>
  </Loader>
<!--...-->
  <!--...-->
  <rec>
	  <stepId>01B{$RecordIndex:00000000}{$TestCaseId:N}{$Id:N}</stepId>
	  <uri>/customers/{$CustomerId}</uri>
	  <method>PUT</method>
	  <contentType>JSON</contentType>
	  <body>
		...
	  </body>
	  <authentication type="JWT">
		<uri>/authenticate</uri>
		<method>POST</method>
		<contentType>json</contentType>
		<tokenResultProperty>access_token</tokenResultProperty> 
		<body>
		 {
		  "Username": "{$AuthUsername}",
		  "Password": "{$AuthPassword}"
		}
		</body>
	  </authentication>
</rec>
<!--...-->

Die vollständige Uri zur Authorisierung wird dabei aus der BaseUri des Zielsystems & der Authentication-Uri der Erzeugungsvorlage gebildet. Schauen wir uns das Beispiel an, schaut die vollständige Uri wie folgt aus: https://webapi-test.net/authenticate

Besonderheiten

Da es von Schnittstelle zu Schnittstelle unterschiedlich sein kann, wie die Rückgabe der Authentifizierung-Anfrage ausschaut, gibt es die Möglichkeit der Erzeugungsvorlage oder dem Zielsystem zu sagen, in welcher Eigenschaft der Rückgabe sich das Token befindet. Folgende Beispiele sollen dies näher erläutern:

  • "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZlMzYyNjNkLWExYzUtNDUzZi1iYmNjLTNlYmY3ZGNiMzFhYSIsInJvbGUiOiJBZG1pbmlzdHJhdG9yIiwibmJmIjoxNTY3NjgwMjIxLCJleHAiOjE1NjgyODUwMjEsImlhdCI6MTU2NzY4MDIyMX0.DkUc_3Kyjb7QzKdMiPxVhTQo1aAbaFS6_CRtYAbvWS0"

In diesem Beispiel muss nichts weiter konfiguriert werden, da das Token von der Schnittstelle einfach zurückgegeben wird.

  • {
    	"access_token": "eyJ0eXAiOiJKV1QiLCJraWQiOiJic2hfaWRwXzIwMTZfMSIsImFsZyI6IkhTMzg0In0.eyJleHAiOjE1NjQ1ODY4MzUsImlzcyI6Imh0dHA6Ly90ZXN0U2VpdGUub3JnIiwiYXVkIjoiaXNwIn0.9o-vrtyhot-ysgyhSUriehjNNDKRKMkDhju6z2dTQ1IZ4B1_QxMC9TyFBRk4H2_D",
    	"token_type": "Bearer"
    }
    

In diesem Beispiel ist es notwendig succest mitzuteilen, in welcher Eigenschaft sich das Token befindet. Um succest die Eigenschaft mitzuteilen, genügt es, der Authentication-Konfiguration in der Erzeugungsvorlage oder dem Zielsystem die Eigenschaft tokenResultProperty hinzuzufügen.

<authentication type="JWT">
	<uri>https://webapi-test.org</uri>
	<method>POST</method>
	<contentType>json</contentType>
	<tokenResultProperty>access_token</tokenResultProperty>
	<body>
	{
	  "login": "max.mustermann@test.de",
	  "password": "test"
	}
	</body>
</authentication>

Protokollierung

Zur Nachverfolgung protokolliert succest verschiedene Aktionen beim Aufruf einer Webschnittstelle.