soapui:Groovy测试步骤:如何从另一个Groovy脚本调用Groovy脚本中的特定方法
在我的项目中,我希望将所有groovy实用程序的测试步骤都放在一个测试用例下,并在需要的地方反复调用它们。如阅读测试数据文件等,我将能够实现,如果下面的问题得到解决。我试了很多方法,但都没成功。欢迎任何帮助 例如 脚本1:test1Scriptsoapui:Groovy测试步骤:如何从另一个Groovy脚本调用Groovy脚本中的特定方法,groovy,soapui,Groovy,Soapui,在我的项目中,我希望将所有groovy实用程序的测试步骤都放在一个测试用例下,并在需要的地方反复调用它们。如阅读测试数据文件等,我将能够实现,如果下面的问题得到解决。我试了很多方法,但都没成功。欢迎任何帮助 例如 脚本1:test1Script def sayHellow(){ log.info "Hello!!" } 脚本2:test2Script import groovy.lang.Binding import groovy.util.GroovyScriptEngine def g
def sayHellow(){
log.info "Hello!!"
}
脚本2:test2Script
import groovy.lang.Binding
import groovy.util.GroovyScriptEngine
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def projectPath = groovyUtils.projectPath
def scriptPath = projectPath + "\\GroovyScripts\\"
//GroovyShell shell = new GroovyShell()
//Util = shell.parse(new File(directoryName + "groovyUtilities.groovy"))
//groovyUtilities gu = new groovyUtilities(Util)
// Create Groovy Script Engine to run the script.
GroovyScriptEngine gse = new GroovyScriptEngine(scriptPath)
// Load the Groovy Script file
externalScript = gse.loadScriptByName("sayHello.groovy")
// Create a runtime instance of script
instance = externalScript.newInstance()
// Sanity check
assert instance!= null
// run the foo method in the external script
instance.sayhellowTest()
当我从另一个脚本调用该方法时,我得到以下异常
groovy.lang.MissingPropertyException:test1Script类没有这样的日志
错误显示groovy运行时调用了您的方法,但它找不到日志
属性。我假设这个log
变量是在test1Script
主体中声明的,例如def log=…
在这种情况下,变量成为其声明范围的局部变量,脚本函数不可见,它可以由注释,也可以不声明(没有类型声明,只有log=…
)。但是,后者要求在运行脚本时通过所谓的绑定传递变量值。因此,根据我上面的假设,您可以将log
变量注释为一个字段,它应该可以工作:
//just for the sake of example it prints to stdout whatever it receives
@groovy.transform.Field
def log = [info: {
println it
}]
def sayHellow() {
log.info "Hello!!"
}
现在,从另一个脚本调用sayHellow
将向标准输出“Hello”:
...
instance.sayHellow()
在被调用的脚本中声明、上下文、testRunner和日志变量非常重要 脚本1:sayHello.groovy
public class groovyUtilities {
def context
def testRunner
def log
def sayhellowTest() {
log.info "Hi i'm arpan"
}
}
脚本2:RunAnotherGroovyScript.groovy
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def projectPath = groovyUtils.projectPath
def scriptPath = projectPath + "\\GroovyScripts\\"
// Create Groovy Script Engine to run the script and pass the location of the directory of your script.
GroovyScriptEngine gse = new GroovyScriptEngine(scriptPath)
// Load the Groovy Script file
externalScript = gse.loadScriptByName("sayHello.groovy")
// Create a runtime instance of script
instance = externalScript.newInstance(context: context, log: log, testRunner: testRunner)
// Sanity check if the instance is null or not
assert instance != null
// run the foo method in the external script
instance.sayhellowTest()
标准输出:
你好,我是阿潘
“我希望将所有groovy实用程序的测试步骤都放在一个测试用例下,并且
在需要的地方一次又一次地给他们打电话,就像读报纸一样
测试数据文件等。”
好的,对我来说,这听起来就像你有一个可重用函数库,并且希望能够从你可能正在运行的任何测试中调用它们
我想您可以将它们存储在另一个测试中,然后从当前运行的测试中调用它们,但是SoapUI提供了一个简洁的特性,您可以将公共函数/库存储在SoapUI项目的“外部”
我有很多这样的Groovy库,我将我的库存储在SoapUI的bin/scripts文件夹下。我通常在正在运行的测试中从脚本断言测试步骤调用公共函数。例如,我有一个getUserDetails类型测试步骤。我可以针对该步骤执行所有常规断言,如有效响应代码、SLA等。然后我可以使用脚本断言测试步骤。这种类型的步骤允许您运行一段Groovy脚本。对于特定的情况,这是可以的,但您不希望粘贴一些常见的内容,因为如果某些内容发生更改,您需要更新每个脚本断言。但您可以调用“外部”groovy脚本。另外,脚本断言步骤只是一个将日志、上下文和消息交换传递到其中的方法,因此不需要实例化自己的脚本断言步骤。只需将它们传递到外部groovy脚本中
所以,作为一个例子
ValidateUser.groovy(存储在bin/scripts/groovyscript/yourOrg/common中)
在感兴趣的测试步骤中,转到断言并创建一个“脚本断言”,从这里您可以实例化外部类并调用一些方法。例如
def validateUserObject = new groovyScripts.yourOrg.common.ValidateUser(log, context, messageExchange);
validateUserObject.runNameCheck();
我喜欢这些外部类型脚本的地方在于,我可以使用我喜欢的任何文本编辑器。另外,当我进行更改并按Save时,SoapUI正在监视脚本文件夹中的更改并重新加载脚本,因此无需重新启动SoapUI。你说得对,我没有在调用的脚本中声明日志变量,这是问题的根源。我也在下面标记了完整的工作解决方案。谢谢你的解决方案。我真的很感激。
def validateUserObject = new groovyScripts.yourOrg.common.ValidateUser(log, context, messageExchange);
validateUserObject.runNameCheck();