Получить количество попыток из ожидания до успешного завершения ключевого слова

#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 ключевое слово, но также вернуть количество попыток.