2016-08-12 1 views
0

Als Voraussetzung für meine Tests muss ich ein großes komplexes Objektmodell erstellen, das später als Argument für eine bestimmte API bereitgestellt wird, um es zu verarbeiten. Werte für das Modell sind Testeingabedaten, die auf der Fitnesse-Seite angezeigt werden.Wie Sie komplexe Composite-Pojo-Objekt in Fitnesse SLIM einrichten?

Das Modell sieht so aus:

class FinalEntity extends DoFixture{ 
    public String field1; 
    public String field2; 
    // More fields.... 
    public String field20; 
    public ArgumentOneEntity argOne; 
    public List<ArgumentTwoEntity> argTwo; 
    // More fields.... 
    //Getters and setters .... 

} 

class ArgumentOneEntity{ 
    public String field1; 
    public String field2; 
    // More fields.... 
    public List<String> argList = new ArrayList(); 
    public List<String> argList1 = new ArrayList(); 

    //Getters and setters .... 
} 

class ArgumentTwoEntity{ 
    public String field1; 
    public String field2; 
    // More fields.... 
    //Getters and setters .... 
} 

Es ist möglich, eine Tabelle zu verwenden, aber es ist extrem inconvinient. Mit FIT war es möglich, so etwas zu tun:

!define argOne (|field1|value1| 
|field2|value2| 
|setArgList;|arg1,arg2,arg3| 
|setArgList1;|arg4,arg5,arg6| 
) 

!define argTwo (|field1|value1| 
|field2|value2| 
) 

|FinalEntity | 
|setField1;|${argOne}| 
|setField2;|${argTwo}| 

es in einigen magischen Weise Tabellen aus Variable erforderlich Frage analysieren würde. Jetzt stellt sich die Frage: Wie funktioniert es mit Slim? Wenn das nicht möglich ist, was sind vernünftige Alternativen, um ein solches Objekt in SLIM zu erstellen, ohne einen riesigen chaotischen Tisch zu erstellen, den niemand versteht.

Optionen, die ich über: 1. Um Testdaten in Dateien in entsprechenden JSON-Objekten zu speichern, analysieren Sie sie und zeigen Sie Geschäftsbenutzer in Fitnesse Seiten. Ich mag es nicht. Da es sehr unpraktisch ist, solche Tests aufrechtzuerhalten, müssen Sie den Test ausführen oder nach einer entsprechenden Datei mit Daten suchen. 2. Um beide Abhängigkeiten für SLIM und FIT hinzuzufügen, um sowohl von slim als auch von fixlibrary zu profitieren. Das hat nicht funktioniert - der Fitnesse-Server würde einfach nicht starten. 3. Gebrauchte Tabelle - das war sehr schmerzhaft und schwer zu pflegen.

Haben Sie eine vernünftige Lösung für dieses Problem?

Keine Notwendigkeit zu sagen, Dinge wie aktualisieren Sie Ihr Modell - ich kann das nicht, oder etwas anderes wie JBehave verwenden - ich würde es gerne tun, außerdem hatte ich positive Erfahrungen mit JBehave in der Vergangenheit, aber bedauerlicherweise in diesem Fall ich bin nicht derjenige, der Entscheidungen über Technologien und Ansätze trifft.

+0

Müssen Sie die Java-Objekte füllen, oder müssen Sie nur eine ordnungsgemäße Anfrage an die API erhalten? Sie geben an, dass Sie posten müssen, sprechen Sie über eine http-Post von JSON, XML oder etwas anderes? –

+0

Java-Objekt wird dann als Modell-Argument an die API übergeben. Als eine Möglichkeit denke ich darüber nach, Variablen in JSON oder XML einzufügen und sie dann als String an Java zu übergeben, und dort kann ich Jackson oder JAXB verwenden, um es zu parsen, aber es sieht ziemlich komisch aus - zu viele Conversion-Aktionen. Daher dachte ich, dass es vielleicht eine einfache Lösung gibt, von der ich nichts weiß, da ich kein Experte in Fitnesse bin. –

Antwort

0

Ich empfehle, sich auf den Aufruf der API zu konzentrieren, anstatt eine POJO-Struktur zu füllen, die nicht wirklich das ist, was Sie testen möchten. Ein POST ist nichts anderes als das Senden einer Zeichenfolge in einem HTTP-Aufruf. Um also einen Test zu schreiben, müssen Sie die richtige Zeichenfolge zum Senden an die API einrichten.

Sie können dies tun, indem Sie einen Java-Client erstellen/generieren und dann aus dem Wiki sein (komplexes) Modell ausfüllen, um den Aufruf zu machen, wie Sie die Frage vorschlagen. Ein anderer Ansatz (den ich empfehle und generic fixtures to support erstellt habe) besteht darin, eine Vorlage des zu postens zu erstellen und das Wiki zu verwenden, um Platzhalter in dieser Vorlage zu füllen. Dann wird kein (API-) spezifischer Java-Code benötigt, mit anderen Worten, es wird kein POJO zu füllen sein.

