在 运行 测试套件上动态创建机器人框架测试用例
create robot framework Test Case dynamically on running test suite
我有一个非常具体的场景,我将一些数据插入数据库(例如,假设 3 个插入,每个插入 returns 一些 ID)并基于 return 值 我想为那些 return 值创建动态测试用例
例如
*** 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
我试图通过参考 robot API documentation 来弄清楚如何做到这一点,但没有成功。
如果可行的话,请 tell/advise 好吗?如果可行,我该如何实现。
到目前为止,我发现可能有两种方法可以做到这一点:
- 通过创建监听器
- 通过创建自己的关键字
在这两种情况下,我都必须将逻辑放在那里,但不知道如何即时创建测试用例。
请帮助? :)
P.S。一些例子非常受欢迎。提前致谢
有博客 post 为您解答:
https://gerg.dev/2018/09/dynamically-create-test-cases-with-robot-framework/
正如您所建议的那样,解决方案是创建一个侦听器,以便您可以动态添加测试。请仔细阅读 post,因为有一些限制,例如何时可以和不能创建测试(在执行过程中)。
此外,post 用于 3.x 框架,而对于 4.x,您需要对 class 进行微小的更改,方法是替换:
tc.keywords.create(名称=kwname, args=args)
和:
tc.body.create_keyword(名称=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 我 post 编辑的基本副本 + 更改后的行):
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}
我有一个非常具体的场景,我将一些数据插入数据库(例如,假设 3 个插入,每个插入 returns 一些 ID)并基于 return 值 我想为那些 return 值创建动态测试用例 例如
*** 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
我试图通过参考 robot API documentation 来弄清楚如何做到这一点,但没有成功。
如果可行的话,请 tell/advise 好吗?如果可行,我该如何实现。
到目前为止,我发现可能有两种方法可以做到这一点:
- 通过创建监听器
- 通过创建自己的关键字
在这两种情况下,我都必须将逻辑放在那里,但不知道如何即时创建测试用例。
请帮助? :)
P.S。一些例子非常受欢迎。提前致谢
有博客 post 为您解答: https://gerg.dev/2018/09/dynamically-create-test-cases-with-robot-framework/
正如您所建议的那样,解决方案是创建一个侦听器,以便您可以动态添加测试。请仔细阅读 post,因为有一些限制,例如何时可以和不能创建测试(在执行过程中)。 此外,post 用于 3.x 框架,而对于 4.x,您需要对 class 进行微小的更改,方法是替换: tc.keywords.create(名称=kwname, args=args) 和: tc.body.create_keyword(名称=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 我 post 编辑的基本副本 + 更改后的行):
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}