soapui:Groovy测试步骤:如何从另一个Groovy脚本调用Groovy脚本中的特定方法

soapui: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

在我的项目中,我希望将所有groovy实用程序的测试步骤都放在一个测试用例下,并在需要的地方反复调用它们。如阅读测试数据文件等,我将能够实现,如果下面的问题得到解决。我试了很多方法,但都没成功。欢迎任何帮助

例如

脚本1:test1Script

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();