在我的项目中,我想在一个测试用例下保留所有常规实用程序测试步骤,并在需要时再次调用它们。就像阅读测试数据文件等一样,如果解决了以下问题,我将能够实现这一点。我尝试了很多方法,但无法做到。欢迎任何帮助!!
例如
脚本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: No such log for class test1Script
该错误显示groovy运行时调用您的方法,但它找不到log
属性。我假设这个log
变量在test1Script
体中声明,例如def log = ...
在这种情况下,变量变为其声明范围的本地变量,并且它对脚本函数不可见。 To make it visible,它可以由@Field注释,或者它应该是未声明的(没有类型声明,只有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”打印到stdout:
...
instance.sayHellow()
在被调用脚本中声明,context,testRunner和Log变量非常重要。
脚本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()
Standoutput:
Hi i'm arpan
“我想在一个测试用例下保留所有常规实用程序测试步骤,并在需要的地方一次又一次地调用它们。就像读取测试数据文件等一样。”
好吧,对我来说,这听起来就像你有一个可重复使用的函数库,并希望能够从你可能正在运行的任何测试中调用它们。
我想你可以用另一个测试存储它们,然后从你当前正在运行的测试中调用它们,但是SoapUI带有一个简洁的功能,你可以在SoapUI项目的“外部”存储你的常用功能/库。
我有很多这样的Groovy库,我将它存储在SoapUI的bin / scripts文件夹下。我通常在我正在运行的测试中调用脚本断言测试步骤中的常用函数。例如,我有一个getUserDetails类型测试步骤。我可以对有效响应代码,SLA等步骤执行所有常规断言。然后我可以使用脚本断言测试步骤。这种类型的步骤允许您运行一大块Groovy脚本。对于特定情况,这是可以的,但是您不希望粘贴一些常见内容,因为如果有更改,您需要更新每个脚本断言。但你可以称之为“外部”的groovy脚本。此外,Script Assertion步骤只是一个传递日志,上下文和消息交换的方法,因此无需实例化您自己的。只需将它们传递给外部groovy脚本......
所以,举例说明......
ValidateUser.groovy(存储在bin / scripts / groovyScripts / yourOrg / common中)
package groovyScripts.yourOrg.common; // Package aligns with folder it's stored in.
Class ValidateUser {
def log = null;
def context = null;
def messageExchange = null;
// Constructor for the class
ValidateUser(logFromTestStep, contextFromTestStep, messageExchangeFromTestStep) {
// Assign log, context and messageExchange to the groovy class.
this.log = logFromTestStep;
this.context = contextFromTestStep;
this.messageExhange = messageExchangeFromTestStep;
}
def runNameCheck() {
// Performs some validation. You have access to the API response via
// this.messageExchange
log.info("Running the Name Check");
}
}
在感兴趣的测试步骤中,转到断言并创建“脚本断言”从此处可以实例化外部类并调用某些方法。例如。
def validateUserObject = new groovyScripts.yourOrg.common.ValidateUser(log, context, messageExchange);
validateUserObject.runNameCheck();
我喜欢这些外部类型的脚本是我可以使用我喜欢的任何文本编辑器。此外,当我进行更改并按Save时,SoapUI正在监视脚本文件夹中的更改并重新加载脚本,因此无需重新启动SoapUI。