Die Vorlage kann entweder vollständig im Wiki sein, unter Verwendung eines Slim-Szenarios (wenn feste Platzhalter vorhanden sind) oder in einer separaten Datei, die mit einer Template-Engine gefüllt wird (falls mehr Flexibilität benötigt wird, z als optionale Platzhalter oder Listen variabler Länge). Im letzteren Fall ist die Datenstruktur, die der Templating-Engine die Platzhalter bereitstellt, nur ein Hash/Map mit Schlüsseln und Werten (anstelle eines Pojos mit Gettern und Sätzen). Im ersten Fall werden die Platzhalter als Parameter für das Szenario bereitgestellt.

Szenario Basierend

ein Szenario Mit zwei Anfrage zu generieren, mit Platzhalter für PLZ:

!*> Scenario definition 
!define POST_BODY_2 { {{{ 
<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s11:Body> 
    <ns1:GetCityWeatherByZIP xmlns:ns1="http://ws.cdyne.com/WeatherWS/"> 
     <ns1:ZIP>@{zip}</ns1:ZIP> 
    </ns1:GetCityWeatherByZIP> 
    </s11:Body> 
</s11:Envelope> 
}}} } 

|script|xml http test| 

|scenario |send request _|zip, City              | 
|post   |${POST_BODY_2} |to     |${URL}      | 
|check   |response status|200             | 
|show   |response               | 
|register prefix|weather  |for namespace  |http://ws.cdyne.com/WeatherWS/| 
|check   |xPath   |//weather:City/text()|@{City}      | 
*! 

|send request  | 
|zip |City   | 
|10007|New York  | 
|94102|San Francisco| 

Test output with scenario

Freemarker Template

Durch einen Freemarker mit Vorlage können wir mo haben re dynamic body content (und die Platzhalter werden mit der Methode 'set value for' gefüllt). Mit dieser Vorlage (samplePost.ftl.xml):

<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s11:Body> 
     <ns1:GetWeather xmlns:ns1="http://www.webserviceX.NET"> 
      <#if cityName??> 
      <ns1:CityName>${cityName}</ns1:CityName> 
      </#if> 
      <ns1:CountryName>${countryName}</ns1:CountryName> 
     </ns1:GetWeather> 
    </s11:Body> 
</s11:Envelope> 

Die folgende Wiki erstellt werden können:

!define GLOBAL_WEATHER_URL {http://www.webservicex.com/globalweather.asmx} 
!define GLOBAL_WEATHER_TEMPLATE_NAME {samplePost.ftl.xml} 

!3 Don't send a cityName element: error 

The Freemarker template will not send a cityName element if no value is supplied (the whole element will be omitted, as can be seen in the request below). The service will not like this. 
Omitting the element on a null value could not be done when the body was in the scenario content. 

|script   |xml http test            | 
|template  |${GLOBAL_WEATHER_TEMPLATE_NAME}        | 
|set value  |http://www.webserviceX.NET/GetWeather|for header|SOAPAction | 
|set value  |Canada        |for  |countryName| 
|post template to|${GLOBAL_WEATHER_URL}          | 
|check   |response status      |500     | 
|show   |request              | 
|show   |response             | 

!3 Send a cityName element: success 

When a cityName value is set the enclosing element is sent by the Freemarker template (as visible in the shown request content below), and the SOAP call will succeed. 

|script   |xml http test                 | 
|template  |${GLOBAL_WEATHER_TEMPLATE_NAME}             | 
|set value  |http://www.webserviceX.NET/GetWeather |for header |SOAPAction    | 
|set value  |Canada         |for   |countryName    | 
|set value  |Vancouver International Air-Port, B. C.|for   |cityName     | 
|post template to|${GLOBAL_WEATHER_URL}               | 
|check   |response status      |200          | 
|show   |request                   | 
|show   |response                  | 
|register prefix |wsX         |for namespace|http://www.webserviceX.NET| 
|show   |xPath         |!-//wsX:GetWeatherResult/text()-!  | 

Freemarker based test output

Diese beiden Beispiele veröffentlichen XML aber der gleiche Ansatz kann natürlich , wird auch für JSON-APIs verwendet (ich schlage dann vor, die 'json http test' fixture zu verwenden, die den json-Pfad anstelle von xPath unterstützt, um Assertionen für die erhaltene Antwort zu erstellen).

Wenn komplexere Platzhalter benötigt werden (z. B. Listen variabler Länge) oder Sie Ihre Platzhalter in mehrere geschachtelte Hashes gruppieren möchten (wie bei verschachtelten Objekten in einem POJO-Modell), kann dies auch mit a erreicht werden aufwändigere Schlüsselnamen (zB |set value|[email protected]|for|email.to[1]|)

die oben verwendeten Vorrichtungen können entweder downloaded from GitHub oder über Maven sein:

<dependency> 
    <groupId>nl.hsac</groupId> 
    <artifactId>hsac-fitnesse-fixtures</artifactId> 
    <version>2.7.1</version> 
</dependency> 

Sie können versuchen, ob dieser Ansatz nur für Sie API funktioniert, indem die 'standalone zip' version of the project Herunterladen, entpacken Führen Sie es aus und aktualisieren Sie dann eines von t Die Beispiel-Wiki-Seiten werden mit einer aktualisierten Vorlage an die URL Ihrer API gesendet und führen die Seite/den Test aus.

Verwandte Themen