从“等待关键字成功”获取重试次数

问题描述

我们正在使用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 消息。

以下代码片段说明了我想要实现的目标:

class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,verbose_name="Maker's Signature",on_delete=models.CASCADE,related_name="makerSignature",blank=True,null=True,)
                                  ^^^^
   user_checker = models.ForeignKey(User,verbose_name="Checker's Signature",related_name="checkerSignature",null=True)
                                   ^^^^^
   user_signer = models.ForeignKey(User,verbose_name="Signer's Signature",related_name="signerSignature",null=True)
                                   ^^^^

是否可以通过Robot Framework轻松实现这一目标?

解决方法

我将创建一个更高级的关键字,其中包含易碎的关键字,并尝试在其中进行递增操作。

编辑。使用自定义库示例(选项B)更新了答案

库解决方案使Robot文件更加整洁,因为复杂性转移到了Python端。

选项A。

使用机器人框架测试变量。

*** 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