问题描述
我们正在使用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