2012-09-04 12 views
6

quello che ho fatto

Sto usando soapUI (3.6.1 Free version) servizi finte per servire il backup di dati specifici a 2 applicazioni client Sono test . Con un semplice script Groovy ho impostato alcune operazioni di simulazione per recuperare le risposte da file specifici in base alle richieste fatte dalle applicazioni client.Come posso utilizzare i percorsi relativi ai file di risposta esterni per soapUI MockService

I contenuti statici della risposta finto è:

${responsefile} 

Il groove nel riquadro spedizione scripting operazione è:

def req = new XmlSlurper().parseText(mockRequest.requestContent) 
if (req =~ "CategoryA") 
{ 
    context.responsefile = new File("C:/soapProject/Test_Files/ID_List_CategoryA.xml").text 
} 
else 
{ 
    context.responsefile = new File("C:/soapProject/Test_Files/ID_List_CategoryB.xml").text 
} 

In questo esempio, quando l'applicazione client emette una richiesta al servizio di simulazione che contiene la stringa CategoryA, la risposta restituita da soapUI è il contenuto del file ID_List_CategoryA.xml

Quello che sto cercando di Achiev e

Questo funziona perfettamente con i percorsi assoluti nel groovy. Ora voglio estrarre l'intera raccolta di file di progetto soapUI e file esterni in un pacchetto per una facile re-implementazione. Dalla mia lettura su soapUI Speravo che questo sarebbe facile come impostare il valore Root Resource progetto per $ {} ProjectDir e cambiare i miei percorsi:

def req = new XmlSlurper().parseText(mockRequest.requestContent) 
if (req =~ "CategoryA") 
{ 
    context.responsefile = new File("Test_Files/ID_List_CategoryA.xml").text 
} 
else 
{ 
    context.responsefile = new File("Test_Files/ID_List_CategoryB.xml").text 
} 

... tenendo presente che risiede il file xml del progetto soapUI in C:/soapProject/

quello che ho provato finora

Quindi, questo non funziona. Ho provato variazioni di percorsi relativi:

  • ./Test_Files/ID_List_CategoryA.xml
  • /Test_Files/ID_List_CategoryA.xml
  • Test_files/ID_List_CategoryA.xml

Un posto indicato che soapUI potrebbe considerare la directory padre dei file di progetto come la radice per gli scopi del percorso relativo, quindi ho provato anche le seguenti variazioni:

  • ./soapProject/Test_Files/ID_List_CategoryA.xml
  • /soapProject/Test_Files/ID_List_CategoryA.xml
  • soapProject/Test_files/ID_List_CategoryA.xml

Quando niente di tutto questo ha funzionato Ho provato a fare uso del $ {projectDir} proprietà nello script groovy, ma tutti questi tentativi non sono riusciti con un errore "No such property: mockService for class: Script [n]". Ammettiamolo, stavo davvero armeggiando quando provavo a farlo.

Ho provato ad utilizzare le informazioni da questo post e altri: How do I make soapUI attachment paths relative?

... senza alcuna fortuna. Sostituendo "test" con "mock" (tra le altre modifiche), nel codice della soluzione di quel post si sono verificati più errori di proprietà, ad es.

testFile = new File(mockRunner.project.getPath()) 

.. portato a ...

No such property: mockRunner for class: Script3 

Quello che penso di aver bisogno

I posti che ho trovato relative a questo problema tutti si concentrano sul soapUI suite di test. Ho davvero bisogno di una soluzione che sia centrata su MockService o almeno chiarisca come possa essere gestita in modo diverso per MockServices rispetto a TestSuites.

Qualsiasi aiuto è molto apprezzato. Grazie. Marchio.

La soluzione - Fornito da GargantuChet

Di seguito include le modifiche suggerite da GargantuChet per risolvere il problema di cercare di accedere al $ {ProjectDir} proprietà e consentire l'utilizzo di percorsi relativi definendo un nuovo oggetto ProjectDir all'interno il campo di applicazione dello script Groovy:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 
def projectDir = groovyUtils.projectPath 

def req = new XmlSlurper().parseText(mockRequest.requestContent) 
if (req =~ "CategoryA") 
{ 
    context.responsefile = new File(projectDir, "Test_Files/ID_List_CategoryA.xml").text 
} 
else 
{ 
    context.responsefile = new File(projectDir, "Test_Files/ID_List_CategoryB.xml").text 
} 

risposta

7

io non sono a conoscenza Groovy, ma suppongo che il File è un normale java.io.File istanza.

I percorsi relativi vengono interpretati come relativi alla directory corrente dell'applicazione. Provare qualcosa di simile alla seguente per verificare:

def defaultPathBase = new File(".").getCanonicalPath() 
println "Current dir:" + defaultPathBase 

Se questo è il caso qui, quindi si consiglia di utilizzare il costruttore new File(String parent, String child), passando la directory di risorse come primo argomento e il relativo percorso come la seconda.

Ad esempio:

// hardcoded for demonstration purposes 
def pathbase = "/Users/chet" 
def content = new File(pathbase, "Desktop/sample.txt").text 

println content 

Ecco il risultato dell'esecuzione dello script:

Chets-MacBook-Pro:Desktop chet$ groovy sample.groovy 
This is a sample text file. 

It will be displayed by a Groovy script. 
Chets-MacBook-Pro:Desktop chet$ groovy sample.groovy 
This is a sample text file. 

It will be displayed by a Groovy script. 

Chets-MacBook-Pro:Desktop chet$ 
+0

Cercando il tuo esempio di calci codificati ha comportato il seguente errore: 'Impossibile inviare tramite script; groovy.lang.MissingMethodException: Nessuna firma del metodo: Script27.var() è applicabile per i tipi di argomento: (java.lang.String) valori: [C:/soapProject] Soluzioni possibili: wait(), run(), run(), every(), any(), wait (long) ' – Mark

+0

_Sorry su Reposts. Non ho capito che la formattazione nelle risposte ai commenti sarebbe stata così problematica. Siccome soapUI non ha il visualizzatore di console, ho modificato il tuo primo suggerimento per registrare il DefaultPathBase: 'log.info" Dir corrente: "+ defaultPathBase" As sospettate, ha registrato la directory dell'applicazione soapUI. Poi ho provato a vedere se potevo registrare il valore della proprietà $ {projectDir}: 'log.info" Dir progetti: "+ projectDir' Ho ricevuto il seguente errore:' Impossibile inviare tramite script; groovy.lang.MissingPropertyException: Nessuna proprietà del genere: projectDir per la classe: Script26' – Mark

+0

'projectDir' potrebbe non essere definito nello script/scope corrente. A quanto pare si può fare riferimento usando ['def groovyUtils = new com.eviware.soapui.support.GroovyUtils (context); def projectDir = groovyUtils.projectPath; log.info (projectDir) '] [1], che è probabilmente il metodo approvato da Groovy. Prenderò una copia di Groovy e capirò cosa c'è che non va nell'esempio hard-coded. [1] http://www.webservices-testing.com/2011/10/project-path-using-groovy-in-soapui.html – GargantuChet

6

Si potrebbe avere anche fatto quanto segue per ottenere il valore di ProjectDir:

def projectDir = context.expand('${projectDir}'); 
+0

Questo non funziona in uno script di caricamento del progetto "step" - sono disponibili solo gli oggetti "log" e "project". –

+0

Aggiornamento del mio commento: funzionerà se chiami: def context = project.getContext() e poi esegui quanto sopra. –

Problemi correlati