== Custom Library 2==
修改demo.robot如下:
*** Settings ***
Documentation Example test cases using the keyword-driven testing approach.
Resource pub.txt
Library Collections
Library mylib.py
Library yourLib.py init_data
......
......
Sixth Case
[Documentation] custome keyword
${sign} gen_sign @{list1}
Log to console ${sign}
${members} add member ${var1}
Log to console ${members}
${members} add member LLisisi
Log to console ${members}
执行robot -t "Sixth Case" demo.robot
可以看到引入library时传入的参数,通过该类的__init__方法传到了实例变量中members中。
Library的作用域
之前有提到过,*** Settings ***表中关于测试流程的关键字,Suite Setup,Suite Teardown,Test Setup,Test Teardown,和xUnit框架中setUp和TearDown作用相同,就是在测试套件和测试用例的之前和之后执行一个关键字。修改demo.robot:
*** Settings *** Documentation Example test cases using the keyword-driven testing approach. Suite Setup add member suite_data Test Setup add member test_data Resource pub.txt Library Collections Library mylib.py Library yourLib.py init_data ...... ......
robot -t "Sixth Case" -t "Seventh Case" demo.robot执行两条case结果Sixth Case [Documentation] custome keyword ${sign} gen_sign @{list1} Log to console ${sign} ${members} add member ${var1} Log to console ${members} Seventh Case ${members} add member LLisisi Log to console ${members}
RF默认每条case实例化一个Library,为了case之间保持相对独立避免干扰,所以打印的结果中可以看到,实例化时加入的“init_data”,Test Setup中加入的“test_data”,和case执行过程中加入的“value”或“LLisisi”,而Suite Setup中的数据并没有打印,因为suite中操作的是另外一个实例。像我们例子中这样需要在Suite Setup中与case中使用同一个实例,就需要改变Library的作用域。在yourLib中设ROBOT_LIBRARY_SCOPE
的值,支持三个参数:
TEST CASE
:每条case创建一个新的实例,suite setup和 suite teardown使用一个实例。
TEST SUITE
:每个测试套件创建一个新的实例。
GLOBAL
:每次测试执行该Library创建一个实例。
再次执行结果如下:class yourLib(object): ROBOT_LIBRARY_SCOPE = 'TEST SUITE' def __init__(self, member=None): self.members = [member] if member else [] def add_member(self, name): self.members.append(name) return self.members
看到Sixth Case的结果中有suite_data了,同时也应注意因为所有的case公用一个实例,SeventhCase再次调用yourLib的时候,会受到之前case的影响。使用时要注意配置Test Teardown消除case之间的干扰。