#groovy #soapui
#groovy #soapui
Вопрос:
У меня есть один тестовый пример, который вызывается (запускается и завершается) перед каждым запуском других тестовых примеров. Это что-то вроде тестового примера «подготовка тестовых данных». Результатом этого тестового примера является список с некоторыми элементами, список выглядит следующим образом:
def list = ['Login', 'Get Messages', 'Logout', etc.]
Список отличается при каждом запуске. Мне нужно перенести этот список из тестового примера «подготовка тестовых данных» в другие тестовые примеры. Перенос будет осуществляться между двумя скриптами Groovy.
Как перенести список между двумя этапами Groovy test в SoapUI?
Комментарии:
1. Формулировка вашего вопроса наводит меня на мысль, что вы ищете какую-то устоявшуюся «наилучшую практику». Я не думаю, что это существует. Если вы просто ищете наиболее удобное для вас решение, возможно, я смогу помочь вам с ответом.
2. @Steen, я буду рад любому рабочему решению
Ответ №1:
Насколько я понимаю:
- У вас есть один тестовый набор, который вы вызываете из любого другого тестового набора.
- Я предполагаю, что это делается с помощью тестового шага «Запустить TestCase»?
- Вы хотели бы иметь возможность передавать список строк
- Как я прочитал, параметры идут в одну сторону. Из «внешнего тестового набора» и обратно в вызывающий тестовый набор. Нет «ввода» из каждого тестового набора в этот «внешний тестовый набор»?
Скрипт Groovy в вашем «external testcase» может затем сгенерировать результат String, который, в свою очередь, может быть преобразован во что-то вроде массива или ArrayList строк. Это может быть строка со значениями, разделенными ;
def result = ""
result = "Entry1;"
result = "Entry2;"
result = "Entry3;"
// You may want to add a line of code that removes the last ;
return result
Затем этот результат будет легко получен из скриптов Groovy в другом месте, путем добавления нескольких строк кода.
Если скрипт Groovy размещен в другом тестовом наборе, но в том же TestSuite, вы можете получить результат с помощью:
def input = testRunner.testCase.testSuite.getTestCaseByName("Name of TestCase").getTestStepByName("Groovy Script Name").getPropertyValue("result")
Если он помещен в TestCase в другом TestSuite, вы можете использовать:
def input = testRunner.testCase.testSuite.project.getTestSuiteByName("Test Suite Name").getTestCaseByName("Test Case Name").getTestStepByName("Groovy Script Name").getPropertyValue("result")
а затем повторите ввод, выполнив что-то вроде:
for (def s : input.split(";")) {
log.info s
// Do your stuff here
}
Я надеюсь, что это имеет смысл …? 🙂
Ответ №2:
с шага groovy 1 вы должны вернуть список:
def list = ['Login', 'Get Messages', 'Logout']
return list
из шага groovy 2 вы можете получить этот возвращаемый список
def result = context.expand( '${Groovy Script 1#result}' )
list = result.tokenize('[,] ')
list.each{
log.info it
}
обратите внимание, что вы получаете строку, которую вам нужно преобразовать обратно в список (маркировать).
Я сделал это с SOAPUI pro. Другим способом (некрасивым) было бы сохранить список в пользовательском свойстве в скрипте groovy 1 (используя TestRunner.TestCase.setPropertyValue(«myList»,list.toString()) и восстановить его на шаге groovy 2 (TestRunner.TestCase.GetPropertyValue(«myList»)
Я надеюсь, что это поможет
РЕДАКТИРОВАТЬ: если элементы списка содержат пробелы
это не очень чисто, и я надеюсь, что кто-нибудь поможет предоставить что-то лучшее, но вы можете сделать следующее :
list = "['Login - v1', 'Get Messages - v2', 'Logout - v1']"
list = list.replace(''','"')
def jsonSlurper = new groovy.json.JsonSlurper()
list = jsonSlurper.parseText(list)
list.each{
log.info it
}
Алекс
Комментарии:
1. Спасибо, передача работает должным образом, но когда я получу список, который выглядит следующим образом:
['Login - v1', 'Get Messages - v2', 'Logout - v1']
тогдаtokenize('[,] ')
он не будет работать должным образом. Это разделяет его на большее количество элементов. И если я попытаюсь использовать это:tokenize('[,]')
тогда мне нужно использовать элементы с.trim()
, потому что перед каждым элементом есть пробел.2. ах, это действительно проблема … Я добавлю немного кода