混合库API
顾名思义, 混合库API是介于静态API和动态API之间的混合. 和动态API一样, 混合API只能以类的方式实现.
获取关键字名称
关键字的名称获取和动态API一样. 库需要有 get_keyword_names
或 getKeywordNames
方法来返回关键字名称的列表.
运行关键字
混合API中没有用来执行关键字的 run_keyword
方法. Robot Framework利用反射来查找实现关键字的方法, 这一点和静态API类似.
使用混合API实现的库可以自己直接实现这些方法, 也可以动态的处理(更重要).
使用Python时, 可以很简单的使用 getattr
来动态处理找不到的方法. 对于大多数Python程序员来说, 这个特殊方法应该很熟悉了, 所以也应该能立即明白下面的示例. 如果还不太明白的人, 可以先参考 Python Reference Manual.
- from somewhere import external_keyword
- class HybridExample:
- def get_keyword_names(self):
- return ['my_keyword', 'external_keyword']
- def my_keyword(self, arg):
- print "My Keyword called with '%s'" % arg
- def __getattr__(self, name):
- if name == 'external_keyword':
- return external_keyword
- raise AttributeError("Non-existing attribute '%s'" % name)
注意到 getattr
并不像动态库中的 run_keyword
那样实际执行这个关键字, 它只是返回一个可调用的对象, 最终这个对象被Robot Framework调用执行.
另一点需要注意的是, Robot Framework将使用 get_keyword_names
返回的名称来查找方法. 也就是说实际的方法名必须和返回的方法名称一致. 例如, 上面的例子中, 如果 get_keyword_names
返回的是 My Keyword
而不是 my_keyword
的话, 最终执行结果会是找不到相应的方法.
混合API对Java来说没太大作用, 因为Java没有办法动态处理找不到的方法. 当然, 可以在库的类中实现所有的方法, 但是那样就跟静态API相比没什么优势了.
获取关键字参数和文档
当使用混合API时, Robot Framework 使用反射来查找实现关键字的方法, 这一点和静态API类似. 当找到方法的引用后, 也可以像静态API一样直接查找该方法的参数定义和文档. 所以, 就没必要和动态API那样存在另外的特殊方法.
总结
当使用Python来开发测试库时, 混合API和动态API一样拥有动态的能力. 同时一个巨大的好处是无需要使用特殊方法来获取参数和文档.将真正动态的关键字交由 getattr
处理, 而将其它的都直接在主类中实现, 是一种很实用的做法.
由于这种显而易见的好处, 以及同等的能力, 在使用Python开发时, 混合API在大多数情况下是相对动态API的更好的选择. 一个值得提醒的特例是要实现一个代理库的情况, 由于真正的关键字必须要在其它地方被执行, 所以代理库只能向前传递关键字名和参数, 也就只能通过动态库来实现.
Robot Framework自带的 Telnet_ 库就是一个使用混合API的很好的例子.