扩展已有的测试库

本章将介绍几种不同的方法来为已有的测试库添加新功能, 以及在自己的库中使用它们, 已有的测试库可以是第三方发布的, 也可以是自己开发的.

修改原始源代码

如果可以直接访问要扩展的测试库的源代码, 直接修改源码是很自然的选择. 该方法的最大问题是, 如果原库代码有升级, 会很难保证不影响到修改的地方. 对于用户来说, 使用相对原库包含了不同功能的测试库, 也容易造成混乱. 同时, 重新打包该库也可能会是个艰巨的任务.

如果改动和增强是通用的, 并且计划提交给原库的开发者, 那么这种方式会是很好的选择. 如果你的改动被接受了, 并且会包含在未来发布的新版本中, 则上面讨论的所有问题都不存在了. 如果这种改动不那么通用, 或者因为其它原因不能提交, 则使用下面章节中的方法可能会更好.

使用继承

另一个直接的方式是使用继承来扩展已有库. 该方式由下面的例子说明, 为 SeleniumLibrary_ 添加新的关键字 Title Should Start With. 本例中使用Python, 但是同样适用于使用Java代码扩展Java开发的库.

  1. from SeleniumLibrary import SeleniumLibrary
  2.  
  3. class ExtendedSeleniumLibrary(SeleniumLibrary):
  4.  
  5. def title_should_start_with(self, expected):
  6. title = self.get_title()
  7. if not title.startswith(expected):
  8. raise AssertionError("Title '%s' did not start with '%s'"
  9. % (title, expected))

相较于直接修改原库代码, 这种方式最大的不同在于, 修改后的新的测试库有一个新的名字. 这样就清晰的告诉别人这是一个自定义的库. 但是一个大问题是, 这两个库将很难同时使用. 首先这两个库的同名关键字会产生 冲突, 另外, 这两个库没有共享状态.

如果你想要从头使用一个新的测试库并且添加自定义的扩展, 整个替换掉原来的库, 这种方式是个不错的选择. 否则, 请继续参考其它章节介绍的方法.

直接使用其它库

因为测试库本质上无非就是类或者模块, 一个简单的方式就是引入这个库, 直接调用其中的方法. 这种方式对于那些静态的且不依赖于库状态的方法很有用.前面使用了 Robot Framework内置库 的例子已经说明了如何使用这种方式.

如果这个库是有状态的, 那么事情可能会不如人意. 因为你的代码中使用的这个库的实例, 和框架使用的并不完全一样, 通过执行关键字产生的状态变化在你的库中是不可见的.下一节内容说明了如何获取和框架使用的相同的库实例.

从框架获取活动的库实例

内置关键字 Get Library Instance 可以用来获取当前活动的测试库的实例. 该关键字返回的实例与框架自己使用的实例完全一样, 这样就没有状态不一致的问题.

虽然该功能可通过关键字使用, 但是更典型的用法是在测试库中直接import BuiltIn 类来使用, 就像 前面提到的那样.

下面的例子演示了如何用该方法实现 使用继承 例子中实现的关键字 Title Should Start With.

  1. from robot.libraries.BuiltIn import BuiltIn
  2.  
  3. def title_should_start_with(expected):
  4. seleniumlib = BuiltIn().get_library_instance('SeleniumLibrary')
  5. title = seleniumlib.get_title()
  6. if not title.startswith(expected):
  7. raise AssertionError("Title '%s' did not start with '%s'"
  8. % (title, expected))

当测试库是有状态的, 这种方式显然比直接引入后使用更好. 相比继承的方式, 最大的好处是可以正常的使用原库, 新的库作为扩展只在需要的时候再用.

下面的例子就是将上例中的代码通过新库 SeLibExtensions 提供使用.

  1. *** Settings ***
  2. Library SeleniumLibrary
  3. Library SeLibExtensions
  4.  
  5. *** Test Cases ***
  6. Example
  7. Open Browser http://example # SeleniumLibrary
  8. Title Should Start With Example # SeLibExtensions

扩展使用动态或混合API的库

使用了 动态API 或者 混合库API 的测试库往往都有自己的扩展方式. 想要扩展这些库, 需要咨询库的开发者或者参考库文档或者源代码.