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

问题描述 投票:1回答:3

在我的项目中,我想在一个测试用例下保留所有常规实用程序测试步骤,并在需要时再次调用它们。就像阅读测试数据文件等一样,如果解决了以下问题,我将能够实现这一点。我尝试了很多方法,但无法做到。欢迎任何帮助!!

例如

脚本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 soapui
3个回答
1
投票

该错误显示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()

0
投票

在被调用脚本中声明,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

0
投票

“我想在一个测试用例下保留所有常规实用程序测试步骤,并在需要的地方一次又一次地调用它们。就像读取测试数据文件等一样。”

好吧,对我来说,这听起来就像你有一个可重复使用的函数库,并希望能够从你可能正在运行的任何测试中调用它们。

我想你可以用另一个测试存储它们,然后从你当前正在运行的测试中调用它们,但是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。

© www.soinside.com 2019 - 2024. All rights reserved.