在运行测试套件时动态创建robot框架测试用例



我得到了一个非常具体的场景,在这个场景中,我将向数据库中插入一些数据(例如,假设3个插入,每个插入都返回一些ID(,并根据返回值为这些返回值创建动态测试用例例如

*** Variables ***
@{result}    ${EMPTY}
*** Test Cases ***
Some dummy sql inserts
${result}    Insert sql statements    dt1    dt2    dt3 #e.g. return ['123', '456', '789']
Verify some ids
# NOPE, sorry i can't use [Template] because each iteration is not marked on a report as a "TEST" but as a "VAR"
Verify if ids exist somewhere ${result} #This keyword execution should create another 3 test cases, one for each item from ${result} list
*** Keywords ***
Insert sql statement
[Arguments]    @{data}
Create List    ${result}
FOR    ${elem}    IN    @{data}
${return_id}    SomeLib.Execute SQL    INSERT INTO some_table(some_id) VALUES (${elem})
Append To List    ${result}    ${return_id}
END
[Return]    ${result}
Verify if ids exist somewhere
[Arguments]    ${some_list_of_ids}
FOR    ${id}    IN    @{some_list_of_ids}
So some stuff on ${id}
END

我试图通过重新提交机器人API文档来找出如何做到这一点,但没有成功。你能告诉我/建议一下这是否可行吗?如果可行,我该如何实现
到目前为止,我已经发现可能有两种方法可以做到这一点:

  1. 通过创建侦听器
  2. 通过创建自己的关键字

在这两种情况下,我都必须将逻辑放在那里,但无法快速创建测试用例
请帮忙?:(

附言:有些例子非常受欢迎。提前感谢

有一篇博客文章为您提供了答案:https://gerg.dev/2018/09/dynamically-create-test-cases-with-robot-framework/

正如您所建议的,解决方案是创建一个侦听器,以便可以动态添加测试。只需仔细阅读这篇文章,因为当你可以和不能创建测试(在执行过程中(时,会有一些限制。此外,这篇文章是针对3.x框架和4.x的,您需要在类中进行微小的更改,替换:tc.keywords.create(name=kwname,args=args(与:tc.body.create_keyword(name=kwname,args=args(。

如何实现的示例:

demo.robot:

*** Settings ***
Library           DynamicTestCases.py
*** Test Cases ***
Create Dynamic Test Cases
@{TestNamesList}    Create List    "Test 1"    "Test 2"    "Test 3"
FOR    ${element}    IN    @{TestNamesList}
Add Test Case    ${element}   Keyword To Execute
END
*** Keywords ***
Keyword To Execute
Log    This is executed for each test!

DynamicTestCases.py内容(我发布的url的基本副本+更改的行(:

from __future__ import print_function
from robot.running.model import TestSuite

class DynamicTestCases(object):
ROBOT_LISTENER_API_VERSION = 3
ROBOT_LIBRARY_SCOPE = 'TEST SUITE'
def __init__(self):
self.ROBOT_LIBRARY_LISTENER = self
self.current_suite = None
def _start_suite(self, suite, result):
# save current suite so that we can modify it later
self.current_suite = suite
def add_test_case(self, name, kwname, *args):
"""Adds a test case to the current suite
'name' is the test case name
'kwname' is the keyword to call
'*args' are the arguments to pass to the keyword
Example:
add_test_case  Example Test Case  
...  log  hello, world  WARN
"""
tc = self.current_suite.tests.create(name=name)
#tc.keywords.create(name=kwname, args=args) #deprecated in 4.0
tc.body.create_keyword(name=kwname, args=args)
# To get our class to load, the module needs to have a class
# with the same name of a module. This makes that happen:
globals()[__name__] = DynamicTestCases

这是一个如何使其工作的小例子。例如,如果你想给关键字一个变量,只需添加参数:

*** Settings ***
Library           DynamicTestCases.py
*** Test Cases ***
Create Dynamic Test Cases
@{TestNamesList}    Create List    "Test 1"    "Test 2"    "Test 3"
FOR    ${element}    IN    @{TestNamesList}
Add Test Case    ${element}   Keyword To Execute    ${element}
END
*** Keywords ***
Keyword To Execute
[Arguments]    ${variable}
Log    The variable sent to the test was: ${variable}

最新更新