我做了什么
我正在使用soapUI(3.6.1 免费版)模拟服务为我正在测试的2 个客户端应用程序提供特定数据。通过一些简单的 Groovy 脚本,我设置了一些模拟操作,以根据客户端应用程序发出的请求从特定文件中获取响应。
模拟响应的静态内容是:
${responsefile}
操作调度脚本窗格中的 groovy 是:
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
}
在此示例中,当客户端应用程序向包含字符串 CategoryA 的模拟服务发出请求时,soapUI 返回的响应是文件 ID_List_CategoryA.xml 的内容
我想要实现的目标
这一切都适用于 groovy 中的绝对路径。现在我想将soapUI项目文件和外部文件的整个集合拉到一个包中,以便于重新部署。从我对soapUI的阅读中,我希望这就像将项目资源根值设置为$ {projectDir}并将我的路径更改为:
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
}
...请记住,soapUI 项目 xml 文件位于 C:/soapProject/
到目前为止我尝试过的
所以,这行不通。我尝试了相对路径的变体:
- ./Test_Files/ID_List_CategoryA.xml
- /Test_Files/ID_List_CategoryA.xml
- Test_Files/ID_List_CategoryA.xml
一篇文章指出soapUI可能将项目文件的父目录视为相对路径的根目录,因此也尝试了以下变体:
- ./soapProject/Test_Files/ID_List_CategoryA.xml
- /soapProject/Test_Files/ID_List_CategoryA.xml
- soapProject/Test_Files/ID_List_CategoryA.xml
当这些都不起作用时,我尝试使用 groovy 脚本中的 ${projectDir} 属性,但是所有这些尝试都失败了,并出现“没有这样的属性:类的模拟服务:脚本 [n]”错误。承认,当我试图这样做时,我真的很摸索。
我尝试使用这篇文章和其他文章中的信息:如何使soapUI附件路径相对?
...没有任何运气。在该帖子的解决方案代码中将“test”替换为“mock”(以及其他更改)导致更多属性错误,例如
testFile = new File(mockRunner.project.getPath())
.. 导致...
No such property: mockRunner for class: Script3
我认为我需要什么
我发现的与此问题相关的帖子都集中在soapUI TestSuites 上。我真的需要一个以 MockService 为中心的解决方案,或者至少阐明如何为 MockServices 而不是 TestSuites 以不同的方式处理它。
任何帮助是极大的赞赏。谢谢。标记。
解决方案 - 由GargantuChet提供
以下包括GargantuChet建议的更改,以解决尝试访问 ${projectDir} 属性的问题,并通过在 groovy 脚本范围内定义新的 projectDir 对象来启用相对路径的使用:
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
}