2012-09-04 18 views
6

lo que he hecho

estoy usando soapUI (3.6.1 Versión gratuita) Servicios de simulacros para servir a los datos específicos de aplicaciones cliente 2 Soy la prueba . Con algunas secuencias de comandos simples de Groovy, he configurado algunas operaciones simuladas para obtener respuestas de archivos específicos en función de las solicitudes realizadas por las aplicaciones del cliente.¿Cómo puedo usar rutas relativas a los archivos de respuesta externos para soapUI MockService

Los contenidos estáticos de la respuesta simulada es:

${responsefile} 

El maravilloso en el panel de despacho scripting operación es:

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 
} 

En este ejemplo, cuando la aplicación cliente emite una solicitud a la simulacro de servicio que contiene la cadena CategoryA, la respuesta devuelta por soapUI es el contenido del archivo ID_List_CategoryA.xml

Lo que estoy tratando de lograr e

Todo esto funciona bien con los caminos absolutos en el groovy. Ahora quiero extraer toda la colección del archivo de proyecto soapUI y los archivos externos en un paquete para una fácil implementación. De mi lectura sobre soapUI yo esperaba que esto sería tan fácil como configurar el valor de la raíz de Recursos proyecto para $ {} projectdir y cambiar mis caminos a:

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 
} 

... teniendo en cuenta que los que reside el archivo XML de proyectos soapUI en C:/soapProject/

Lo que he probado hasta ahora

por lo tanto, eso no funciona. He intentado variaciones de rutas relativas:

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

Un puesto indicó que soapUI podría considerar el directorio primario de los archivos del proyecto como la raíz para los propósitos de la ruta relativa, así que probé las siguientes variaciones también:

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

Cuando nada de eso funcionó He intentado hacer uso de la $ {projectDir} propiedad en la secuencia de comandos groovy, pero todos los intentos fallaron con un error "No such property: mockService for class: Script [n]". Admittefly, realmente estaba buscando algo al intentar hacer eso.

He intentado utilizar la información de este post y otros: How do I make soapUI attachment paths relative?

... sin ninguna suerte. Reemplazar "prueba" con "simulación" (entre otros cambios) en el código de la solución de esa publicación resultó en más errores de propiedad, p.

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

.. llevado a ...

No such property: mockRunner for class: Script3 

Lo que yo creo que necesite

Los mensajes que he encontrado en relación con este tema se centran en soapUI bancos de pruebas. Realmente necesito una solución que esté centrada en MockService o al menos arroje algo de luz sobre cómo se puede manejar de forma diferente para MockServices en lugar de TestSuites.

Cualquier ayuda es muy apreciada. Gracias. Marca.

La Solución - Proporcionado por GargantuChet

Lo que sigue incluye los cambios sugeridos por GargantuChet para resolver el problema de tratar de acceder al $ {projectdir} propiedad y permitir el uso de rutas relativas mediante la definición de un nuevo objeto projectdir dentro el alcance del guión maravilloso:

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 
} 

Respuesta

7

no estoy familiarizado con Groovy, pero asumo la Filejava.io.File es una instancia normal.

Las rutas relativas se interpretan como relativas al directorio actual de la aplicación. Pruebe algo como lo siguiente para verificar:

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

Si este es el caso aquí, entonces es posible que desee utilizar el constructor new File(String parent, String child), pasando su directorio de recursos como primer argumento y la ruta relativa como el segundo.

Por ejemplo:

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

println content 

Aquí es el resultado de ejecutar la secuencia de comandos:

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

Tratando su ejemplo codificado para patadas resultó en el siguiente error: 'No se pudo enviar utilizando script; groovy.lang.MissingMethodException: sin firma del método: Script27.var() es aplicable para tipos de argumentos: (java.lang.String) values: [C:/soapProject] Posibles soluciones: wait(), run(), run(), every(), any(), wait (long) ' – Mark

+0

_Sorry about Reposts. No me di cuenta de que el formateo en las respuestas de comentarios sería tan problemático. Como soapUI no tiene visor de consola, cambié la primera sugerencia para registrar el valor predeterminado de DefaultBathBase: 'log.info" Dir actual: "+ defaultPathBase. As usted sospechaba, registró el directorio de la aplicación soapUI. Luego traté de ver si podía registrar el valor de la propiedad $ {projectDir}: 'log.info" Dir del proyecto: "+ projectDir' Obtuve el siguiente error:' No se pudo enviar usando script; groovy.lang.MissingPropertyException: No existe dicha propiedad: projectDir for class: Script26' – Mark

+0

'projectDir' puede no estar definido en el script/scope actual. Aparentemente, puede hacer referencia usando ['def groovyUtils = new com.eviware.soapui.support.GroovyUtils (context); def projectDir = groovyUtils.projectPath; log.info (projectDir) '] [1], que probablemente sea el método aprobado por Groovy. Voy a tomar una copia de Groovy y averiguar qué pasa con el ejemplo codificado. [1] http://www.webservices-testing.com/2011/10/project-path-using-groovy-in-soapui.html – GargantuChet

6

También podría haber hecho lo siguiente para obtener el valor de projectdir:

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

Esto no funcionará en un "paso" de script de carga de proyecto; solo están disponibles los objetos "log" y "project". –

+0

Actualizando mi comentario: funcionará si llamas: def context = project.getContext() y luego ejecutas lo anterior. –

Cuestiones relacionadas