#robotframework #built-in
#robotframework #встроенный
Вопрос:
Мы используем Robot Framework для тестирования довольно подверженного ошибкам компонента, который мы не можем отладить. Этот компонент ведет себя несколько неустойчиво, так что в нескольких местах мы используем ключевое Wait Until Keyword Succeeds 10x 1s Connect Via SSH
слово для повторной попытки несколько раз, хотя оно должно сработать с первой попытки.
Нет, было бы здорово получить количество попыток ключевого слова, чтобы оно выдавало предупреждающее Log
сообщение в случае, если требуется более одной попытки.
Следующий фрагмент иллюстрирует, чего я хотел достичь:
${result} ${noRetries}= Wait Until Keyword Suceeds with Return 10x 1s Connect Via SSH
Run Keyword If ${noRetries}>1 Log ${noRetries} were necessary for Connect Via SSH level=WARN
Есть ли способ легко достичь этого с помощью Robot Framework?
Комментарии:
1. Не с помощью ключевого слова vanilla — оно возвращает только результат вызываемого ключевого слова; на самом деле это делает:
return self.run_keyword(name, *args)
, внутри блока try-catch . Возможно, вы захотите создать пользовательское ключевое слово или метод python, который возвращает вам как результат (ы), так и количество повторных попыток.
Ответ №1:
Я бы создал ключевое слово более высокого уровня, содержащее ключевое слово, которое является ненадежным, и увеличил бы попытки внутри него.
Редактировать.обновленный ответ с примером пользовательской библиотеки (вариант B)
Библиотечное решение делает файл робота намного чище, потому что сложность передается на сторону Python.
вариант A.
Использование тестовой переменной Robot Framework.
*** Settings ***
Test Setup Set Test Variable ${KW_RUNS} ${0}
*** Keywords ***
Flaky Keyword
Set Test Variable ${KW_RUNS} ${KW_RUNS 1}
Connect Via SSH
*** Test Cases ***
Trying something here
${result} Wait Until Keyword Succeeds 10 1s Flaky Keyword
Run Keyword If ${KW_RUNS}>1 Log ${KW_RUNS} were necessary for Connect Via SSH level=WARN
вариант B.
Использование пользовательской библиотеки Robot Framework.
flakylib.py
import time
from robot.libraries.BuiltIn import BuiltIn
KW_RUNS = 0
def custom_kw_runner(name, *args):
global KW_RUNS
KW_RUNS = 1
return BuiltIn().run_keyword_and_return_status(name, *args)
def run_flaky_kw(retries=10, interval=1, name="", *args):
global KW_RUNS
KW_RUNS = 0
status = False
for _ in range(retries):
status = custom_kw_runner(name, *args)
if bool(status):
break
time.sleep(interval)
if not bool(status):
raise AssertionError(
f"Keyword '{name}' failed after retrying for {retries*interval} seconds."
)
if bool(status) and KW_RUNS > 1:
BuiltIn().log(f"{KW_RUNS} runs were necessary for '{name}'", level="WARN")
return status, KW_RUNS
withlib.robot
*** Settings ***
Library flakylib.py
*** Test Cases ***
Trying something here
${status} ${runs}= Run Flaky KW name=Connect Via SSH
Комментарии:
1. Спасибо за быстрый ответ. Я использую Wait, пока ключевое слово не завершится успешно, довольно часто. Возможно, есть и более общее решение, но я действительно не знаю, как это сделать. Тем не менее, большое спасибо за ваше решение, оно, по крайней мере, работает. 🙂
2. Хорошо, что это работает 🙂 Другим решением было бы создать собственную пользовательскую библиотеку с ключевым словом, которое в основном выполняло бы то, что я опубликовал в моем примере.
3. С опцией 2 вызывающий не получит возвращаемое значение (значения) вызываемого ключевого слова, что может потребоваться во многих случаях. Наиболее надежным подходом было бы переопределить
wait_until_keyword_succeeds
ключевое слово, но также вернуть количество попыток.