Soap UI: Groovy Test Step: как вызвать определенный метод в Groovy-скрипте из другого Groovy-скрипта - PullRequest
0 голосов
/ 23 февраля 2019

В моем проекте я хочу, чтобы все этапы тестирования 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: No such log for class test1Script

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Очень важно объявить, 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 голосов
/ 25 февраля 2019

"Я хочу, чтобы все этапы тестирования Groovy утилит находились под одним тестом, и вызывать их снова и снова, когда это необходимо. Например, чтение файла тестовых данных и т. Д."

Итак, для меня это просто звучит так, как будто у вас есть библиотека многократно используемых функций и вы хотите иметь возможность вызывать их из любого теста, который вы можете запускать.

Я полагаю, вы можете сохранить их с другим тестом, а затем вызватьони из теста, который вы в настоящее время выполняете, но SoapUI поставляется с удобной функцией, заключающейся в том, что вы можете хранить ваши общие функции / библиотеки «вне» проекта SoapUI.

У меня есть много таких библиотек Groovy, и яхраните мой в папке bin / scripts SoapUI.Обычно я вызываю общие функции из шага проверки утверждения Script в тесте, который я выполняю.Например, у меня есть шаг теста типа getUserDetails.Я могу сделать все обычные утверждения против шага, такие как действительный код ответа, SLA и т. Д. Затем я могу использовать шаг теста проверки скрипта.Этот тип шага позволяет вам запускать фрагмент скрипта Groovy.Это нормально для определенных случаев, но вы не хотите вставлять что-то общее, так как вам нужно обновлять каждое утверждение Script, если что-то меняется.Но вы можете назвать «внешний» заводной скрипт.Кроме того, шаг «Утверждение сценария» - это просто метод, в который передаются журнал, контекст и обмен сообщениями, поэтому нет необходимости создавать свой собственный экземпляр.Просто передайте их во внешний скрипт 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();

Что мне нравится в этих сценариях внешнего типа, так это то, что я могу использовать любой текстовый редактор, который мне нравится.Кроме того, когда я делаю изменение и нажимаю Сохранить, SoapUI отслеживает изменения в папке сценариев и перезагружает сценарий, поэтому нет необходимости перезапускать SoapUI.

0 голосов
/ 23 февраля 2019

Ошибка показывает, что Groovy Runtime вызывает ваш метод, но не может найти свойство log.Я предполагаю, что эта log переменная объявлена ​​в теле test1Script, например, def log = .... В этом случае переменная становится локальной для своей области объявления и не видна функциям скрипта. Чтобы сделать его видимым , его можно аннотировать с помощью @ 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" на стандартный вывод:

...
instance.sayHellow()
...