四 Extending Robot Framework
4.1 Creating test libraries
RF的测试能力由测试库支持决定,已经有许多的测试库,有一些随着RF框架安装,但是更多的需要创建新的库来支持。RF提供了API来支持个人用户自建库。
4.1.1 Introduction
RF使用Python语言写成的,所以支持使用python写的库,当使用jython运行RF的时候,可以使用java来写库,如果是由纯python写的代码可以在python和jython环境下运行。使用python的时候也可以通过python c api使用C语言写的库,使用ctypes模块来完成python库和C代码的交互。也可以将外部脚本和工具作为独立进程运行。
创建库的指导文档:http://code.google.com/p/robotframework/wiki/PythonTutorial
Different test library APIs:
RF 支持三种不同的API,所有的API是以静态API为基础:
Static API:最简单的就是使用python模块中的方法直接映射为关键字,关键字和该方法有相同的参数。关键字通过Return关键字返回日志和异常输出失败信息。
Dynamic API:
Hybrid API:
4.1.2 Creating test library class or module
测试库可以是一个python模块也可以是python和java类。
Test library names
测试库的名称就是在导入库的时候使用的名称,例如一个MyLibrary.py的文件创建一个名称为MyLibrary的库。python的类包含在模块中,如果python中class的名称和module的名称一样,例如Mylib.py中定义一个Mylib的类,import Mylib包之后则可以直接使用Mylib来使用该类,如果名称不同则必须使用模块名和类名来调用类如Mylib.Myclass.其中python语言的库支持接收参数,且可以使用变量。
*** Settings *** Library MyLibrary 10.0.0.1 8080 Library AnotherLib ${VAR}
上面的第一个是python模块,第二个是java,其对应的定义如下:
from example import Connection class MyLibrary: def __init__(self, host, port=80): self._conn = Connection(host, int(port)) def send_message(self, message): self._conn.send(message)
public class AnotherLib { private String setting = null; public AnotherLib(String setting) { setting = setting; } public void doSomething() { if setting.equals("42") { // do something ... } } }
Test library scope
库文件作为类有一个内部状态,这个状态可以由关键字和参数来修改。由于该状态可能会影响关键字的运行动作,所以需要确定不会多个用例之间不会意外影响。这种相互影响的存在可能导致一些很难debug的问题。
RF默认对每一个用例都在调用库时候创建独立的实例来努力保证用例的相互独立,但是这并不能全部适合,因为有时候用例之间需要共享一些状态。
mark